@@ -901,3 +901,63 @@ TwoFloats case15(SlicyBits SB) {
901
901
TwoFloats TI = {SB};
902
902
return TI;
903
903
}
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