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