[clang] [HLSL][DirectX] Fix resource lowering when using structs with `select` (PR #158361)
Kaitlin Peng via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 12 16:34:41 PDT 2025
https://github.com/kmpeng updated https://github.com/llvm/llvm-project/pull/158361
>From feb15ecf6bd0f956564e7c892dabc419f7094214 Mon Sep 17 00:00:00 2001
From: kmpeng <kaitlinpeng at microsoft.com>
Date: Wed, 3 Sep 2025 17:45:03 -0700
Subject: [PATCH 1/2] fix select codegen
---
clang/lib/CodeGen/CGHLSLBuiltins.cpp | 4 ++--
clang/test/CodeGenHLSL/builtins/select.hlsl | 6 ++++--
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/clang/lib/CodeGen/CGHLSLBuiltins.cpp b/clang/lib/CodeGen/CGHLSLBuiltins.cpp
index 5004c09e0d5cf..7b5b924b1fe82 100644
--- a/clang/lib/CodeGen/CGHLSLBuiltins.cpp
+++ b/clang/lib/CodeGen/CGHLSLBuiltins.cpp
@@ -604,12 +604,12 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
Value *OpTrue =
RValTrue.isScalar()
? RValTrue.getScalarVal()
- : RValTrue.getAggregatePointer(E->getArg(1)->getType(), *this);
+ : Builder.CreateLoad(RValTrue.getAggregateAddress(), "true_val");
RValue RValFalse = EmitAnyExpr(E->getArg(2));
Value *OpFalse =
RValFalse.isScalar()
? RValFalse.getScalarVal()
- : RValFalse.getAggregatePointer(E->getArg(2)->getType(), *this);
+ : Builder.CreateLoad(RValFalse.getAggregateAddress(), "false_val");
if (auto *VTy = E->getType()->getAs<VectorType>()) {
if (!OpTrue->getType()->isVectorTy())
OpTrue =
diff --git a/clang/test/CodeGenHLSL/builtins/select.hlsl b/clang/test/CodeGenHLSL/builtins/select.hlsl
index 196b8a90cd877..a5a398af44646 100644
--- a/clang/test/CodeGenHLSL/builtins/select.hlsl
+++ b/clang/test/CodeGenHLSL/builtins/select.hlsl
@@ -11,8 +11,10 @@ int test_select_bool_int(bool cond0, int tVal, int fVal) {
struct S { int a; };
// CHECK-LABEL: test_select_infer
-// CHECK: [[SELECT:%.*]] = select i1 {{%.*}}, ptr {{%.*}}, ptr {{%.*}}
-// CHECK: store ptr [[SELECT]]
+// CHECK: [[TRUE_VAL:%.*]] = load %struct.S, ptr {{%.*}}, align 1
+// CHECK: [[FALSE_VAL:%.*]] = load %struct.S, ptr {{%.*}}, align 1
+// CHECK: [[SELECT:%.*]] = select i1 {{%.*}}, %struct.S [[TRUE_VAL]], %struct.S [[FALSE_VAL]]
+// CHECK: store %struct.S [[SELECT]], ptr {{%.*}}, align 1
// CHECK: ret void
struct S test_select_infer(bool cond0, struct S tVal, struct S fVal) {
return select(cond0, tVal, fVal);
>From 38497ad80dd83f3d0382860733e8eff7ee9d8d36 Mon Sep 17 00:00:00 2001
From: kmpeng <kaitlinpeng at microsoft.com>
Date: Fri, 12 Sep 2025 16:34:30 -0700
Subject: [PATCH 2/2] add array test
---
clang/test/CodeGenHLSL/builtins/select.hlsl | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/clang/test/CodeGenHLSL/builtins/select.hlsl b/clang/test/CodeGenHLSL/builtins/select.hlsl
index a5a398af44646..7590b4a881259 100644
--- a/clang/test/CodeGenHLSL/builtins/select.hlsl
+++ b/clang/test/CodeGenHLSL/builtins/select.hlsl
@@ -10,16 +10,26 @@ int test_select_bool_int(bool cond0, int tVal, int fVal) {
}
struct S { int a; };
-// CHECK-LABEL: test_select_infer
+// CHECK-LABEL: test_select_infer_struct
// CHECK: [[TRUE_VAL:%.*]] = load %struct.S, ptr {{%.*}}, align 1
// CHECK: [[FALSE_VAL:%.*]] = load %struct.S, ptr {{%.*}}, align 1
// CHECK: [[SELECT:%.*]] = select i1 {{%.*}}, %struct.S [[TRUE_VAL]], %struct.S [[FALSE_VAL]]
// CHECK: store %struct.S [[SELECT]], ptr {{%.*}}, align 1
// CHECK: ret void
-struct S test_select_infer(bool cond0, struct S tVal, struct S fVal) {
+struct S test_select_infer_struct(bool cond0, struct S tVal, struct S fVal) {
return select(cond0, tVal, fVal);
}
+// CHECK-LABEL: test_select_infer_array
+// CHECK: [[TRUE_VAL:%.*]] = load [3 x i32], ptr {{%.*}}, align 4
+// CHECK: [[FALSE_VAL:%.*]] = load [3 x i32], ptr {{%.*}}, align 4
+// CHECK: [[SELECT:%.*]] = select i1 {{%.*}}, [3 x i32] [[TRUE_VAL]], [3 x i32] [[FALSE_VAL]]
+// CHECK: store [3 x i32] [[SELECT]], ptr {{%.*}}, align 4
+// CHECK: ret void
+int test_select_infer_array(bool cond, int tVal[3], int fVal[3])[3] {
+ return select(cond, tVal, fVal);
+}
+
// CHECK-LABEL: test_select_bool_vector
// CHECK: [[SELECT:%.*]] = select i1 {{%.*}}, <2 x i32> {{%.*}}, <2 x i32> {{%.*}}
// CHECK: ret <2 x i32> [[SELECT]]
More information about the cfe-commits
mailing list