https://github.com/farzonl created https://github.com/llvm/llvm-project/pull/133441
- Add CustomTypeChecking to HLSL builtins that take float arguments - Add new builtin tests to confirm CustomTypeChecking doesn't promote scalar float arguments aren't promoted to double - fixes #133440 >From fc9102baa602b29979efdb82254dc7b33c55cd22 Mon Sep 17 00:00:00 2001 From: Farzon Lotfi <farzonlo...@microsoft.com> Date: Fri, 28 Mar 2025 08:50:42 -0400 Subject: [PATCH] [HLSL] add CustomTypeChecking to float builtins - Add CustomTypeChecking to HLSL builtins that take float arguments - Add new builtin tests to confirm CustomTypeChecking doesn't promote scalar float arguments aren't promoted to double - fixes #133440 --- clang/include/clang/Basic/Builtins.td | 22 +++++------ .../CodeGenHLSL/builtins/clamp-builtin.hlsl | 16 +++++--- .../CodeGenHLSL/builtins/clip-builtin.hlsl | 10 +++++ .../CodeGenHLSL/builtins/degrees-builtin.hlsl | 16 ++++++++ .../CodeGenHLSL/builtins/dot-builtin.hlsl | 39 ++++++++----------- .../CodeGenHLSL/builtins/frac-builtin.hlsl | 16 ++++++++ .../CodeGenHLSL/builtins/lerp-builtin.hlsl | 21 +++++----- .../builtins/normalize-builtin.hlsl | 16 ++++++++ .../CodeGenHLSL/builtins/radians-builtin.hlsl | 16 ++++++++ .../CodeGenHLSL/builtins/rcp-builtin.hlsl | 16 ++++++++ .../CodeGenHLSL/builtins/rsqrt-builtin.hlsl | 16 ++++++++ .../builtins/saturate-builtin.hlsl | 16 ++++++++ .../test/SemaHLSL/BuiltIns/clamp-errors.hlsl | 9 ++--- clang/test/SemaHLSL/BuiltIns/clip-errors.hlsl | 9 ++++- clang/test/SemaHLSL/BuiltIns/dot-errors.hlsl | 16 ++++++-- clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl | 11 ------ clang/test/SemaHLSL/BuiltIns/lerp-errors.hlsl | 25 +++--------- .../test/SemaHLSL/BuiltIns/rsqrt-errors.hlsl | 10 +---- 18 files changed, 199 insertions(+), 101 deletions(-) create mode 100644 clang/test/CodeGenHLSL/builtins/clip-builtin.hlsl create mode 100644 clang/test/CodeGenHLSL/builtins/degrees-builtin.hlsl create mode 100644 clang/test/CodeGenHLSL/builtins/frac-builtin.hlsl create mode 100644 clang/test/CodeGenHLSL/builtins/normalize-builtin.hlsl create mode 100644 clang/test/CodeGenHLSL/builtins/radians-builtin.hlsl create mode 100644 clang/test/CodeGenHLSL/builtins/rcp-builtin.hlsl create mode 100644 clang/test/CodeGenHLSL/builtins/rsqrt-builtin.hlsl create mode 100644 clang/test/CodeGenHLSL/builtins/saturate-builtin.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 72a5e495c4059..b2c7ddb43de55 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4869,7 +4869,7 @@ def HLSLWaveReadLaneAt : LangBuiltin<"HLSL_LANG"> { def HLSLClamp : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_elementwise_clamp"]; - let Attributes = [NoThrow, Const]; + let Attributes = [NoThrow, Const, CustomTypeChecking]; let Prototype = "void(...)"; } @@ -4881,13 +4881,13 @@ def HLSLCross: LangBuiltin<"HLSL_LANG"> { def HLSLDegrees : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_elementwise_degrees"]; - let Attributes = [NoThrow, Const]; + let Attributes = [NoThrow, Const, CustomTypeChecking]; let Prototype = "void(...)"; } def HLSLDotProduct : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_dot"]; - let Attributes = [NoThrow, Const]; + let Attributes = [NoThrow, Const, CustomTypeChecking]; let Prototype = "void(...)"; } @@ -4917,7 +4917,7 @@ def HLSLFirstBitLow : LangBuiltin<"HLSL_LANG"> { def HLSLFrac : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_elementwise_frac"]; - let Attributes = [NoThrow, Const]; + let Attributes = [NoThrow, Const, CustomTypeChecking]; let Prototype = "void(...)"; } @@ -4929,7 +4929,7 @@ def HLSLIsinf : LangBuiltin<"HLSL_LANG"> { def HLSLLerp : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_lerp"]; - let Attributes = [NoThrow, Const]; + let Attributes = [NoThrow, Const, CustomTypeChecking]; let Prototype = "void(...)"; } @@ -4941,25 +4941,25 @@ def HLSLMad : LangBuiltin<"HLSL_LANG"> { def HLSLNormalize : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_normalize"]; - let Attributes = [NoThrow, Const]; + let Attributes = [NoThrow, Const, CustomTypeChecking]; let Prototype = "void(...)"; } def HLSLRcp : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_elementwise_rcp"]; - let Attributes = [NoThrow, Const]; + let Attributes = [NoThrow, Const, CustomTypeChecking]; let Prototype = "void(...)"; } def HLSLRSqrt : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_elementwise_rsqrt"]; - let Attributes = [NoThrow, Const]; + let Attributes = [NoThrow, Const, CustomTypeChecking]; let Prototype = "void(...)"; } def HLSLSaturate : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_elementwise_saturate"]; - let Attributes = [NoThrow, Const]; + let Attributes = [NoThrow, Const, CustomTypeChecking]; let Prototype = "void(...)"; } @@ -4983,7 +4983,7 @@ def HLSLStep: LangBuiltin<"HLSL_LANG"> { def HLSLRadians : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_elementwise_radians"]; - let Attributes = [NoThrow, Const]; + let Attributes = [NoThrow, Const, CustomTypeChecking]; let Prototype = "void(...)"; } @@ -5001,7 +5001,7 @@ def HLSLSplitDouble: LangBuiltin<"HLSL_LANG"> { def HLSLClip: LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_elementwise_clip"]; - let Attributes = [NoThrow, Const]; + let Attributes = [NoThrow, Const, CustomTypeChecking]; let Prototype = "void(...)"; } diff --git a/clang/test/CodeGenHLSL/builtins/clamp-builtin.hlsl b/clang/test/CodeGenHLSL/builtins/clamp-builtin.hlsl index 62bada715a68a..356836b40e9c0 100644 --- a/clang/test/CodeGenHLSL/builtins/clamp-builtin.hlsl +++ b/clang/test/CodeGenHLSL/builtins/clamp-builtin.hlsl @@ -1,8 +1,12 @@ // RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -o - | FileCheck %s -// CHECK-LABEL: builtin_test_clamp_int4 -// CHECK: %hlsl.clamp = call <4 x i32> @llvm.dx.sclamp.v4i32(<4 x i32> %0, <4 x i32> %1, <4 x i32> %2) -// CHECK: ret <4 x i32> %hlsl.clamp -int4 builtin_test_clamp_int4(int4 p0, int4 p1, int4 p2) { - return __builtin_hlsl_elementwise_clamp(p0, p1, p2); -} + +// CHECK-LABEL: builtin_clamp_half +// CHECK: %hlsl.clamp = call reassoc nnan ninf nsz arcp afn half @llvm.dx.nclamp.f16(half %{{.*}}, half %{{.*}}, half %{{.*}}) +// CHECK: ret half %hlsl.clamp +half builtin_clamp_half(half p0) { return __builtin_hlsl_elementwise_clamp(p0, p0, p0); } + +// CHECK-LABEL: builtin_clamp_float +// CHECK: %hlsl.clamp = call reassoc nnan ninf nsz arcp afn float @llvm.dx.nclamp.f32(float %{{.*}}, float %{{.*}}, float %{{.*}}) +// CHECK: ret float %hlsl.clamp +float builtin_clamp_float(float p0) { return __builtin_hlsl_elementwise_clamp(p0, p0, p0); } diff --git a/clang/test/CodeGenHLSL/builtins/clip-builtin.hlsl b/clang/test/CodeGenHLSL/builtins/clip-builtin.hlsl new file mode 100644 index 0000000000000..c864f93af472b --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/clip-builtin.hlsl @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -o - | FileCheck %s + +// CHECK: define void @{{.*}}builtin_clip_float{{.*}}(float {{.*}} [[P0:%.*]]) +// CHECK: [[LOAD:%.*]] = load float, ptr [[P0]].addr, align 4 +// CHECK-NEXT: [[FCMP:%.*]] = fcmp reassoc nnan ninf nsz arcp afn olt float [[LOAD]], 0.000000e+00 +// CHECK-NO: call i1 @llvm.dx.any +// CHECK-NEXT: call void @llvm.dx.discard(i1 [[FCMP]]) +void builtin_clip_float (float p0) { + __builtin_hlsl_elementwise_clip(p0); +} diff --git a/clang/test/CodeGenHLSL/builtins/degrees-builtin.hlsl b/clang/test/CodeGenHLSL/builtins/degrees-builtin.hlsl new file mode 100644 index 0000000000000..2e639f5577d20 --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/degrees-builtin.hlsl @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -o - | FileCheck %s + + +// CHECK-LABEL: builtin_degrees_half +// CHECK: %hlsl.degrees = call reassoc nnan ninf nsz arcp afn half @llvm.dx.degrees.f16(half %{{.*}}) +// CHECK: ret half %hlsl.degrees +half builtin_degrees_half(half p0) { + return __builtin_hlsl_elementwise_degrees(p0); +} + +// CHECK-LABEL: builtin_degrees_float +// CHECK: %hlsl.degrees = call reassoc nnan ninf nsz arcp afn float @llvm.dx.degrees.f32(float %{{.*}}) +// CHECK: ret float %hlsl.degrees +float builtin_degrees_float (float p0) { + return __builtin_hlsl_elementwise_degrees(p0); +} diff --git a/clang/test/CodeGenHLSL/builtins/dot-builtin.hlsl b/clang/test/CodeGenHLSL/builtins/dot-builtin.hlsl index 36c73f875e944..716704a1bfdad 100644 --- a/clang/test/CodeGenHLSL/builtins/dot-builtin.hlsl +++ b/clang/test/CodeGenHLSL/builtins/dot-builtin.hlsl @@ -1,30 +1,23 @@ // RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -o - | FileCheck %s -// CHECK-LABEL: builtin_bool_to_float_type_promotion -// CHECK: %conv1 = uitofp i1 %loadedv to double -// CHECK: %hlsl.dot = fmul reassoc nnan ninf nsz arcp afn double %conv, %conv1 -// CHECK: %conv2 = fptrunc reassoc nnan ninf nsz arcp afn double %hlsl.dot to float -// CHECK: ret float %conv2 -float builtin_bool_to_float_type_promotion ( float p0, bool p1 ) { - return __builtin_hlsl_dot ( (double)p0, (double)p1 ); + +// CHECK-LABEL: builtin_dot_half +// CHECK: %hlsl.dot = fmul reassoc nnan ninf nsz arcp afn half %{{.*}}, %{{.*}} +// CHECK: ret half %hlsl.dot +half builtin_dot_half ( half p0, half p1 ) { + return __builtin_hlsl_dot (p0, p1 ); } -// CHECK-LABEL: builtin_bool_to_float_arg1_type_promotion -// CHECK: %conv = uitofp i1 %loadedv to double -// CHECK: %conv1 = fpext reassoc nnan ninf nsz arcp afn float %1 to double -// CHECK: %hlsl.dot = fmul reassoc nnan ninf nsz arcp afn double %conv, %conv1 -// CHECK: %conv2 = fptrunc reassoc nnan ninf nsz arcp afn double %hlsl.dot to float -// CHECK: ret float %conv2 -float builtin_bool_to_float_arg1_type_promotion ( bool p0, float p1 ) { - return __builtin_hlsl_dot ( (double)p0, (double)p1 ); +// CHECK-LABEL: builtin_dot_float +// CHECK: %hlsl.dot = fmul reassoc nnan ninf nsz arcp afn float %{{.*}}, %{{.*}} +// CHECK: ret float %hlsl.dot +float builtin_dot_float ( float p0, float p1 ) { + return __builtin_hlsl_dot (p0, p1 ); } -// CHECK-LABEL: builtin_dot_int_to_float_promotion -// CHECK: %conv = fpext reassoc nnan ninf nsz arcp afn float %0 to double -// CHECK: %conv1 = sitofp i32 %1 to double -// CHECK: dot = fmul reassoc nnan ninf nsz arcp afn double %conv, %conv1 -// CHECK: %conv2 = fptrunc reassoc nnan ninf nsz arcp afn double %hlsl.dot to float -// CHECK: ret float %conv2 -float builtin_dot_int_to_float_promotion ( float p0, int p1 ) { - return __builtin_hlsl_dot ( (double)p0, (double)p1 ); +// CHECK-LABEL: builtin_dot_double +// CHECK: %hlsl.dot = fmul reassoc nnan ninf nsz arcp afn double %{{.*}}, %{{.*}} +// CHECK: ret double %hlsl.dot +double builtin_dot_double( double p0, double p1 ) { + return __builtin_hlsl_dot (p0, p1 ); } diff --git a/clang/test/CodeGenHLSL/builtins/frac-builtin.hlsl b/clang/test/CodeGenHLSL/builtins/frac-builtin.hlsl new file mode 100644 index 0000000000000..9f144f470ed90 --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/frac-builtin.hlsl @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -o - | FileCheck %s + + +// CHECK-LABEL: builtin_frac_half +// CHECK: %hlsl.frac = call reassoc nnan ninf nsz arcp afn half @llvm.dx.frac.f16(half %{{.*}}) +// CHECK: ret half %hlsl.frac +half builtin_frac_half(half p0) { + return __builtin_hlsl_elementwise_frac(p0); +} + +// CHECK-LABEL: builtin_frac_float +// CHECK: %hlsl.frac = call reassoc nnan ninf nsz arcp afn float @llvm.dx.frac.f32(float %{{.*}}) +// CHECK: ret float %hlsl.frac +float builtin_frac_float (float p0) { + return __builtin_hlsl_elementwise_frac(p0); +} diff --git a/clang/test/CodeGenHLSL/builtins/lerp-builtin.hlsl b/clang/test/CodeGenHLSL/builtins/lerp-builtin.hlsl index c98693f32c834..96bcf2b49bf25 100644 --- a/clang/test/CodeGenHLSL/builtins/lerp-builtin.hlsl +++ b/clang/test/CodeGenHLSL/builtins/lerp-builtin.hlsl @@ -1,15 +1,12 @@ // RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -o - | FileCheck %s -// CHECK-LABEL: builtin_lerp_half_vector -// CHECK: %hlsl.lerp = call reassoc nnan ninf nsz arcp afn <3 x half> @llvm.dx.lerp.v3f16(<3 x half> %0, <3 x half> %1, <3 x half> %2) -// CHECK: ret <3 x half> %hlsl.lerp -half3 builtin_lerp_half_vector (half3 p0) { - return __builtin_hlsl_lerp ( p0, p0, p0 ); -} -// CHECK-LABEL: builtin_lerp_floar_vector -// CHECK: %hlsl.lerp = call reassoc nnan ninf nsz arcp afn <2 x float> @llvm.dx.lerp.v2f32(<2 x float> %0, <2 x float> %1, <2 x float> %2) -// CHECK: ret <2 x float> %hlsl.lerp -float2 builtin_lerp_floar_vector ( float2 p0) { - return __builtin_hlsl_lerp ( p0, p0, p0 ); -} +// CHECK-LABEL: builtin_lerp_half +// CHECK: %hlsl.lerp = call reassoc nnan ninf nsz arcp afn half @llvm.dx.lerp.f16(half %{{.*}}, half %{{.*}}, half %{{.*}}) +// CHECK: ret half %hlsl.lerp +half builtin_lerp_half(half p0) { return __builtin_hlsl_lerp(p0, p0, p0); } + +// CHECK-LABEL: builtin_lerp_float +// CHECK: %hlsl.lerp = call reassoc nnan ninf nsz arcp afn float @llvm.dx.lerp.f32(float %{{.*}}, float %{{.*}}, float %{{.*}}) +// CHECK: ret float %hlsl.lerp +float builtin_lerp_float(float p0) { return __builtin_hlsl_lerp(p0, p0, p0); } diff --git a/clang/test/CodeGenHLSL/builtins/normalize-builtin.hlsl b/clang/test/CodeGenHLSL/builtins/normalize-builtin.hlsl new file mode 100644 index 0000000000000..3db64604a1319 --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/normalize-builtin.hlsl @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -o - | FileCheck %s + + +// CHECK-LABEL: builtin_normalize_half +// CHECK: %hlsl.normalize = call reassoc nnan ninf nsz arcp afn half @llvm.dx.normalize.f16(half %{{.*}}) +// CHECK: ret half %hlsl.normalize +half builtin_normalize_half(half p0) { + return __builtin_hlsl_normalize(p0); +} + +// CHECK-LABEL: builtin_normalize_float +// CHECK: %hlsl.normalize = call reassoc nnan ninf nsz arcp afn float @llvm.dx.normalize.f32(float %{{.*}}) +// CHECK: ret float %hlsl.normalize +float builtin_normalize_float (float p0) { + return __builtin_hlsl_normalize(p0); +} diff --git a/clang/test/CodeGenHLSL/builtins/radians-builtin.hlsl b/clang/test/CodeGenHLSL/builtins/radians-builtin.hlsl new file mode 100644 index 0000000000000..0c86357d5ecad --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/radians-builtin.hlsl @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -o - | FileCheck %s + + +// CHECK-LABEL: builtin_radians_half +// CHECK: %hlsl.radians = call reassoc nnan ninf nsz arcp afn half @llvm.dx.radians.f16(half %{{.*}}) +// CHECK: ret half %hlsl.radians +half builtin_radians_half(half p0) { + return __builtin_hlsl_elementwise_radians(p0); +} + +// CHECK-LABEL: builtin_radians_float +// CHECK: %hlsl.radians = call reassoc nnan ninf nsz arcp afn float @llvm.dx.radians.f32(float %{{.*}}) +// CHECK: ret float %hlsl.radians +float builtin_radians_float (float p0) { + return __builtin_hlsl_elementwise_radians(p0); +} diff --git a/clang/test/CodeGenHLSL/builtins/rcp-builtin.hlsl b/clang/test/CodeGenHLSL/builtins/rcp-builtin.hlsl new file mode 100644 index 0000000000000..d81a49b8c6048 --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/rcp-builtin.hlsl @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -o - | FileCheck %s + + +// CHECK-LABEL: builtin_rcp_half +// CHECK: %hlsl.rcp = fdiv reassoc nnan ninf nsz arcp afn half 0xH3C00, %{{.*}} +// CHECK: ret half %hlsl.rcp +half builtin_rcp_half(half p0) { + return __builtin_hlsl_elementwise_rcp(p0); +} + +// CHECK-LABEL: builtin_rcp_float +// CHECK: %hlsl.rcp = fdiv reassoc nnan ninf nsz arcp afn float 1.000000e+00, %{{.*}} +// CHECK: ret float %hlsl.rcp +float builtin_rcp_float(float p0) { + return __builtin_hlsl_elementwise_rcp(p0); +} diff --git a/clang/test/CodeGenHLSL/builtins/rsqrt-builtin.hlsl b/clang/test/CodeGenHLSL/builtins/rsqrt-builtin.hlsl new file mode 100644 index 0000000000000..43ad9d0d0b844 --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/rsqrt-builtin.hlsl @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -o - | FileCheck %s + + +// CHECK-LABEL: builtin_rsqrt_half +// CHECK: %hlsl.rsqrt = call reassoc nnan ninf nsz arcp afn half @llvm.dx.rsqrt.f16(half %{{.*}}) +// CHECK: ret half %hlsl.rsqrt +half builtin_rsqrt_half(half p0) { + return __builtin_hlsl_elementwise_rsqrt(p0); +} + +// CHECK-LABEL: builtin_rsqrt_float +// CHECK: %hlsl.rsqrt = call reassoc nnan ninf nsz arcp afn float @llvm.dx.rsqrt.f32(float %{{.*}}) +// CHECK: ret float %hlsl.rsqrt +float builtin_rsqrt_float (float p0) { + return __builtin_hlsl_elementwise_rsqrt(p0); +} diff --git a/clang/test/CodeGenHLSL/builtins/saturate-builtin.hlsl b/clang/test/CodeGenHLSL/builtins/saturate-builtin.hlsl new file mode 100644 index 0000000000000..7dbba72f3abb5 --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/saturate-builtin.hlsl @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -o - | FileCheck %s + + +// CHECK-LABEL: builtin_saturate_half +// CHECK: %hlsl.saturate = call reassoc nnan ninf nsz arcp afn half @llvm.dx.saturate.f16(half %{{.*}}) +// CHECK: ret half %hlsl.saturate +half builtin_saturate_half(half p0) { + return __builtin_hlsl_elementwise_saturate(p0); +} + +// CHECK-LABEL: builtin_saturate_float +// CHECK: %hlsl.saturate = call reassoc nnan ninf nsz arcp afn float @llvm.dx.saturate.f32(float %{{.*}}) +// CHECK: ret float %hlsl.saturate +float builtin_saturate_float (float p0) { + return __builtin_hlsl_elementwise_saturate(p0); +} diff --git a/clang/test/SemaHLSL/BuiltIns/clamp-errors.hlsl b/clang/test/SemaHLSL/BuiltIns/clamp-errors.hlsl index 71c16e9cf9ff2..fba7820e4f4df 100644 --- a/clang/test/SemaHLSL/BuiltIns/clamp-errors.hlsl +++ b/clang/test/SemaHLSL/BuiltIns/clamp-errors.hlsl @@ -35,9 +35,9 @@ float2 test_scalar_first_arg3(float p0, float2 p1) { // expected-error@-1 {{call to 'clamp' is ambiguous}} } -float3 test_thing(float3 p0, float2 p1) { +float3 test_clamp_vector_size_last_arg_mismatch(float3 p0, float2 p1) { return clamp(p0, p0, p1); - // expected-error@-1 {{cannot initialize return object of type 'float3' (aka 'vector<float, 3>') with an rvalue of type 'vector<float, 2>' (vector of 2 'float' values)}} + // expected-error@-1 {{all arguments to 'clamp' must have the same type}} } typedef float float5 __attribute__((ext_vector_type(5))); @@ -48,13 +48,12 @@ float5 vec_too_big(float5 p0) { // expected-error@-1 {{call to 'clamp' is ambiguous}} } -float2 test_clamp_vector_size_mismatch(float3 p0, float2 p1) { +float2 test_clamp_vector_size_ret_mismatch(float3 p0, float3 p1) { return clamp(p0, p0, p1); // expected-warning@-1 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}} - // expected-warning@-2 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}} } -float2 test_clamp_builtin_vector_size_mismatch(float3 p0, float2 p1) { +float2 test_clamp_builtin_vector_size_first_arg_mismatch(float3 p0, float2 p1) { return __builtin_hlsl_elementwise_clamp(p0, p1, p1); // expected-error@-1 {{all arguments to '__builtin_hlsl_elementwise_clamp' must have the same type}} } diff --git a/clang/test/SemaHLSL/BuiltIns/clip-errors.hlsl b/clang/test/SemaHLSL/BuiltIns/clip-errors.hlsl index 871e512e128c5..2cb401601f7eb 100644 --- a/clang/test/SemaHLSL/BuiltIns/clip-errors.hlsl +++ b/clang/test/SemaHLSL/BuiltIns/clip-errors.hlsl @@ -16,12 +16,17 @@ void test_first_arg_type_mismatch(bool p) { // expected-error@-1 {{invalid operand of type 'bool' where 'float' or a vector of such type is required}} } -void test_first_arg_type_mismatch_3(half3 p) { +void test_first_arg_type_mismatch_2(half3 p) { __builtin_hlsl_elementwise_clip(p); // expected-error@-1 {{invalid operand of type 'half3' (aka 'vector<half, 3>') where 'float' or a vector of such type is required}} } -void test_first_arg_type_mismatch_3(double p) { +void test_first_arg_type_mismatch_3(half p) { + __builtin_hlsl_elementwise_clip(p); + // expected-error@-1 {{invalid operand of type 'half' where 'float' or a vector of such type is required}} +} + +void test_first_arg_type_mismatch_4(double p) { __builtin_hlsl_elementwise_clip(p); // expected-error@-1 {{invalid operand of type 'double' where 'float' or a vector of such type is required}} } diff --git a/clang/test/SemaHLSL/BuiltIns/dot-errors.hlsl b/clang/test/SemaHLSL/BuiltIns/dot-errors.hlsl index 157f5e2575b03..d8a7e0c640b68 100644 --- a/clang/test/SemaHLSL/BuiltIns/dot-errors.hlsl +++ b/clang/test/SemaHLSL/BuiltIns/dot-errors.hlsl @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm-only -disable-llvm-passes -verify -verify-ignore-unexpected +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm-only -disable-llvm-passes -verify -verify-ignore-unexpected=note float test_no_second_arg(float2 p0) { return __builtin_hlsl_dot(p0); @@ -17,7 +17,7 @@ float test_dot_no_second_arg(float2 p0) { float test_dot_vector_size_mismatch(float3 p0, float2 p1) { return dot(p0, p1); - // expected-warning@-1 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}} + // expected-error@-1 {{all arguments to 'dot' must have the same type}} } float test_dot_builtin_vector_size_mismatch(float3 p0, float2 p1) { @@ -104,7 +104,7 @@ float test_builtin_dot_int_vect_to_float_vec_promotion(int2 p0, float p1) { // expected-error@-1 {{all arguments to '__builtin_hlsl_dot' must be vectors}} } -int test_builtin_dot_bool_type_promotion(bool p0, bool p1) { +int test_builtin_dot_bool_type_promotion(bool p0, float p1) { return __builtin_hlsl_dot(p0, p1); // expected-error@-1 {{1st argument must be a vector, integer or floating-point type (was 'bool')}} } @@ -117,3 +117,13 @@ double test_dot_double_builtin(double2 p0, double2 p1) { return __builtin_hlsl_dot(p0, p1); // expected-error@-1 {{passing 'double2' (aka 'vector<double, 2>') to parameter of incompatible type '__attribute__((__vector_size__(2 * sizeof(float)))) float' (vector of 2 'float' values)}} } + +float builtin_bool_to_float_type_promotion ( float p0, bool p1 ) { + return __builtin_hlsl_dot ( p0, p1 ); + // expected-error@-1 {{are of different types ('float' vs 'bool')}} +} + +float builtin_dot_int_to_float_promotion ( float p0, int p1 ) { + return __builtin_hlsl_dot (p0, p1 ); + // expected-error@-1 {{are of different types ('float' vs 'int')}} +} diff --git a/clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl b/clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl index f3cfbcf29d69c..81c134e1ce4af 100644 --- a/clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl +++ b/clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl @@ -26,14 +26,3 @@ float2 builtin_frac_int2_to_float2_promotion(int2 p1) { // expected-error@-1 {{passing 'int2' (aka 'vector<int, 2>') to parameter of incompatible type '__attribute__((__vector_size__(2 * sizeof(float)))) float' (vector of 2 'float' values)}} } -// builtins are variadic functions and so are subject to DefaultVariadicArgumentPromotion -half builtin_frac_half_scalar (half p0) { - return __builtin_hlsl_elementwise_frac (p0); - // expected-error@-1 {{passing 'double' to parameter of incompatible type 'float'}} -} - -float builtin_frac_float_scalar ( float p0) { - return __builtin_hlsl_elementwise_frac (p0); - // expected-error@-1 {{passing 'double' to parameter of incompatible type 'float'}} -} - diff --git a/clang/test/SemaHLSL/BuiltIns/lerp-errors.hlsl b/clang/test/SemaHLSL/BuiltIns/lerp-errors.hlsl index 46a39c62d126c..398d3c7f938c1 100644 --- a/clang/test/SemaHLSL/BuiltIns/lerp-errors.hlsl +++ b/clang/test/SemaHLSL/BuiltIns/lerp-errors.hlsl @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm-only -disable-llvm-passes -verify -verify-ignore-unexpected +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm-only -disable-llvm-passes -verify -verify-ignore-unexpected=note float2 test_no_second_arg(float2 p0) { return __builtin_hlsl_lerp(p0); @@ -25,16 +25,14 @@ float2 test_lerp_vector_trunc_warn1(float3 p0) { // expected-warning@-1 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}} } -float2 test_lerp_vector_trunc_warn2(float3 p0, float2 p1) { +float2 test_lerp_vector_size_mismatch1(float3 p0, float2 p1) { return lerp(p0, p0, p1); - // expected-warning@-1 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}} - // expected-warning@-2 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}} + // expected-error@-1 {{all arguments to 'lerp' must have the same type}} } -float2 test_lerp_vector_trunc_warn3(float3 p0, float2 p1) { +float2 test_lerp_vector_size_mismatch2(float3 p0, float2 p1) { return lerp(p0, p1, p0); - // expected-warning@-1 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}} - // expected-warning@-2 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}} + // expected-error@-1 {{all arguments to 'lerp' must have the same type}} } float2 test_lerp_builtin_vector_size_mismatch_Arg1(float3 p0, float2 p1) { @@ -126,16 +124,3 @@ float4 test_lerp_int4(int4 p0, int4 p1, int4 p2) { return __builtin_hlsl_lerp(p0, p1, p2); // expected-error@-1 {{1st argument must be a scalar or vector of floating-point types (was 'int4' (aka 'vector<int, 4>'))}} } - -// note: DefaultVariadicArgumentPromotion --> DefaultArgumentPromotion has already promoted to double -// we don't know anymore that the input was half when __builtin_hlsl_lerp is called so we default to float -// for expected type -half builtin_lerp_half_scalar (half p0) { - return __builtin_hlsl_lerp ( p0, p0, p0 ); - // expected-error@-1 {{passing 'double' to parameter of incompatible type 'float'}} -} - -float builtin_lerp_float_scalar ( float p0) { - return __builtin_hlsl_lerp ( p0, p0, p0 ); - // expected-error@-1 {{passing 'double' to parameter of incompatible type 'float'}} -} diff --git a/clang/test/SemaHLSL/BuiltIns/rsqrt-errors.hlsl b/clang/test/SemaHLSL/BuiltIns/rsqrt-errors.hlsl index e9a295172c7f8..d528b4b5a3989 100644 --- a/clang/test/SemaHLSL/BuiltIns/rsqrt-errors.hlsl +++ b/clang/test/SemaHLSL/BuiltIns/rsqrt-errors.hlsl @@ -26,13 +26,7 @@ float2 builtin_rsqrt_int2_to_float2_promotion(int2 p1) { // expected-error@-1 {{passing 'int2' (aka 'vector<int, 2>') to parameter of incompatible type '__attribute__((__vector_size__(2 * sizeof(float)))) float' (vector of 2 'float' values)}} } -// builtins are variadic functions and so are subject to DefaultVariadicArgumentPromotion -half builtin_rsqrt_half_scalar (half p0) { - return __builtin_hlsl_elementwise_rsqrt (p0); - // expected-error@-1 {{passing 'double' to parameter of incompatible type 'float'}} -} - -float builtin_rsqrt_float_scalar ( float p0) { - return __builtin_hlsl_elementwise_rsqrt (p0); +double builtin_rsqrt_double(double p0) { + return __builtin_hlsl_elementwise_rsqrt(p0); // expected-error@-1 {{passing 'double' to parameter of incompatible type 'float'}} } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits