Skip to content

Commit 38429f4

Browse files
committed
Add tests for side-effecting arguments and AST structure.
1 parent 019b1f9 commit 38429f4

File tree

2 files changed

+1043
-0
lines changed

2 files changed

+1043
-0
lines changed

clang/test/CodeGenHLSL/BasicFeatures/InitLists.hlsl

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,3 +901,63 @@ TwoFloats case15(SlicyBits SB) {
901901
TwoFloats TI = {SB};
902902
return TI;
903903
}
904+
905+
// Case 16: Side-effecting initialization list arguments. The important thing
906+
// here is that case16 only has _one_ call to makeTwo.
907+
// CHECK-LABEL: define void @_Z7makeTwoRf(
908+
// CHECK-SAME: ptr dead_on_unwind noalias writable sret([[STRUCT_TWOFLOATS:%.*]]) align 4 [[AGG_RESULT:%.*]], ptr noalias noundef nonnull align 4 dereferenceable(4) [[X:%.*]]) #[[ATTR0]] {
909+
// CHECK-NEXT: [[ENTRY:.*:]]
910+
// CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 4
911+
// CHECK-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 4
912+
// CHECK-NEXT: [[X1:%.*]] = getelementptr inbounds nuw [[STRUCT_TWOFLOATS]], ptr [[AGG_RESULT]], i32 0, i32 0
913+
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 4
914+
// CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[TMP0]], align 4
915+
// CHECK-NEXT: store float [[TMP1]], ptr [[X1]], align 4
916+
// CHECK-NEXT: [[Y:%.*]] = getelementptr inbounds nuw [[STRUCT_TWOFLOATS]], ptr [[AGG_RESULT]], i32 0, i32 1
917+
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[X_ADDR]], align 4
918+
// CHECK-NEXT: [[TMP3:%.*]] = load float, ptr [[TMP2]], align 4
919+
// CHECK-NEXT: [[MUL:%.*]] = fmul reassoc nnan ninf nsz arcp afn float [[TMP3]], 1.500000e+00
920+
// CHECK-NEXT: store float [[MUL]], ptr [[Y]], align 4
921+
// CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[X_ADDR]], align 4
922+
// CHECK-NEXT: [[TMP5:%.*]] = load float, ptr [[TMP4]], align 4
923+
// CHECK-NEXT: [[MUL2:%.*]] = fmul reassoc nnan ninf nsz arcp afn float [[TMP5]], 2.000000e+00
924+
// CHECK-NEXT: store float [[MUL2]], ptr [[TMP4]], align 4
925+
// CHECK-NEXT: ret void
926+
//
927+
TwoFloats makeTwo(inout float X) {
928+
TwoFloats TF = {X, X*1.5};
929+
X *= 2;
930+
return TF;
931+
}
932+
933+
// CHECK-LABEL: define void @_Z6case16v(
934+
// CHECK-SAME: ptr dead_on_unwind noalias writable sret([[STRUCT_FOURFLOATS:%.*]]) align 4 [[AGG_RESULT:%.*]]) #[[ATTR0]] {
935+
// CHECK-NEXT: [[ENTRY:.*:]]
936+
// CHECK-NEXT: [[X:%.*]] = alloca float, align 4
937+
// CHECK-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_TWOFLOATS:%.*]], align 4
938+
// CHECK-NEXT: [[TMP:%.*]] = alloca float, align 4
939+
// CHECK-NEXT: store float 0.000000e+00, ptr [[X]], align 4
940+
// CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[X]], align 4
941+
// CHECK-NEXT: store float [[TMP0]], ptr [[TMP]], align 4
942+
// CHECK-NEXT: call void @_Z7makeTwoRf(ptr dead_on_unwind writable sret([[STRUCT_TWOFLOATS]]) align 4 [[REF_TMP]], ptr noalias noundef nonnull align 4 dereferenceable(4) [[TMP]]) #[[ATTR2:[0-9]+]]
943+
// CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[TMP]], align 4
944+
// CHECK-NEXT: store float [[TMP1]], ptr [[X]], align 4
945+
// CHECK-NEXT: [[X1:%.*]] = getelementptr inbounds nuw [[STRUCT_TWOFLOATS]], ptr [[AGG_RESULT]], i32 0, i32 0
946+
// CHECK-NEXT: store float 0.000000e+00, ptr [[X1]], align 4
947+
// CHECK-NEXT: [[Y:%.*]] = getelementptr inbounds nuw [[STRUCT_TWOFLOATS]], ptr [[AGG_RESULT]], i32 0, i32 1
948+
// CHECK-NEXT: [[X2:%.*]] = getelementptr inbounds nuw [[STRUCT_TWOFLOATS]], ptr [[REF_TMP]], i32 0, i32 0
949+
// CHECK-NEXT: [[TMP2:%.*]] = load float, ptr [[X2]], align 4
950+
// CHECK-NEXT: store float [[TMP2]], ptr [[Y]], align 4
951+
// CHECK-NEXT: [[Z:%.*]] = getelementptr inbounds nuw [[STRUCT_FOURFLOATS]], ptr [[AGG_RESULT]], i32 0, i32 1
952+
// CHECK-NEXT: [[Y3:%.*]] = getelementptr inbounds nuw [[STRUCT_TWOFLOATS]], ptr [[REF_TMP]], i32 0, i32 1
953+
// CHECK-NEXT: [[TMP3:%.*]] = load float, ptr [[Y3]], align 4
954+
// CHECK-NEXT: store float [[TMP3]], ptr [[Z]], align 4
955+
// CHECK-NEXT: [[W:%.*]] = getelementptr inbounds nuw [[STRUCT_FOURFLOATS]], ptr [[AGG_RESULT]], i32 0, i32 2
956+
// CHECK-NEXT: store float 3.000000e+00, ptr [[W]], align 4
957+
// CHECK-NEXT: ret void
958+
//
959+
FourFloats case16() {
960+
float X = 0;
961+
FourFloats FF = {0, makeTwo(X), 3};
962+
return FF;
963+
}

0 commit comments

Comments
 (0)