Skip to content

Commit

Permalink
Fix OpenCL 1.2 double as an optional core feature behaviour
Browse files Browse the repository at this point in the history
In OpenCL 1.2, using double no longer requires using the pragma cl_khr_fp64,
instead a kernel is allowed to use double, but must first have queried
clGetDeviceInfo's CL_DEVICE_DOUBLE_FP_CONFIG.

Page 197, section 6.1.1 of the OpenCL 1.2 specification has a footnote 23
describing this behaviour.

I've also added test cases such that the pragma must be used if targeting
OpenCL 1.0 or 1.1, but is ignored in 1.2 and 2.0.

Patch by Neil Henning!

Reviewers: Pekka Jääskeläinen

Differential Revision: http://reviews.llvm.org/D7245

llvm-svn: 227565
  • Loading branch information
frasercrmck committed Jan 30, 2015
1 parent 9469a59 commit cc6e894
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 2 deletions.
4 changes: 3 additions & 1 deletion clang/lib/Sema/SemaExpr.cpp
Expand Up @@ -3266,7 +3266,9 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) {
if (Ty == Context.DoubleTy) {
if (getLangOpts().SinglePrecisionConstants) {
Res = ImpCastExprToType(Res, Context.FloatTy, CK_FloatingCast).get();
} else if (getLangOpts().OpenCL && !getOpenCLOptions().cl_khr_fp64) {
} else if (getLangOpts().OpenCL &&
!((getLangOpts().OpenCLVersion >= 120) ||
getOpenCLOptions().cl_khr_fp64)) {
Diag(Tok.getLocation(), diag::warn_double_const_requires_fp64);
Res = ImpCastExprToType(Res, Context.FloatTy, CK_FloatingCast).get();
}
Expand Down
4 changes: 3 additions & 1 deletion clang/lib/Sema/SemaType.cpp
Expand Up @@ -868,7 +868,9 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) {
else
Result = Context.DoubleTy;

if (S.getLangOpts().OpenCL && !S.getOpenCLOptions().cl_khr_fp64) {
if (S.getLangOpts().OpenCL &&
!((S.getLangOpts().OpenCLVersion >= 120) ||
S.getOpenCLOptions().cl_khr_fp64)) {
S.Diag(DS.getTypeSpecTypeLoc(), diag::err_double_requires_fp64);
declarator.setInvalidType(true);
}
Expand Down
19 changes: 19 additions & 0 deletions clang/test/SemaOpenCL/extension-fp64-cl1.1.cl
@@ -0,0 +1,19 @@
// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -cl-std=CL1.1

void f1(double da) { // expected-error {{type 'double' requires cl_khr_fp64 extension}}
double d; // expected-error {{type 'double' requires cl_khr_fp64 extension}}
(void) 1.0; // expected-warning {{double precision constant requires cl_khr_fp64}}
}

#pragma OPENCL EXTENSION cl_khr_fp64 : enable

void f2(void) {
double d;
(void) 1.0;
}

#pragma OPENCL EXTENSION cl_khr_fp64 : disable

void f3(void) {
double d; // expected-error {{type 'double' requires cl_khr_fp64 extension}}
}
20 changes: 20 additions & 0 deletions clang/test/SemaOpenCL/optional-core-fp64-cl1.2.cl
@@ -0,0 +1,20 @@
// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -cl-std=CL1.2
// expected-no-diagnostics

void f1(double da) {
double d;
(void) 1.0;
}

#pragma OPENCL EXTENSION cl_khr_fp64 : enable

void f2(void) {
double d;
(void) 1.0;
}

#pragma OPENCL EXTENSION cl_khr_fp64 : disable

void f3(void) {
double d;
}
20 changes: 20 additions & 0 deletions clang/test/SemaOpenCL/optional-core-fp64-cl2.0.cl
@@ -0,0 +1,20 @@
// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -cl-std=CL2.0
// expected-no-diagnostics

void f1(double da) {
double d;
(void) 1.0;
}

#pragma OPENCL EXTENSION cl_khr_fp64 : enable

void f2(void) {
double d;
(void) 1.0;
}

#pragma OPENCL EXTENSION cl_khr_fp64 : disable

void f3(void) {
double d;
}

0 comments on commit cc6e894

Please sign in to comment.