Skip to content

Commit a32d88b

Browse files
authored
[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`.
1 parent 6088f6d commit a32d88b

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

clang/lib/CodeGen/CGHLSLBuiltins.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -604,12 +604,12 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
604604
Value *OpTrue =
605605
RValTrue.isScalar()
606606
? RValTrue.getScalarVal()
607-
: RValTrue.getAggregatePointer(E->getArg(1)->getType(), *this);
607+
: Builder.CreateLoad(RValTrue.getAggregateAddress(), "true_val");
608608
RValue RValFalse = EmitAnyExpr(E->getArg(2));
609609
Value *OpFalse =
610610
RValFalse.isScalar()
611611
? RValFalse.getScalarVal()
612-
: RValFalse.getAggregatePointer(E->getArg(2)->getType(), *this);
612+
: Builder.CreateLoad(RValFalse.getAggregateAddress(), "false_val");
613613
if (auto *VTy = E->getType()->getAs<VectorType>()) {
614614
if (!OpTrue->getType()->isVectorTy())
615615
OpTrue =

clang/test/CodeGenHLSL/builtins/select.hlsl

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,26 @@ int test_select_bool_int(bool cond0, int tVal, int fVal) {
1010
}
1111

1212
struct S { int a; };
13-
// CHECK-LABEL: test_select_infer
14-
// CHECK: [[SELECT:%.*]] = select i1 {{%.*}}, ptr {{%.*}}, ptr {{%.*}}
15-
// CHECK: store ptr [[SELECT]]
13+
// CHECK-LABEL: test_select_infer_struct
14+
// CHECK: [[TRUE_VAL:%.*]] = load %struct.S, ptr {{%.*}}, align 1
15+
// CHECK: [[FALSE_VAL:%.*]] = load %struct.S, ptr {{%.*}}, align 1
16+
// CHECK: [[SELECT:%.*]] = select i1 {{%.*}}, %struct.S [[TRUE_VAL]], %struct.S [[FALSE_VAL]]
17+
// CHECK: store %struct.S [[SELECT]], ptr {{%.*}}, align 1
1618
// CHECK: ret void
17-
struct S test_select_infer(bool cond0, struct S tVal, struct S fVal) {
19+
struct S test_select_infer_struct(bool cond0, struct S tVal, struct S fVal) {
1820
return select(cond0, tVal, fVal);
1921
}
2022

23+
// CHECK-LABEL: test_select_infer_array
24+
// CHECK: [[TRUE_VAL:%.*]] = load [3 x i32], ptr {{%.*}}, align 4
25+
// CHECK: [[FALSE_VAL:%.*]] = load [3 x i32], ptr {{%.*}}, align 4
26+
// CHECK: [[SELECT:%.*]] = select i1 {{%.*}}, [3 x i32] [[TRUE_VAL]], [3 x i32] [[FALSE_VAL]]
27+
// CHECK: store [3 x i32] [[SELECT]], ptr {{%.*}}, align 4
28+
// CHECK: ret void
29+
int test_select_infer_array(bool cond, int tVal[3], int fVal[3])[3] {
30+
return select(cond, tVal, fVal);
31+
}
32+
2133
// CHECK-LABEL: test_select_bool_vector
2234
// CHECK: [[SELECT:%.*]] = select i1 {{%.*}}, <2 x i32> {{%.*}}, <2 x i32> {{%.*}}
2335
// CHECK: ret <2 x i32> [[SELECT]]

0 commit comments

Comments
 (0)