@@ -61,10 +61,6 @@ struct EmptyDerived : Empty {};
61
61
62
62
struct UnnamedDerived : UnnamedOnly {};
63
63
64
- // CHECK-DAG: [[ConstE:@.*]] = private unnamed_addr constant %struct.Empty undef, align 1
65
- // CHECK-DAG: [[ConstUO:@.*]] = private unnamed_addr constant %struct.UnnamedOnly undef, align 1
66
- // CHECK-DAG: [[ConstED:@.*]] = private unnamed_addr constant %struct.EmptyDerived undef, align 1
67
- // CHECK-DAG: [[ConstUD:@.*]] = private unnamed_addr constant %struct.UnnamedDerived undef, align 1
68
64
69
65
// Case 1: Extraneous braces get ignored in literal instantiation.
70
66
// CHECK-LABEL: define hidden void @_Z5case1v(
@@ -911,15 +907,15 @@ TwoFloats case15(SlicyBits SB) {
911
907
// CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 4
912
908
// CHECK-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 4
913
909
// CHECK-NEXT: [[X1:%.*]] = getelementptr inbounds nuw [[STRUCT_TWOFLOATS]], ptr [[AGG_RESULT]], i32 0, i32 0
914
- // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 4
910
+ // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 4, !nonnull [[META3:![0-9]+]], !align [[META4:![0-9]+]]
915
911
// CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[TMP0]], align 4
916
912
// CHECK-NEXT: store float [[TMP1]], ptr [[X1]], align 1
917
913
// CHECK-NEXT: [[Y:%.*]] = getelementptr inbounds nuw [[STRUCT_TWOFLOATS]], ptr [[AGG_RESULT]], i32 0, i32 1
918
- // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[X_ADDR]], align 4
914
+ // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[X_ADDR]], align 4, !nonnull [[META3]], !align [[META4]]
919
915
// CHECK-NEXT: [[TMP3:%.*]] = load float, ptr [[TMP2]], align 4
920
916
// CHECK-NEXT: [[MUL:%.*]] = fmul reassoc nnan ninf nsz arcp afn float [[TMP3]], 1.500000e+00
921
917
// CHECK-NEXT: store float [[MUL]], ptr [[Y]], align 1
922
- // CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[X_ADDR]], align 4
918
+ // CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[X_ADDR]], align 4, !nonnull [[META3]], !align [[META4]]
923
919
// CHECK-NEXT: [[TMP5:%.*]] = load float, ptr [[TMP4]], align 4
924
920
// CHECK-NEXT: [[MUL2:%.*]] = fmul reassoc nnan ninf nsz arcp afn float [[TMP5]], 2.000000e+00
925
921
// CHECK-NEXT: store float [[MUL2]], ptr [[TMP4]], align 4
@@ -964,94 +960,173 @@ FourFloats case16() {
964
960
}
965
961
966
962
963
+ // CHECK-LABEL: define hidden noundef i32 @_Z12case17Helperi(
964
+ // CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] {
965
+ // CHECK-NEXT: [[ENTRY:.*:]]
966
+ // CHECK-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4
967
+ // CHECK-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4
968
+ // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4
969
+ // CHECK-NEXT: ret i32 [[TMP0]]
970
+ //
967
971
int case17Helper (int x) {
968
972
return x;
969
973
}
970
974
971
975
// InitList with OpaqueValueExpr
972
- // CHECK-LABEL: define hidden void {{.*}}case17
973
- // CHECK: [[X:%.*]] = alloca <2 x i32>, align 8
974
- // CHECK-NEXT: [[C:%.*]] = call noundef i32 {{.*}}case17Helper{{.*}}(i32 noundef 0)
975
- // CHECK-NEXT: [[C1:%.*]] = call noundef i32 {{.*}}case17Helper{{.*}}(i32 noundef 1)
976
- // CHECK-NEXT: [[VI:%.*]] = insertelement <2 x i32> poison, i32 [[C]], i32 0
977
- // CHECK-NEXT: [[VI2:%.*]] = insertelement <2 x i32> [[VI]], i32 [[C1]], i32 1
978
- // CHECK-NEXT: store <2 x i32> [[VI2]], ptr [[X]], align 8
979
- // CHECK-NEXT: ret void
976
+ // CHECK-LABEL: define hidden void @_Z6case17v(
977
+ // CHECK-SAME: ) #[[ATTR0]] {
978
+ // CHECK-NEXT: [[ENTRY:.*:]]
979
+ // CHECK-NEXT: [[X:%.*]] = alloca <2 x i32>, align 8
980
+ // CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_Z12case17Helperi(i32 noundef 0) #[[ATTR2]]
981
+ // CHECK-NEXT: [[CALL1:%.*]] = call noundef i32 @_Z12case17Helperi(i32 noundef 1) #[[ATTR2]]
982
+ // CHECK-NEXT: [[VECINIT:%.*]] = insertelement <2 x i32> poison, i32 [[CALL]], i32 0
983
+ // CHECK-NEXT: [[VECINIT2:%.*]] = insertelement <2 x i32> [[VECINIT]], i32 [[CALL1]], i32 1
984
+ // CHECK-NEXT: store <2 x i32> [[VECINIT2]], ptr [[X]], align 8
985
+ // CHECK-NEXT: ret void
986
+ //
980
987
void case17 () {
981
988
int2 X = {case17Helper (0 ), case17Helper (1 )};
982
989
}
983
990
984
991
// InitList with Struct with unnamed bitfield on LHS
985
- // CHECK-LABEL: case18
986
- // CHECK: [[U:%.*]] = alloca %struct.Unnamed, align 1
987
- // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[U]], ptr align 1 {{.*}}, i32 5, i1 false)
992
+ // CHECK-LABEL: define hidden void @_Z6case18v(
993
+ // CHECK-SAME: ) #[[ATTR0]] {
994
+ // CHECK-NEXT: [[ENTRY:.*:]]
995
+ // CHECK-NEXT: [[U:%.*]] = alloca [[STRUCT_UNNAMED:%.*]], align 1
996
+ // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[U]], ptr align 1 @__const._Z6case18v.U, i32 5, i1 false)
997
+ // CHECK-NEXT: ret void
998
+ //
988
999
void case18 () {
989
1000
Unnamed U = {1 };
990
1001
}
991
1002
992
1003
// InitList with Struct with unnamed bitfield on RHS
993
- // CHECK-LABEL: case19
994
- // CHECK: [[TI:%.*]] = alloca %struct.TwoInts, align 1
995
- // CHECK-NEXT: [[Z:%.*]] = getelementptr inbounds nuw %struct.TwoInts, ptr [[TI]], i32 0, i32 0
996
- // CHECK-NEXT: [[A:%.*]] = getelementptr inbounds nuw %struct.Unnamed, ptr %U, i32 0, i32 0
997
- // CHECK-NEXT: [[L:%.*]] = load i32, ptr [[A]], align 1
998
- // CHECK-NEXT: store i32 [[L]], ptr [[Z]], align 1
999
- // CHECK-NEXT: [[W:%.*]] = getelementptr inbounds nuw %struct.TwoInts, ptr [[TI]], i32 0, i32 1
1000
- // CHECK-NEXT: store i32 1, ptr [[W]], align 1
1004
+ // CHECK-LABEL: define hidden void @_Z6case197Unnamed(
1005
+ // CHECK-SAME: ptr noundef byval([[STRUCT_UNNAMED:%.*]]) align 1 [[U:%.*]]) #[[ATTR0]] {
1006
+ // CHECK-NEXT: [[ENTRY:.*:]]
1007
+ // CHECK-NEXT: [[TI:%.*]] = alloca [[STRUCT_TWOINTS:%.*]], align 1
1008
+ // CHECK-NEXT: [[Z:%.*]] = getelementptr inbounds nuw [[STRUCT_TWOINTS]], ptr [[TI]], i32 0, i32 0
1009
+ // CHECK-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_UNNAMED]], ptr [[U]], i32 0, i32 0
1010
+ // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A]], align 1
1011
+ // CHECK-NEXT: store i32 [[TMP0]], ptr [[Z]], align 1
1012
+ // CHECK-NEXT: [[W:%.*]] = getelementptr inbounds nuw [[STRUCT_TWOINTS]], ptr [[TI]], i32 0, i32 1
1013
+ // CHECK-NEXT: store i32 1, ptr [[W]], align 1
1014
+ // CHECK-NEXT: ret void
1015
+ //
1001
1016
void case19 (Unnamed U) {
1002
1017
TwoInts TI = {U, 1 };
1003
1018
}
1004
1019
1005
1020
// InitList with Empty Struct on LHS
1006
- // CHECK-LABEL: case20
1007
- // CHECK: [[E:%.*]] = alloca %struct.Empty, align 1
1008
- // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[E]], ptr align 1 [[ConstE]], i32 1, i1 false)
1021
+ // CHECK-LABEL: define hidden void @_Z6case20v(
1022
+ // CHECK-SAME: ) #[[ATTR0]] {
1023
+ // CHECK-NEXT: [[ENTRY:.*:]]
1024
+ // CHECK-NEXT: [[E:%.*]] = alloca [[STRUCT_EMPTY:%.*]], align 1
1025
+ // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[E]], ptr align 1 @__const._Z6case20v.E, i32 1, i1 false)
1026
+ // CHECK-NEXT: ret void
1027
+ //
1009
1028
void case20 () {
1010
1029
Empty E = {};
1011
1030
}
1012
1031
1013
1032
// InitList with Empty Struct on RHS
1014
- // CHECK-LABEL: case21
1015
- // CHECK: [[TI:%.*]] = alloca %struct.TwoInts, align 1
1016
- // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %TI, ptr align 1 {{.*}}, i32 8, i1 false)
1033
+ // CHECK-LABEL: define hidden void @_Z6case215Empty(
1034
+ // CHECK-SAME: ptr noundef byval([[STRUCT_EMPTY:%.*]]) align 1 [[E:%.*]]) #[[ATTR0]] {
1035
+ // CHECK-NEXT: [[ENTRY:.*:]]
1036
+ // CHECK-NEXT: [[TI:%.*]] = alloca [[STRUCT_TWOINTS:%.*]], align 1
1037
+ // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[TI]], ptr align 1 @__const._Z6case215Empty.TI, i32 8, i1 false)
1038
+ // CHECK-NEXT: ret void
1039
+ //
1017
1040
void case21 (Empty E) {
1018
1041
TwoInts TI = {E, 1 , 2 };
1019
1042
}
1020
1043
1021
1044
// InitList with Struct with only unnamed bitfield on LHS
1022
- // CHECK-LABEL: case22
1023
- // CHECK: [[UO:%.*]] = alloca %struct.UnnamedOnly, align 1
1024
- // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[UO]], ptr align 1 [[ConstUO]], i32 1, i1 false)
1045
+ // CHECK-LABEL: define hidden void @_Z6case22v(
1046
+ // CHECK-SAME: ) #[[ATTR0]] {
1047
+ // CHECK-NEXT: [[ENTRY:.*:]]
1048
+ // CHECK-NEXT: [[UO:%.*]] = alloca [[STRUCT_UNNAMEDONLY:%.*]], align 1
1049
+ // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[UO]], ptr align 1 @__const._Z6case22v.UO, i32 1, i1 false)
1050
+ // CHECK-NEXT: ret void
1051
+ //
1025
1052
void case22 () {
1026
- UnnamedOnly UO = {};
1053
+ UnnamedOnly UO = {};
1027
1054
}
1028
1055
1029
1056
// InitList with Struct with only unnamed bitfield on RHS
1030
- // CHECK-LABEL: case23
1031
- // CHECK: [[TI:%.*]] = alloca %struct.TwoInts, align 1
1032
- // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[TI]], ptr align 1 {{.*}}, i32 8, i1 false)
1057
+ // CHECK-LABEL: define hidden void @_Z6case2311UnnamedOnly(
1058
+ // CHECK-SAME: ptr noundef byval([[STRUCT_UNNAMEDONLY:%.*]]) align 1 [[UO:%.*]]) #[[ATTR0]] {
1059
+ // CHECK-NEXT: [[ENTRY:.*:]]
1060
+ // CHECK-NEXT: [[TI:%.*]] = alloca [[STRUCT_TWOINTS:%.*]], align 1
1061
+ // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[TI]], ptr align 1 @__const._Z6case2311UnnamedOnly.TI, i32 8, i1 false)
1062
+ // CHECK-NEXT: ret void
1063
+ //
1033
1064
void case23 (UnnamedOnly UO) {
1034
1065
TwoInts TI = {UO, 1 , 2 };
1035
1066
}
1036
1067
1037
1068
// InitList with Derived empty struct on LHS
1038
1069
// InitList with Derived unnamed bitfield on LHS
1039
- // CHECK-LABEL: case24
1040
- // CHECK: [[ED:%.*]] = alloca %struct.EmptyDerived, align 1
1041
- // CHECK-NEXT: [[UD:%.*]] = alloca %struct.UnnamedDerived, align 1
1042
- // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %ED, ptr align 1 [[ConstED]], i32 1, i1 false)
1043
- // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %UD, ptr align 1 [[ConstUD]], i32 1, i1 false)
1070
+ // CHECK-LABEL: define hidden void @_Z6case24v(
1071
+ // CHECK-SAME: ) #[[ATTR0]] {
1072
+ // CHECK-NEXT: [[ENTRY:.*:]]
1073
+ // CHECK-NEXT: [[ED:%.*]] = alloca [[STRUCT_EMPTYDERIVED:%.*]], align 1
1074
+ // CHECK-NEXT: [[UD:%.*]] = alloca [[STRUCT_UNNAMEDDERIVED:%.*]], align 1
1075
+ // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[ED]], ptr align 1 @__const._Z6case24v.ED, i32 1, i1 false)
1076
+ // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[UD]], ptr align 1 @__const._Z6case24v.UD, i32 1, i1 false)
1077
+ // CHECK-NEXT: ret void
1078
+ //
1044
1079
void case24 () {
1045
1080
EmptyDerived ED = {};
1046
1081
UnnamedDerived UD = {};
1047
1082
}
1048
1083
1049
- // CHECK-LABEL: case25
1050
- // CHECK: [[TI1:%.*]] = alloca %struct.TwoInts, align 1
1051
- // CHECK-NEXT: [[TI2:%.*]] = alloca %struct.TwoInts, align 1
1052
- // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %TI1, ptr align 1 {{.*}}, i32 8, i1 false)
1053
- // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %TI2, ptr align 1 {{.*}}, i32 8, i1 false)
1084
+ // CHECK-LABEL: define hidden void @_Z6case2512EmptyDerived14UnnamedDerived(
1085
+ // CHECK-SAME: ptr noundef byval([[STRUCT_EMPTYDERIVED:%.*]]) align 1 [[ED:%.*]], ptr noundef byval([[STRUCT_UNNAMEDDERIVED:%.*]]) align 1 [[UD:%.*]]) #[[ATTR0]] {
1086
+ // CHECK-NEXT: [[ENTRY:.*:]]
1087
+ // CHECK-NEXT: [[TI1:%.*]] = alloca [[STRUCT_TWOINTS:%.*]], align 1
1088
+ // CHECK-NEXT: [[TI2:%.*]] = alloca [[STRUCT_TWOINTS]], align 1
1089
+ // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[TI1]], ptr align 1 @__const._Z6case2512EmptyDerived14UnnamedDerived.TI1, i32 8, i1 false)
1090
+ // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[TI2]], ptr align 1 @__const._Z6case2512EmptyDerived14UnnamedDerived.TI2, i32 8, i1 false)
1091
+ // CHECK-NEXT: ret void
1092
+ //
1054
1093
void case25 (EmptyDerived ED, UnnamedDerived UD) {
1055
1094
TwoInts TI1 = {ED, 1 , 2 };
1056
1095
TwoInts TI2 = {UD, 1 , 2 };
1057
1096
}
1097
+
1098
+ // CHECK-LABEL: define hidden void @_Z6case267TwoInts(
1099
+ // CHECK-SAME: ptr noundef byval([[STRUCT_TWOINTS:%.*]]) align 1 [[TI:%.*]]) #[[ATTR0]] {
1100
+ // CHECK-NEXT: [[ENTRY:.*:]]
1101
+ // CHECK-NEXT: [[F:%.*]] = alloca <4 x float>, align 16
1102
+ // CHECK-NEXT: [[F2:%.*]] = alloca <3 x float>, align 16
1103
+ // CHECK-NEXT: [[Z:%.*]] = getelementptr inbounds nuw [[STRUCT_TWOINTS]], ptr [[TI]], i32 0, i32 0
1104
+ // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[Z]], align 1
1105
+ // CHECK-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
1106
+ // CHECK-NEXT: [[VECINIT:%.*]] = insertelement <4 x float> poison, float [[CONV]], i32 0
1107
+ // CHECK-NEXT: [[W:%.*]] = getelementptr inbounds nuw [[STRUCT_TWOINTS]], ptr [[TI]], i32 0, i32 1
1108
+ // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[W]], align 1
1109
+ // CHECK-NEXT: [[CONV1:%.*]] = sitofp i32 [[TMP1]] to float
1110
+ // CHECK-NEXT: [[VECINIT2:%.*]] = insertelement <4 x float> [[VECINIT]], float [[CONV1]], i32 1
1111
+ // CHECK-NEXT: [[VECINIT3:%.*]] = insertelement <4 x float> [[VECINIT2]], float 1.000000e+00, i32 2
1112
+ // CHECK-NEXT: [[VECINIT4:%.*]] = insertelement <4 x float> [[VECINIT3]], float 2.000000e+00, i32 3
1113
+ // CHECK-NEXT: store <4 x float> [[VECINIT4]], ptr [[F]], align 16
1114
+ // CHECK-NEXT: [[Z5:%.*]] = getelementptr inbounds nuw [[STRUCT_TWOINTS]], ptr [[TI]], i32 0, i32 0
1115
+ // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[Z5]], align 1
1116
+ // CHECK-NEXT: [[CONV6:%.*]] = sitofp i32 [[TMP2]] to float
1117
+ // CHECK-NEXT: [[VECINIT7:%.*]] = insertelement <3 x float> <float 3.000000e+00, float poison, float poison>, float [[CONV6]], i32 1
1118
+ // CHECK-NEXT: [[W8:%.*]] = getelementptr inbounds nuw [[STRUCT_TWOINTS]], ptr [[TI]], i32 0, i32 1
1119
+ // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[W8]], align 1
1120
+ // CHECK-NEXT: [[CONV9:%.*]] = sitofp i32 [[TMP3]] to float
1121
+ // CHECK-NEXT: [[VECINIT10:%.*]] = insertelement <3 x float> [[VECINIT7]], float [[CONV9]], i32 2
1122
+ // CHECK-NEXT: store <3 x float> [[VECINIT10]], ptr [[F2]], align 16
1123
+ // CHECK-NEXT: ret void
1124
+ //
1125
+ void case26 (TwoInts TI) {
1126
+ float4 F = float4 (TI, 1 , 2 );
1127
+ float3 F2 = float3 (3 , TI);
1128
+ }
1129
+ //.
1130
+ // CHECK: [[META3]] = !{}
1131
+ // CHECK: [[META4]] = !{i64 4}
1132
+ //.
0 commit comments