[clang] [HLSL] add CustomTypeChecking to float builtins (PR #133441)
Farzon Lotfi via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 28 06:05:53 PDT 2025
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 <farzonlotfi at 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 at -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 at -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 at -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 at -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 at -1 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}}
- // expected-warning at -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 at -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 at -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 at -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 at -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 at -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 at -1 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}}
+ // expected-error at -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 at -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 at -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 at -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 at -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 at -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 at -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 at -1 {{passing 'double' to parameter of incompatible type 'float'}}
-}
-
-float builtin_frac_float_scalar ( float p0) {
- return __builtin_hlsl_elementwise_frac (p0);
- // expected-error at -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 at -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 at -1 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}}
- // expected-warning at -2 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}}
+ // expected-error at -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 at -1 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}}
- // expected-warning at -2 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}}
+ // expected-error at -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 at -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 at -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 at -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 at -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 at -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 at -1 {{passing 'double' to parameter of incompatible type 'float'}}
}
More information about the cfe-commits
mailing list