I looked into this, and for C, clang converts the literal to inf in the first case. OpenCL spec doesn't mention anything different so I presume the behaviour should match Cs behaviour, which is does with this change.
More exhaustive tests could be implemented to ensure this though. Neil > -----Original Message----- > From: sca...@apple.com [mailto:sca...@apple.com] > Sent: 15 November 2016 13:20 > To: Neil Hickey > Cc: cfe-commits@lists.llvm.org; nd > Subject: Re: r286815 - Improve handling of floating point literals in OpenCL > to > only use double precision if the target supports fp64. > > The reason these commits bring it up is that I don’t see it clearly documented > whether: > > float x = 340282356779733661637539395458142568447.0; > > is interpreted as > > float x = 340282356779733661637539395458142568447.0f; // x is > FLT_MAX > > or as > > float x = (float)(340282356779733661637539395458142568447.0); // x > is INFINITY > > when the no-fp64 mode is active. I assume that only one of these is the > correct behavior, and we should have a regression test that will flag the > error > if it changes. > > – Steve > > > On Nov 15, 2016, at 4:51 AM, Neil Hickey <neil.hic...@arm.com> wrote: > > > > It would be valuable to perform that test, if clang tests don't already do > this, though I'm not sure it should be part of this particular commit as all > this > commit should do is change the casts if the target doesn't support double. > > > > Neil > > > >> -----Original Message----- > >> From: sca...@apple.com [mailto:sca...@apple.com] > >> Sent: 14 November 2016 16:01 > >> To: Neil Hickey > >> Cc: cfe-commits@lists.llvm.org > >> Subject: Re: r286815 - Improve handling of floating point literals in > >> OpenCL to only use double precision if the target supports fp64. > >> > >> Can you add some non-trivial test cases that exercise > >> double-rounding, especially near the overflow boundary? > >> > >> e.g. What is the expected value of x if the target does not support fp64?: > >> > >> float x = 340282356779733661637539395458142568447.0; > >> > >> – Steve > >> > >>> On Nov 14, 2016, at 6:15 AM, Neil Hickey via cfe-commits <cfe- > >> comm...@lists.llvm.org> wrote: > >>> > >>> Author: neil.hickey > >>> Date: Mon Nov 14 05:15:51 2016 > >>> New Revision: 286815 > >>> > >>> URL: http://llvm.org/viewvc/llvm-project?rev=286815&view=rev > >>> Log: > >>> Improve handling of floating point literals in OpenCL to only use > >>> double > >> precision if the target supports fp64. > >>> > >>> This change makes sure single-precision floating point types are > >>> used if the > >>> cl_fp64 extension is not supported by the target. > >>> > >>> Also removed the check to see whether the OpenCL version is >= 1.2, > >>> as this has been incorporated into the extension setting code. > >>> > >>> Differential Revision: https://reviews.llvm.org/D24235 > >>> > >>> > >>> Modified: > >>> cfe/trunk/lib/Sema/SemaExpr.cpp > >>> cfe/trunk/lib/Sema/SemaType.cpp > >>> cfe/trunk/test/CodeGenOpenCL/fpmath.cl > >>> cfe/trunk/test/SemaOpenCL/extensions.cl > >>> > >>> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > >>> URL: > >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp? > >>> re v=286815&r1=286814&r2=286815&view=diff > >>> > >> > ========================================================== > >> ============ > >>> ======== > >>> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > >>> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Nov 14 05:15:51 2016 > >>> @@ -705,9 +705,13 @@ ExprResult Sema::DefaultLvalueConversion if > >>> (getLangOpts().ObjCAutoRefCount && > >>> E->getType().getObjCLifetime() == Qualifiers::OCL_Weak) > >>> Cleanup.setExprNeedsCleanups(true); > >>> + > >>> + ExprResult Res = E; > >>> > >>> - ExprResult Res = ImplicitCastExpr::Create(Context, T, > >> CK_LValueToRValue, E, > >>> - nullptr, VK_RValue); > >>> + if ( T != E->getType()) { > >>> + Res = ImplicitCastExpr::Create(Context, T, CK_LValueToRValue, E, > >>> + nullptr, VK_RValue); } > >>> > >>> // C11 6.3.2.1p2: > >>> // ... if the lvalue has atomic type, the value has the non-atomic > >>> version > >>> @@ -817,8 +821,16 @@ ExprResult Sema::DefaultArgumentPromotio // > >>> 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 && > >>> + !(getOpenCLOptions().cl_khr_fp64)) { > >>> + if (BTy->getKind() == BuiltinType::Half) { > >>> + 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: > >>> @@ -3397,10 +3409,13 @@ ExprResult Sema::ActOnNumericConstant(co > >>> > >>> if (Ty == Context.DoubleTy) { > >>> if (getLangOpts().SinglePrecisionConstants) { > >>> - Res = ImpCastExprToType(Res, Context.FloatTy, > >> CK_FloatingCast).get(); > >>> + const BuiltinType *BTy = Ty->getAs<BuiltinType>(); > >>> + if (BTy->getKind() != BuiltinType::Float) { > >>> + Res = ImpCastExprToType(Res, Context.FloatTy, > >> CK_FloatingCast).get(); > >>> + } > >>> } else if (getLangOpts().OpenCL && > >>> - !((getLangOpts().OpenCLVersion >= 120) || > >>> - getOpenCLOptions().cl_khr_fp64)) { > >>> + !(getOpenCLOptions().cl_khr_fp64)) { > >>> + // Impose single-precision float type when cl_khr_fp64 is not > enabled. > >>> Diag(Tok.getLocation(), diag::warn_double_const_requires_fp64); > >>> Res = ImpCastExprToType(Res, Context.FloatTy, > CK_FloatingCast).get(); > >>> } > >>> > >>> Modified: cfe/trunk/lib/Sema/SemaType.cpp > >>> URL: > >>> http://llvm.org/viewvc/llvm- > project/cfe/trunk/lib/Sema/SemaType.cpp? > >>> re v=286815&r1=286814&r2=286815&view=diff > >>> > >> > ========================================================== > >> ============ > >>> ======== > >>> --- cfe/trunk/lib/Sema/SemaType.cpp (original) > >>> +++ cfe/trunk/lib/Sema/SemaType.cpp Mon Nov 14 05:15:51 2016 > >>> @@ -1402,8 +1402,7 @@ static QualType ConvertDeclSpecToType(Ty > >>> Result = Context.DoubleTy; > >>> > >>> if (S.getLangOpts().OpenCL && > >>> - !((S.getLangOpts().OpenCLVersion >= 120) || > >>> - S.getOpenCLOptions().cl_khr_fp64)) { > >>> + !(S.getOpenCLOptions().cl_khr_fp64)) { > >>> S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_requires_extension) > >>> << Result << "cl_khr_fp64"; > >>> declarator.setInvalidType(true); > >>> > >>> Modified: cfe/trunk/test/CodeGenOpenCL/fpmath.cl > >>> URL: > >>> http://llvm.org/viewvc/llvm- > >> project/cfe/trunk/test/CodeGenOpenCL/fpmat > >>> h.cl?rev=286815&r1=286814&r2=286815&view=diff > >>> > >> > ========================================================== > >> ============ > >>> ======== > >>> --- cfe/trunk/test/CodeGenOpenCL/fpmath.cl (original) > >>> +++ cfe/trunk/test/CodeGenOpenCL/fpmath.cl Mon Nov 14 05:15:51 > 2016 > >>> @@ -1,5 +1,6 @@ > >>> // RUN: %clang_cc1 %s -emit-llvm -o - -triple spir-unknown-unknown | > >>> FileCheck --check-prefix=CHECK --check-prefix=NODIVOPT %s // RUN: > >>> %clang_cc1 %s -emit-llvm -o - -triple spir-unknown-unknown > >>> -cl-fp32-correctly-rounded-divide-sqrt | FileCheck > >>> --check-prefix=CHECK --check-prefix=DIVOPT %s > >>> +// RUN: %clang_cc1 %s -emit-llvm -o - -DNOFP64 -cl-std=CL1.1 > >>> +-triple r600-unknown-unknown -target-cpu r600 -pedantic | FileCheck > >>> +--check-prefix=CHECK-DBL %s > >>> > >>> typedef __attribute__(( ext_vector_type(4) )) float float4; > >>> > >>> @@ -21,14 +22,26 @@ float4 spvectordiv(float4 a, float4 b) { return > >>> a / b; } > >>> > >>> +void printf(constant char* fmt, ...); > >>> + > >>> +#ifndef NOFP64 > >>> #pragma OPENCL EXTENSION cl_khr_fp64 : enable > >>> +#endif > >>> +void testdbllit(long *val) { > >>> + // CHECK-DBL: float 2.000000e+01 > >>> + // CHECK: double 2.000000e+01 > >>> + printf("%f", 20.0); > >>> +} > >>> > >>> +#ifndef NOFP64 > >>> +#pragma OPENCL EXTENSION cl_khr_fp64 : enable > >>> double dpscalardiv(double a, double b) { // CHECK: @dpscalardiv // > >>> CHECK: #[[ATTR]] // CHECK-NOT: !fpmath return a / b; } > >>> +#endif > >>> > >>> // CHECK: attributes #[[ATTR]] = { > >>> // NODIVOPT: "correctly-rounded-divide-sqrt-fp-math"="false" > >>> > >>> Modified: cfe/trunk/test/SemaOpenCL/extensions.cl > >>> URL: > >>> http://llvm.org/viewvc/llvm- > >> project/cfe/trunk/test/SemaOpenCL/extensio > >>> ns.cl?rev=286815&r1=286814&r2=286815&view=diff > >>> > >> > ========================================================== > >> ============ > >>> ======== > >>> --- cfe/trunk/test/SemaOpenCL/extensions.cl (original) > >>> +++ cfe/trunk/test/SemaOpenCL/extensions.cl Mon Nov 14 05:15:51 > 2016 > >>> @@ -1,5 +1,6 @@ > >>> // RUN: %clang_cc1 %s -triple spir-unknown-unknown -verify -pedantic > >>> -fsyntax-only // RUN: %clang_cc1 %s -triple spir-unknown-unknown > >>> -verify -pedantic -fsyntax-only -cl-std=CL1.1 > >>> +// RUN: %clang_cc1 %s -triple spir-unknown-unknown -verify > >>> +-pedantic -fsyntax-only -cl-std=CL1.2 -DFP64 > >>> > >>> // Test with a target not supporting fp64. > >>> // RUN: %clang_cc1 %s -triple r600-unknown-unknown -target-cpu r600 > >>> -verify -pedantic -fsyntax-only -DNOFP64 -DNOFP16 @@ -21,12 +22,16 > >>> @@ // RUN: %clang_cc1 %s -triple spir-unknown-unknown -verify > >>> -pedantic -fsyntax-only -cl-ext=-all -cl-ext=+cl_khr_fp64 > >>> -cl-ext=+cl_khr_fp16 > >>> -cl-ext=-cl_khr_fp64 -DNOFP64 // RUN: %clang_cc1 %s -triple > >>> spir-unknown-unknown -verify -pedantic -fsyntax-only -cl-ext=-all > >>> -cl-ext=+cl_khr_fp64,-cl_khr_fp64,+cl_khr_fp16 -DNOFP64 > >>> > >>> +#ifdef FP64 > >>> +// expected-no-diagnostics > >>> +#endif > >>> > >>> - > >>> +#if __OPENCL_C_VERSION__ < 120 > >>> 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}} } > >>> +#endif > >>> > >>> #pragma OPENCL EXTENSION cl_khr_fp64 : enable #ifdef NOFP64 @@ - > >> 45,8 > >>> +50,9 @@ void f2(void) { #endif > >>> > >>> (void) 1.0; > >>> + > >>> #ifdef NOFP64 > >>> -// expected-warning@-2{{double precision constant requires > >>> cl_khr_fp64, casting to single precision}} > >>> +// expected-warning@-6{{double precision constant requires > >>> +cl_khr_fp64, casting to single precision}} > >>> #endif > >>> } > >>> > >>> @@ -55,6 +61,8 @@ void f2(void) { > >>> // expected-warning@-2{{unsupported OpenCL extension 'cl_khr_fp64' > - > >>> ignoring}} #endif > >>> > >>> +#if __OPENCL_C_VERSION__ < 120 > >>> void f3(void) { > >>> double d; // expected-error {{type 'double' requires cl_khr_fp64 > >>> extension}} } > >>> +#endif > >>> > >>> > >>> _______________________________________________ > >>> cfe-commits mailing list > >>> cfe-commits@lists.llvm.org > >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > > _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits