diff options
author | Neil Hickey <neil.hickey@arm.com> | 2016-09-16 10:15:06 +0000 |
---|---|---|
committer | Neil Hickey <neil.hickey@arm.com> | 2016-09-16 10:15:06 +0000 |
commit | ddfb093b72dd7ba2dbefea73bfb89e98ed70643d (patch) | |
tree | 0221bc9745db50f72c119c14c01e49ca2bf4fe2f /clang/lib/Sema/SemaExpr.cpp | |
parent | d7f2a35cac9bded28180dab6394b052983d23dab (diff) | |
download | bcm5719-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.cpp | 22 |
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(); } |