summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaExpr.cpp
diff options
context:
space:
mode:
authorNeil Hickey <neil.hickey@arm.com>2016-09-16 10:15:06 +0000
committerNeil Hickey <neil.hickey@arm.com>2016-09-16 10:15:06 +0000
commitddfb093b72dd7ba2dbefea73bfb89e98ed70643d (patch)
tree0221bc9745db50f72c119c14c01e49ca2bf4fe2f /clang/lib/Sema/SemaExpr.cpp
parentd7f2a35cac9bded28180dab6394b052983d23dab (diff)
downloadbcm5719-llvm-ddfb093b72dd7ba2dbefea73bfb89e98ed70643d.tar.gz
bcm5719-llvm-ddfb093b72dd7ba2dbefea73bfb89e98ed70643d.zip
Improve handling of floating point literals in OpenCL to only use double precision if the target supports fp64
https://reviews.llvm.org/D24235 llvm-svn: 281714
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
-rw-r--r--clang/lib/Sema/SemaExpr.cpp22
1 files changed, 19 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 72a35866ad6..53cd35c613e 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -828,8 +828,18 @@ ExprResult Sema::DefaultArgumentPromotion(Expr *E) {
// double.
const BuiltinType *BTy = Ty->getAs<BuiltinType>();
if (BTy && (BTy->getKind() == BuiltinType::Half ||
- BTy->getKind() == BuiltinType::Float))
- E = ImpCastExprToType(E, Context.DoubleTy, CK_FloatingCast).get();
+ BTy->getKind() == BuiltinType::Float)) {
+ if (getLangOpts().OpenCL &&
+ !((getLangOpts().OpenCLVersion >= 120 &&
+ Context.getTargetInfo()
+ .getSupportedOpenCLOpts()
+ .cl_khr_fp64) ||
+ getOpenCLOptions().cl_khr_fp64)) {
+ E = ImpCastExprToType(E, Context.FloatTy, CK_FloatingCast).get();
+ } else {
+ E = ImpCastExprToType(E, Context.DoubleTy, CK_FloatingCast).get();
+ }
+ }
// C++ performs lvalue-to-rvalue conversion as a default argument
// promotion, even on class types, but note:
@@ -3406,8 +3416,14 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) {
if (getLangOpts().SinglePrecisionConstants) {
Res = ImpCastExprToType(Res, Context.FloatTy, CK_FloatingCast).get();
} else if (getLangOpts().OpenCL &&
- !((getLangOpts().OpenCLVersion >= 120) ||
+ !((getLangOpts().OpenCLVersion >= 120 &&
+ Context.getTargetInfo()
+ .getSupportedOpenCLOpts()
+ .cl_khr_fp64) ||
getOpenCLOptions().cl_khr_fp64)) {
+ // Impose single-precision float type when:
+ // - in CL 1.2 or above and cl_khr_fp64 is not supported, or
+ // - in CL 1.1 or below and cl_khr_fp64 is not enabled.
Diag(Tok.getLocation(), diag::warn_double_const_requires_fp64);
Res = ImpCastExprToType(Res, Context.FloatTy, CK_FloatingCast).get();
}
OpenPOWER on IntegriCloud