Merged to 8.0 in r352547.
On Tue, Jan 29, 2019 at 3:49 PM Matt Arsenault via cfe-commits <cfe-commits@lists.llvm.org> wrote: > > Author: arsenm > Date: Tue Jan 29 12:49:47 2019 > New Revision: 352539 > > URL: http://llvm.org/viewvc/llvm-project?rev=352539&view=rev > Log: > Revert "OpenCL: Extend argument promotion rules to vector types" > > This reverts r348083. This was based on a misreading of the spec > for printf specifiers. > > Also revert r343653, as without a subsequent patch, a correctly > specified format for a vector will incorrectly warn. > > Fixes bug 40491. > > Modified: > cfe/trunk/lib/Headers/opencl-c.h > cfe/trunk/lib/Sema/SemaExpr.cpp > cfe/trunk/test/CodeGenOpenCL/printf.cl > cfe/trunk/test/SemaOpenCL/printf-format-string-warnings.cl > cfe/trunk/test/SemaOpenCL/printf-format-strings.cl > > Modified: cfe/trunk/lib/Headers/opencl-c.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/opencl-c.h?rev=352539&r1=352538&r2=352539&view=diff > ============================================================================== > --- cfe/trunk/lib/Headers/opencl-c.h (original) > +++ cfe/trunk/lib/Headers/opencl-c.h Tue Jan 29 12:49:47 2019 > @@ -14469,7 +14469,7 @@ half16 __ovld __cnfn shuffle2(half16 x, > #if __OPENCL_C_VERSION__ >= CL_VERSION_1_2 > // OpenCL v1.2 s6.12.13, v2.0 s6.13.13 - printf > > -int printf(__constant const char* st, ...) __attribute__((format(printf, 1, > 2))); > +int printf(__constant const char* st, ...); > #endif > > // OpenCL v1.1 s6.11.3, v1.2 s6.12.14, v2.0 s6.13.14 - Image Read and Write > Functions > > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=352539&r1=352538&r2=352539&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Jan 29 12:49:47 2019 > @@ -737,33 +737,20 @@ ExprResult Sema::DefaultArgumentPromotio > return ExprError(); > E = Res.get(); > > - QualType ScalarTy = Ty; > - unsigned NumElts = 0; > - if (const ExtVectorType *VecTy = Ty->getAs<ExtVectorType>()) { > - NumElts = VecTy->getNumElements(); > - ScalarTy = VecTy->getElementType(); > - } > - > // If this is a 'float' or '__fp16' (CVR qualified or typedef) > // promote to double. > // Note that default argument promotion applies only to float (and > // half/fp16); it does not apply to _Float16. > - const BuiltinType *BTy = ScalarTy->getAs<BuiltinType>(); > + const BuiltinType *BTy = Ty->getAs<BuiltinType>(); > if (BTy && (BTy->getKind() == BuiltinType::Half || > BTy->getKind() == BuiltinType::Float)) { > if (getLangOpts().OpenCL && > !getOpenCLOptions().isEnabled("cl_khr_fp64")) { > - if (BTy->getKind() == BuiltinType::Half) { > - QualType Ty = Context.FloatTy; > - if (NumElts != 0) > - Ty = Context.getExtVectorType(Ty, NumElts); > - E = ImpCastExprToType(E, Ty, CK_FloatingCast).get(); > - } > + if (BTy->getKind() == BuiltinType::Half) { > + E = ImpCastExprToType(E, Context.FloatTy, CK_FloatingCast).get(); > + } > } else { > - QualType Ty = Context.DoubleTy; > - if (NumElts != 0) > - Ty = Context.getExtVectorType(Ty, NumElts); > - E = ImpCastExprToType(E, Ty, CK_FloatingCast).get(); > + E = ImpCastExprToType(E, Context.DoubleTy, CK_FloatingCast).get(); > } > } > > > Modified: cfe/trunk/test/CodeGenOpenCL/printf.cl > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/printf.cl?rev=352539&r1=352538&r2=352539&view=diff > ============================================================================== > --- cfe/trunk/test/CodeGenOpenCL/printf.cl (original) > +++ cfe/trunk/test/CodeGenOpenCL/printf.cl Tue Jan 29 12:49:47 2019 > @@ -12,28 +12,26 @@ int printf(__constant const char* st, .. > > > // ALL-LABEL: @test_printf_float2( > -// FP64: %conv = fpext <2 x float> %0 to <2 x double> > -// FP64: %call = call spir_func i32 (i8 addrspace(2)*, ...) @printf(i8 > addrspace(2)* getelementptr inbounds ([5 x i8], [5 x i8] addrspace(2)* @.str, > i32 0, i32 0), <2 x double> %conv) > +// FP64: %call = call spir_func i32 (i8 addrspace(2)*, ...) @printf(i8 > addrspace(2)* getelementptr inbounds ([7 x i8], [7 x i8] addrspace(2)* @.str, > i32 0, i32 0), <2 x float> %0) > > -// NOFP64: call spir_func i32 (i8 addrspace(2)*, ...) @printf(i8 > addrspace(2)* getelementptr inbounds ([5 x i8], [5 x i8] addrspace(2)* @.str, > i32 0, i32 0), <2 x float> %0) > + > +// NOFP64: call spir_func i32 (i8 addrspace(2)*, ...) @printf(i8 > addrspace(2)* getelementptr inbounds ([7 x i8], [7 x i8] addrspace(2)* @.str, > i32 0, i32 0), <2 x float> %0) > kernel void test_printf_float2(float2 arg) { > - printf("%v2f", arg); > + printf("%v2hlf", arg); > } > > // ALL-LABEL: @test_printf_half2( > -// FP64: %conv = fpext <2 x half> %0 to <2 x double> > -// FP64: %call = call spir_func i32 (i8 addrspace(2)*, ...) @printf(i8 > addrspace(2)* getelementptr inbounds ([5 x i8], [5 x i8] addrspace(2)* @.str, > i32 0, i32 0), <2 x double> %conv) #2 > +// FP64: %call = call spir_func i32 (i8 addrspace(2)*, ...) @printf(i8 > addrspace(2)* getelementptr inbounds ([6 x i8], [6 x i8] addrspace(2)* > @.str.1, i32 0, i32 0), <2 x half> %0) > > -// NOFP64: %conv = fpext <2 x half> %0 to <2 x float> > -// NOFP64: %call = call spir_func i32 (i8 addrspace(2)*, ...) @printf(i8 > addrspace(2)* getelementptr inbounds ([5 x i8], [5 x i8] addrspace(2)* @.str, > i32 0, i32 0), <2 x float> %conv) #2 > +// NOFP64: %call = call spir_func i32 (i8 addrspace(2)*, ...) @printf(i8 > addrspace(2)* getelementptr inbounds ([6 x i8], [6 x i8] addrspace(2)* > @.str.1, i32 0, i32 0), <2 x half> %0) > kernel void test_printf_half2(half2 arg) { > - printf("%v2f", arg); > + printf("%v2hf", arg); > } > > #ifdef cl_khr_fp64 > // FP64-LABEL: @test_printf_double2( > -// FP64: call spir_func i32 (i8 addrspace(2)*, ...) @printf(i8 addrspace(2)* > getelementptr inbounds ([5 x i8], [5 x i8] addrspace(2)* @.str, i32 0, i32 > 0), <2 x double> %0) #2 > +// FP64: call spir_func i32 (i8 addrspace(2)*, ...) @printf(i8 addrspace(2)* > getelementptr inbounds ([6 x i8], [6 x i8] addrspace(2)* @.str.2, i32 0, i32 > 0), <2 x double> %0) > kernel void test_printf_double2(double2 arg) { > - printf("%v2f", arg); > + printf("%v2lf", arg); > } > #endif > > Modified: cfe/trunk/test/SemaOpenCL/printf-format-string-warnings.cl > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCL/printf-format-string-warnings.cl?rev=352539&r1=352538&r2=352539&view=diff > ============================================================================== > --- cfe/trunk/test/SemaOpenCL/printf-format-string-warnings.cl (original) > +++ cfe/trunk/test/SemaOpenCL/printf-format-string-warnings.cl Tue Jan 29 > 12:49:47 2019 > @@ -1,13 +1,14 @@ > // RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -cl-std=CL2.0 > -finclude-default-header > > -// Make sure warnings are produced based on printf format strings. > +// FIXME: Make sure warnings are produced based on printf format strings. > > +// expected-no-diagnostics > > kernel void format_string_warnings(__constant char* arg) { > > - printf("%d", arg); // expected-warning {{format specifies type 'int' but > the argument has type '__constant char *'}} > + printf("%d", arg); > > - printf("not enough arguments %d %d", 4); // expected-warning {{more '%' > conversions than data arguments}} > + printf("not enough arguments %d %d", 4); > > - printf("too many arguments", 4); // expected-warning {{data argument not > used by format string}} > + printf("too many arguments", 4); > } > > Modified: cfe/trunk/test/SemaOpenCL/printf-format-strings.cl > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCL/printf-format-strings.cl?rev=352539&r1=352538&r2=352539&view=diff > ============================================================================== > --- cfe/trunk/test/SemaOpenCL/printf-format-strings.cl (original) > +++ cfe/trunk/test/SemaOpenCL/printf-format-strings.cl Tue Jan 29 12:49:47 > 2019 > @@ -13,10 +13,10 @@ int printf(__constant const char* st, .. > kernel void format_v4f32(float4 arg) > { > #ifdef cl_khr_fp64 > - printf("%v4f\n", arg); > + printf("%v4f\n", arg); // expected-warning{{format specifies type > 'double __attribute__((ext_vector_type(4)))' but the argument has type > 'float4' (vector of 4 'float' values)}} > > // Precision modifier > - printf("%.2v4f\n", arg); > + printf("%.2v4f\n", arg); // expected-warning{{format specifies type > 'double __attribute__((ext_vector_type(4)))' but the argument has type > 'float4' (vector of 4 'float' values)}} > #else > // FIXME: These should not warn, and the type should be expected to be > float. > printf("%v4f\n", arg); // expected-warning {{double > __attribute__((ext_vector_type(4)))' but the argument has type 'float4' > (vector of 4 'float' values)}} > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits