Author: Kaitlin Peng
Date: 2025-09-15T12:54:11-07:00
New Revision: a32d88b79abaaab46cb1580d75df7422d0a9e4d3

URL: 
https://github.com/llvm/llvm-project/commit/a32d88b79abaaab46cb1580d75df7422d0a9e4d3
DIFF: 
https://github.com/llvm/llvm-project/commit/a32d88b79abaaab46cb1580d75df7422d0a9e4d3.diff

LOG: [HLSL][DirectX] Fix resource lowering when using structs with `select` 
(#158361)

Fixes #156550.

The `select` instruction should be using the struct values themselves
rather than pointers to temporary allocas.
This PR also adds an array test for select in `select.hlsl`.

Added: 
    

Modified: 
    clang/lib/CodeGen/CGHLSLBuiltins.cpp
    clang/test/CodeGenHLSL/builtins/select.hlsl

Removed: 
    


################################################################################
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..7590b4a881259 100644
--- a/clang/test/CodeGenHLSL/builtins/select.hlsl
+++ b/clang/test/CodeGenHLSL/builtins/select.hlsl
@@ -10,14 +10,26 @@ 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-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]]


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to