[clang] [HLSL] Fix float type promotion to double of the select intrinsic (PR #222056)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 8 09:49:58 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-hlsl
Author: Farzon Lotfi (farzonl)
<details>
<summary>Changes</summary>
fixes #<!-- -->222055
A previous pr replaced per vector 2-4 overloads with an all inclusive vector template overload. These vector overloads needed to be guarded so that vec1s go down the scalar overload path.
---
Full diff: https://github.com/llvm/llvm-project/pull/222056.diff
2 Files Affected:
- (modified) clang/lib/Headers/hlsl/hlsl_alias_intrinsics.h (+6-6)
- (modified) clang/test/CodeGenHLSL/builtins/select.hlsl (+15-1)
``````````diff
diff --git a/clang/lib/Headers/hlsl/hlsl_alias_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_alias_intrinsics.h
index 772e740c264fd..30fa47b699f85 100644
--- a/clang/lib/Headers/hlsl/hlsl_alias_intrinsics.h
+++ b/clang/lib/Headers/hlsl/hlsl_alias_intrinsics.h
@@ -147,8 +147,8 @@ T select(bool, T, T);
template <typename T, int N>
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_select)
-vector<T, N> select(__detail::type_identity_t<vector<bool, N>>, vector<T, N>,
- vector<T, N>);
+__detail::enable_if_t<(N > 1), vector<T, N>> select(
+ __detail::type_identity_t<vector<bool, N>>, vector<T, N>, vector<T, N>);
/// \fn vector<T,Sz> select(vector<bool,Sz> Conds, T TrueVal,
/// vector<T,Sz> FalseVals)
@@ -160,8 +160,8 @@ vector<T, N> select(__detail::type_identity_t<vector<bool, N>>, vector<T, N>,
template <typename T, int N>
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_select)
-vector<T, N> select(__detail::type_identity_t<vector<bool, N>>, T,
- vector<T, N>);
+__detail::enable_if_t<(N > 1), vector<T, N>> select(
+ __detail::type_identity_t<vector<bool, N>>, T, vector<T, N>);
/// \fn vector<T,Sz> select(vector<bool,Sz> Conds, vector<T,Sz> TrueVals,
/// T FalseVal)
@@ -172,8 +172,8 @@ vector<T, N> select(__detail::type_identity_t<vector<bool, N>>, T,
template <typename T, int N>
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_select)
-vector<T, N> select(__detail::type_identity_t<vector<bool, N>>, vector<T, N>,
- T);
+__detail::enable_if_t<(N > 1), vector<T, N>> select(
+ __detail::type_identity_t<vector<bool, N>>, vector<T, N>, T);
/// \fn vector<T,Sz> select(vector<bool,Sz> Conds, T TrueVals,
/// T FalseVal)
diff --git a/clang/test/CodeGenHLSL/builtins/select.hlsl b/clang/test/CodeGenHLSL/builtins/select.hlsl
index 238beea0d4155..f9dc50227599e 100644
--- a/clang/test/CodeGenHLSL/builtins/select.hlsl
+++ b/clang/test/CodeGenHLSL/builtins/select.hlsl
@@ -28,12 +28,26 @@ int2 test_select_bool_vector(bool cond0, int2 tVal, int2 fVal) {
}
// CHECK-LABEL: test_select_vector_1
-// CHECK: [[SELECT:%.*]] = select <1 x i1> {{%.*}}, <1 x i32> {{%.*}}, <1 x i32> {{%.*}}
+// CHECK: [[SELECT:%.*]] = select i1 {{%.*}}, <1 x i32> {{%.*}}, <1 x i32> {{%.*}}
// CHECK: ret <1 x i32> [[SELECT]]
int1 test_select_vector_1(bool1 cond0, int1 tVals, int1 fVals) {
return select(cond0, tVals, fVals);
}
+// CHECK-LABEL: test_select_float_vector_1
+// CHECK: [[SELECT:%.*]] = select i1 {{%.*}}, <1 x float> {{%.*}}, <1 x float> {{%.*}}
+// CHECK: ret <1 x float> [[SELECT]]
+float1 test_select_float_vector_1(bool1 cond0, float1 tVals, float1 fVals) {
+ return select(cond0, tVals, fVals);
+}
+
+// CHECK-LABEL: test_select_half_vector_1
+// CHECK: [[SELECT:%.*]] = select i1 {{%.*}}, <1 x half> {{%.*}}, <1 x half> {{%.*}}
+// CHECK: ret <1 x half> [[SELECT]]
+half1 test_select_half_vector_1(bool1 cond0, half1 tVals, half1 fVals) {
+ return select(cond0, tVals, fVals);
+}
+
// CHECK-LABEL: test_select_vector_2
// CHECK: [[SELECT:%.*]] = select <2 x i1> {{%.*}}, <2 x i32> {{%.*}}, <2 x i32> {{%.*}}
// CHECK: ret <2 x i32> [[SELECT]]
``````````
</details>
https://github.com/llvm/llvm-project/pull/222056
More information about the cfe-commits
mailing list