@@ -11,10 +11,10 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
11
11
; TEST 1
12
12
;;
13
13
;.
14
- ; CHECK: @[[A1:[a-zA-Z0-9_$"\\.-]+]] = common global i8 0, align 8
15
- ; CHECK: @[[A2:[a-zA-Z0-9_$"\\.-]+]] = common global i8 0, align 16
16
- ; CHECK: @[[CND:[a-zA-Z0-9_$"\\.-]+]] = external global i1
17
- ; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = global i8 0, align 32
14
+ ; CHECK: @a1 = common global i8 0, align 8
15
+ ; CHECK: @a2 = common global i8 0, align 16
16
+ ; CHECK: @cnd = external global i1
17
+ ; CHECK: @G = global i8 0, align 32
18
18
;.
19
19
define ptr @test1 (ptr align 8 %0 ) #0 {
20
20
; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable
@@ -158,18 +158,31 @@ define internal ptr @f1(ptr readnone %0) local_unnamed_addr #0 {
158
158
159
159
; Function Attrs: nounwind readnone ssp uwtable
160
160
define ptr @f2 (ptr readnone %0 ) local_unnamed_addr #0 {
161
- ; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable
162
- ; CHECK-LABEL: define {{[^@]+}}@f2
163
- ; CHECK-SAME: (ptr nofree readnone [[TMP0:%.*]]) local_unnamed_addr #[[ATTR0]] {
164
- ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
165
- ; CHECK-NEXT: br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]]
166
- ; CHECK: 3:
167
- ; CHECK-NEXT: br label [[TMP5:%.*]]
168
- ; CHECK: 4:
169
- ; CHECK-NEXT: br label [[TMP5]]
170
- ; CHECK: 5:
171
- ; CHECK-NEXT: [[TMP6:%.*]] = phi ptr [ [[TMP0]], [[TMP3]] ], [ @a1, [[TMP4]] ]
172
- ; CHECK-NEXT: ret ptr [[TMP6]]
161
+ ; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable
162
+ ; TUNIT-LABEL: define {{[^@]+}}@f2
163
+ ; TUNIT-SAME: (ptr nofree readnone [[TMP0:%.*]]) local_unnamed_addr #[[ATTR0]] {
164
+ ; TUNIT-NEXT: [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
165
+ ; TUNIT-NEXT: br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]]
166
+ ; TUNIT: 3:
167
+ ; TUNIT-NEXT: br label [[TMP5:%.*]]
168
+ ; TUNIT: 4:
169
+ ; TUNIT-NEXT: br label [[TMP5]]
170
+ ; TUNIT: 5:
171
+ ; TUNIT-NEXT: [[TMP6:%.*]] = phi ptr [ [[TMP0]], [[TMP3]] ], [ @a1, [[TMP4]] ]
172
+ ; TUNIT-NEXT: ret ptr [[TMP6]]
173
+ ;
174
+ ; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable
175
+ ; CGSCC-LABEL: define {{[^@]+}}@f2
176
+ ; CGSCC-SAME: (ptr nofree readnone [[TMP0:%.*]]) local_unnamed_addr #[[ATTR0]] {
177
+ ; CGSCC-NEXT: [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
178
+ ; CGSCC-NEXT: br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]]
179
+ ; CGSCC: 3:
180
+ ; CGSCC-NEXT: br label [[TMP5:%.*]]
181
+ ; CGSCC: 4:
182
+ ; CGSCC-NEXT: br label [[TMP5]]
183
+ ; CGSCC: 5:
184
+ ; CGSCC-NEXT: [[TMP6:%.*]] = phi ptr [ [[TMP0]], [[TMP3]] ], [ @a1, [[TMP4]] ]
185
+ ; CGSCC-NEXT: ret ptr [[TMP6]]
173
186
;
174
187
%2 = icmp eq ptr %0 , null
175
188
br i1 %2 , label %5 , label %3
@@ -222,7 +235,7 @@ define align 4 ptr @test7() #0 {
222
235
; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable
223
236
; CGSCC-LABEL: define {{[^@]+}}@test7
224
237
; CGSCC-SAME: () #[[ATTR1:[0-9]+]] {
225
- ; CGSCC-NEXT: [[C:%.*]] = tail call noundef nonnull align 8 dereferenceable(1) ptr @f1() #[[ATTR14 :[0-9]+]]
238
+ ; CGSCC-NEXT: [[C:%.*]] = tail call noundef nonnull align 8 dereferenceable(1) ptr @f1() #[[ATTR15 :[0-9]+]]
226
239
; CGSCC-NEXT: ret ptr [[C]]
227
240
;
228
241
%c = tail call ptr @f1 (ptr align 8 dereferenceable (1 ) @a1 )
@@ -933,7 +946,7 @@ define i32 @musttail_caller_1(ptr %p) {
933
946
; TUNIT-NEXT: [[C:%.*]] = load i1, ptr @cnd, align 1
934
947
; TUNIT-NEXT: br i1 [[C]], label [[MT:%.*]], label [[EXIT:%.*]]
935
948
; TUNIT: mt:
936
- ; TUNIT-NEXT: [[V:%.*]] = musttail call i32 @musttail_callee_1(ptr nocapture nofree noundef readonly [[P]]) #[[ATTR12 :[0-9]+]]
949
+ ; TUNIT-NEXT: [[V:%.*]] = musttail call i32 @musttail_callee_1(ptr nocapture nofree noundef readonly [[P]]) #[[ATTR13 :[0-9]+]]
937
950
; TUNIT-NEXT: ret i32 [[V]]
938
951
; TUNIT: exit:
939
952
; TUNIT-NEXT: ret i32 0
@@ -944,7 +957,7 @@ define i32 @musttail_caller_1(ptr %p) {
944
957
; CGSCC-NEXT: [[C:%.*]] = load i1, ptr @cnd, align 1
945
958
; CGSCC-NEXT: br i1 [[C]], label [[MT:%.*]], label [[EXIT:%.*]]
946
959
; CGSCC: mt:
947
- ; CGSCC-NEXT: [[V:%.*]] = musttail call i32 @musttail_callee_1(ptr nocapture nofree noundef nonnull readonly dereferenceable(4) [[P]]) #[[ATTR15 :[0-9]+]]
960
+ ; CGSCC-NEXT: [[V:%.*]] = musttail call i32 @musttail_callee_1(ptr nocapture nofree noundef nonnull readonly dereferenceable(4) [[P]]) #[[ATTR16 :[0-9]+]]
948
961
; CGSCC-NEXT: ret i32 [[V]]
949
962
; CGSCC: exit:
950
963
; CGSCC-NEXT: ret i32 0
@@ -1076,13 +1089,13 @@ define ptr @aligned_8_return_caller(ptr align(16) %a, i1 %c1, i1 %c2) {
1076
1089
; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
1077
1090
; TUNIT-LABEL: define {{[^@]+}}@aligned_8_return_caller
1078
1091
; TUNIT-SAME: (ptr nofree readnone align 16 "no-capture-maybe-returned" [[A:%.*]], i1 [[C1:%.*]], i1 [[C2:%.*]]) #[[ATTR10]] {
1079
- ; TUNIT-NEXT: [[R:%.*]] = call align 8 ptr @aligned_8_return(ptr noalias nofree readnone align 16 "no-capture-maybe-returned" [[A]], i1 noundef [[C1]], i1 [[C2]]) #[[ATTR13 :[0-9]+]]
1092
+ ; TUNIT-NEXT: [[R:%.*]] = call align 8 ptr @aligned_8_return(ptr noalias nofree readnone align 16 "no-capture-maybe-returned" [[A]], i1 noundef [[C1]], i1 [[C2]]) #[[ATTR14 :[0-9]+]]
1080
1093
; TUNIT-NEXT: ret ptr [[R]]
1081
1094
;
1082
1095
; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)
1083
1096
; CGSCC-LABEL: define {{[^@]+}}@aligned_8_return_caller
1084
1097
; CGSCC-SAME: (ptr nofree readnone align 16 [[A:%.*]], i1 noundef [[C1:%.*]], i1 [[C2:%.*]]) #[[ATTR13:[0-9]+]] {
1085
- ; CGSCC-NEXT: [[R:%.*]] = call align 8 ptr @aligned_8_return(ptr noalias nofree readnone align 16 [[A]], i1 noundef [[C1]], i1 [[C2]]) #[[ATTR14 ]]
1098
+ ; CGSCC-NEXT: [[R:%.*]] = call align 8 ptr @aligned_8_return(ptr noalias nofree readnone align 16 [[A]], i1 noundef [[C1]], i1 [[C2]]) #[[ATTR15 ]]
1086
1099
; CGSCC-NEXT: ret ptr [[R]]
1087
1100
;
1088
1101
%r = call ptr @aligned_8_return (ptr %a , i1 %c1 , i1 %c2 )
@@ -1101,6 +1114,104 @@ entry:
1101
1114
ret i32 0
1102
1115
}
1103
1116
1117
+ define i64 @infer_align_atomicrmw (ptr align 4 %p ) {
1118
+ ; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)
1119
+ ; TUNIT-LABEL: define {{[^@]+}}@infer_align_atomicrmw
1120
+ ; TUNIT-SAME: (ptr nocapture nofree align 16 [[P:%.*]]) #[[ATTR12:[0-9]+]] {
1121
+ ; TUNIT-NEXT: [[ARRAYIDX0:%.*]] = getelementptr i64, ptr [[P]], i64 1
1122
+ ; TUNIT-NEXT: [[ARRAYIDX1:%.*]] = getelementptr i64, ptr [[ARRAYIDX0]], i64 3
1123
+ ; TUNIT-NEXT: [[RET:%.*]] = atomicrmw add ptr [[ARRAYIDX1]], i64 4 seq_cst, align 16
1124
+ ; TUNIT-NEXT: ret i64 [[RET]]
1125
+ ;
1126
+ ; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)
1127
+ ; CGSCC-LABEL: define {{[^@]+}}@infer_align_atomicrmw
1128
+ ; CGSCC-SAME: (ptr nocapture nofree align 16 [[P:%.*]]) #[[ATTR14:[0-9]+]] {
1129
+ ; CGSCC-NEXT: [[ARRAYIDX0:%.*]] = getelementptr i64, ptr [[P]], i64 1
1130
+ ; CGSCC-NEXT: [[ARRAYIDX1:%.*]] = getelementptr i64, ptr [[ARRAYIDX0]], i64 3
1131
+ ; CGSCC-NEXT: [[RET:%.*]] = atomicrmw add ptr [[ARRAYIDX1]], i64 4 seq_cst, align 16
1132
+ ; CGSCC-NEXT: ret i64 [[RET]]
1133
+ ;
1134
+ %arrayidx0 = getelementptr i64 , ptr %p , i64 1
1135
+ %arrayidx1 = getelementptr i64 , ptr %arrayidx0 , i64 3
1136
+ %ret = atomicrmw add ptr %arrayidx1 , i64 4 seq_cst , align 16
1137
+ ret i64 %ret
1138
+ }
1139
+
1140
+ define ptr @infer_align_atomicrmw_ptr (ptr align 4 %p , ptr %val ) {
1141
+ ; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)
1142
+ ; TUNIT-LABEL: define {{[^@]+}}@infer_align_atomicrmw_ptr
1143
+ ; TUNIT-SAME: (ptr nocapture nofree align 16 [[P:%.*]], ptr nofree [[VAL:%.*]]) #[[ATTR12]] {
1144
+ ; TUNIT-NEXT: [[ARRAYIDX0:%.*]] = getelementptr i64, ptr [[P]], i64 1
1145
+ ; TUNIT-NEXT: [[ARRAYIDX1:%.*]] = getelementptr i64, ptr [[ARRAYIDX0]], i64 3
1146
+ ; TUNIT-NEXT: [[RET:%.*]] = atomicrmw xchg ptr [[ARRAYIDX1]], ptr [[VAL]] seq_cst, align 16
1147
+ ; TUNIT-NEXT: ret ptr [[RET]]
1148
+ ;
1149
+ ; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)
1150
+ ; CGSCC-LABEL: define {{[^@]+}}@infer_align_atomicrmw_ptr
1151
+ ; CGSCC-SAME: (ptr nocapture nofree align 16 [[P:%.*]], ptr nofree [[VAL:%.*]]) #[[ATTR14]] {
1152
+ ; CGSCC-NEXT: [[ARRAYIDX0:%.*]] = getelementptr i64, ptr [[P]], i64 1
1153
+ ; CGSCC-NEXT: [[ARRAYIDX1:%.*]] = getelementptr i64, ptr [[ARRAYIDX0]], i64 3
1154
+ ; CGSCC-NEXT: [[RET:%.*]] = atomicrmw xchg ptr [[ARRAYIDX1]], ptr [[VAL]] seq_cst, align 16
1155
+ ; CGSCC-NEXT: ret ptr [[RET]]
1156
+ ;
1157
+ %arrayidx0 = getelementptr i64 , ptr %p , i64 1
1158
+ %arrayidx1 = getelementptr i64 , ptr %arrayidx0 , i64 3
1159
+ %ret = atomicrmw xchg ptr %arrayidx1 , ptr %val seq_cst , align 16
1160
+ ret ptr %ret
1161
+ }
1162
+
1163
+ define i64 @infer_align_cmpxchg (ptr align 4 %p ) {
1164
+ ; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)
1165
+ ; TUNIT-LABEL: define {{[^@]+}}@infer_align_cmpxchg
1166
+ ; TUNIT-SAME: (ptr nocapture nofree align 16 [[P:%.*]]) #[[ATTR12]] {
1167
+ ; TUNIT-NEXT: [[ARRAYIDX0:%.*]] = getelementptr i64, ptr [[P]], i64 1
1168
+ ; TUNIT-NEXT: [[ARRAYIDX1:%.*]] = getelementptr i64, ptr [[ARRAYIDX0]], i64 3
1169
+ ; TUNIT-NEXT: [[CMPX:%.*]] = cmpxchg ptr [[ARRAYIDX1]], i64 4, i64 1 seq_cst seq_cst, align 16
1170
+ ; TUNIT-NEXT: [[RET:%.*]] = extractvalue { i64, i1 } [[CMPX]], 0
1171
+ ; TUNIT-NEXT: ret i64 [[RET]]
1172
+ ;
1173
+ ; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)
1174
+ ; CGSCC-LABEL: define {{[^@]+}}@infer_align_cmpxchg
1175
+ ; CGSCC-SAME: (ptr nocapture nofree align 16 [[P:%.*]]) #[[ATTR14]] {
1176
+ ; CGSCC-NEXT: [[ARRAYIDX0:%.*]] = getelementptr i64, ptr [[P]], i64 1
1177
+ ; CGSCC-NEXT: [[ARRAYIDX1:%.*]] = getelementptr i64, ptr [[ARRAYIDX0]], i64 3
1178
+ ; CGSCC-NEXT: [[CMPX:%.*]] = cmpxchg ptr [[ARRAYIDX1]], i64 4, i64 1 seq_cst seq_cst, align 16
1179
+ ; CGSCC-NEXT: [[RET:%.*]] = extractvalue { i64, i1 } [[CMPX]], 0
1180
+ ; CGSCC-NEXT: ret i64 [[RET]]
1181
+ ;
1182
+ %arrayidx0 = getelementptr i64 , ptr %p , i64 1
1183
+ %arrayidx1 = getelementptr i64 , ptr %arrayidx0 , i64 3
1184
+ %cmpx = cmpxchg ptr %arrayidx1 , i64 4 , i64 1 seq_cst seq_cst , align 16
1185
+ %ret = extractvalue { i64 , i1 } %cmpx , 0
1186
+ ret i64 %ret
1187
+ }
1188
+
1189
+ define ptr @infer_align_cmpxchg_ptr (ptr align 4 %p , ptr %cmp0 , ptr %cmp1 ) {
1190
+ ; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)
1191
+ ; TUNIT-LABEL: define {{[^@]+}}@infer_align_cmpxchg_ptr
1192
+ ; TUNIT-SAME: (ptr nocapture nofree align 16 [[P:%.*]], ptr nofree [[CMP0:%.*]], ptr nofree [[CMP1:%.*]]) #[[ATTR12]] {
1193
+ ; TUNIT-NEXT: [[ARRAYIDX0:%.*]] = getelementptr i64, ptr [[P]], i64 1
1194
+ ; TUNIT-NEXT: [[ARRAYIDX1:%.*]] = getelementptr i64, ptr [[ARRAYIDX0]], i64 3
1195
+ ; TUNIT-NEXT: [[CMPX:%.*]] = cmpxchg ptr [[ARRAYIDX1]], ptr [[CMP0]], ptr [[CMP1]] seq_cst seq_cst, align 16
1196
+ ; TUNIT-NEXT: [[RET:%.*]] = extractvalue { ptr, i1 } [[CMPX]], 0
1197
+ ; TUNIT-NEXT: ret ptr [[RET]]
1198
+ ;
1199
+ ; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)
1200
+ ; CGSCC-LABEL: define {{[^@]+}}@infer_align_cmpxchg_ptr
1201
+ ; CGSCC-SAME: (ptr nocapture nofree align 16 [[P:%.*]], ptr nofree [[CMP0:%.*]], ptr nofree [[CMP1:%.*]]) #[[ATTR14]] {
1202
+ ; CGSCC-NEXT: [[ARRAYIDX0:%.*]] = getelementptr i64, ptr [[P]], i64 1
1203
+ ; CGSCC-NEXT: [[ARRAYIDX1:%.*]] = getelementptr i64, ptr [[ARRAYIDX0]], i64 3
1204
+ ; CGSCC-NEXT: [[CMPX:%.*]] = cmpxchg ptr [[ARRAYIDX1]], ptr [[CMP0]], ptr [[CMP1]] seq_cst seq_cst, align 16
1205
+ ; CGSCC-NEXT: [[RET:%.*]] = extractvalue { ptr, i1 } [[CMPX]], 0
1206
+ ; CGSCC-NEXT: ret ptr [[RET]]
1207
+ ;
1208
+ %arrayidx0 = getelementptr i64 , ptr %p , i64 1
1209
+ %arrayidx1 = getelementptr i64 , ptr %arrayidx0 , i64 3
1210
+ %cmpx = cmpxchg ptr %arrayidx1 , ptr %cmp0 , ptr %cmp1 seq_cst seq_cst , align 16
1211
+ %ret = extractvalue { ptr , i1 } %cmpx , 0
1212
+ ret ptr %ret
1213
+ }
1214
+
1104
1215
declare void @implicit_cast_callee (i64 )
1105
1216
1106
1217
attributes #0 = { nounwind uwtable noinline }
@@ -1119,8 +1230,9 @@ attributes #2 = { null_pointer_is_valid }
1119
1230
; TUNIT: attributes #[[ATTR9]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) }
1120
1231
; TUNIT: attributes #[[ATTR10]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
1121
1232
; TUNIT: attributes #[[ATTR11]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(read) }
1122
- ; TUNIT: attributes #[[ATTR12]] = { nofree nosync nounwind willreturn memory(read) }
1123
- ; TUNIT: attributes #[[ATTR13]] = { nofree nosync nounwind willreturn }
1233
+ ; TUNIT: attributes #[[ATTR12]] = { mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) }
1234
+ ; TUNIT: attributes #[[ATTR13]] = { nofree nosync nounwind willreturn memory(read) }
1235
+ ; TUNIT: attributes #[[ATTR14]] = { nofree nosync nounwind willreturn }
1124
1236
;.
1125
1237
; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable }
1126
1238
; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable }
@@ -1136,6 +1248,7 @@ attributes #2 = { null_pointer_is_valid }
1136
1248
; CGSCC: attributes #[[ATTR11]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
1137
1249
; CGSCC: attributes #[[ATTR12]] = { mustprogress nofree nosync nounwind willreturn memory(read) }
1138
1250
; CGSCC: attributes #[[ATTR13]] = { mustprogress nofree nosync nounwind willreturn memory(none) }
1139
- ; CGSCC: attributes #[[ATTR14]] = { nofree nosync willreturn }
1140
- ; CGSCC: attributes #[[ATTR15]] = { nofree willreturn memory(read) }
1251
+ ; CGSCC: attributes #[[ATTR14]] = { mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) }
1252
+ ; CGSCC: attributes #[[ATTR15]] = { nofree nosync willreturn }
1253
+ ; CGSCC: attributes #[[ATTR16]] = { nofree willreturn memory(read) }
1141
1254
;.
0 commit comments