4
4
5
5
%struct.T = type { i32 , [10 x [20 x i8 ]] }
6
6
7
+ declare noalias ptr @calloc (i64 , i64 ) allockind("alloc,zeroed" ) allocsize(0 ,1 ) "alloc-family" ="malloc"
8
+
7
9
define i8 @select_offsets_simplifiable_1 (i1 %cnd1 , i1 %cnd2 ) {
8
- ; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
9
10
; CHECK-LABEL: define {{[^@]+}}@select_offsets_simplifiable_1
10
- ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR0:[0-9]+]] {
11
+ ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) {
11
12
; CHECK-NEXT: entry:
12
- ; CHECK-NEXT: [[BYTES:%.*]] = alloca [1024 x i8], align 16
13
+ ; CHECK-NEXT: [[BYTES:%.*]] = call ptr @calloc(i64 noundef 1024, i64 noundef 1)
13
14
; CHECK-NEXT: [[GEP23:%.*]] = getelementptr inbounds [1024 x i8], ptr [[BYTES]], i64 0, i64 23
14
15
; CHECK-NEXT: store i8 23, ptr [[GEP23]], align 4
15
16
; CHECK-NEXT: [[GEP29:%.*]] = getelementptr inbounds [1024 x i8], ptr [[BYTES]], i64 0, i64 29
@@ -24,7 +25,7 @@ define i8 @select_offsets_simplifiable_1(i1 %cnd1, i1 %cnd2) {
24
25
; CHECK-NEXT: ret i8 [[I]]
25
26
;
26
27
entry:
27
- %Bytes = alloca [ 1024 x i8 ], align 16
28
+ %Bytes = call ptr @calloc ( i64 1024 , i64 1 )
28
29
29
30
%gep23 = getelementptr inbounds [1024 x i8 ], ptr %Bytes , i64 0 , i64 23
30
31
store i8 23 , ptr %gep23 , align 4
47
48
define i8 @select_offsets_simplifiable_2 (i1 %cnd1 , i1 %cnd2 ) {
48
49
; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
49
50
; CHECK-LABEL: define {{[^@]+}}@select_offsets_simplifiable_2
50
- ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR0 ]] {
51
+ ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1:[0-9]+ ]] {
51
52
; CHECK-NEXT: entry:
52
53
; CHECK-NEXT: [[BYTES:%.*]] = alloca [1024 x i8], align 16
53
54
; CHECK-NEXT: [[GEP23:%.*]] = getelementptr inbounds [1024 x i8], ptr [[BYTES]], i64 0, i64 23
90
91
define i8 @select_offsets_simplifiable_3 (i1 %cnd1 , i1 %cnd2 ) {
91
92
; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
92
93
; CHECK-LABEL: define {{[^@]+}}@select_offsets_simplifiable_3
93
- ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR0 ]] {
94
+ ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1 ]] {
94
95
; CHECK-NEXT: entry:
95
96
; CHECK-NEXT: [[BUNDLE:%.*]] = alloca [[STRUCT_T:%.*]], align 64
96
97
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CND1]], i64 1, i64 3
@@ -110,10 +111,33 @@ entry:
110
111
ret i8 %i
111
112
}
112
113
114
+ ; Similar to select_offsets_not_simplifiable_3 but with uninitialized memory.
115
+ define i8 @select_offsets_simplifiable_4 (i1 %cnd1 , i1 %cnd2 ) {
116
+ ; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
117
+ ; CHECK-LABEL: define {{[^@]+}}@select_offsets_simplifiable_4
118
+ ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1]] {
119
+ ; CHECK-NEXT: entry:
120
+ ; CHECK-NEXT: [[BYTES:%.*]] = alloca [1024 x i8], align 16
121
+ ; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[CND1]], i64 23, i64 29
122
+ ; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CND2]], i64 [[SEL0]], i64 7
123
+ ; CHECK-NEXT: [[GEP_SEL:%.*]] = getelementptr inbounds [1024 x i8], ptr [[BYTES]], i64 0, i64 [[SEL1]]
124
+ ; CHECK-NEXT: ret i8 100
125
+ ;
126
+ entry:
127
+ %Bytes = alloca [1024 x i8 ], align 16
128
+ %sel0 = select i1 %cnd1 , i64 23 , i64 29
129
+ %sel1 = select i1 %cnd2 , i64 %sel0 , i64 7
130
+ %gep.sel = getelementptr inbounds [1024 x i8 ], ptr %Bytes , i64 0 , i64 %sel1
131
+ store i8 100 , ptr %gep.sel , align 4
132
+ %gep29 = getelementptr inbounds [1024 x i8 ], ptr %Bytes , i64 0 , i64 29
133
+ %i = load i8 , ptr %gep29 , align 4
134
+ ret i8 %i
135
+ }
136
+
113
137
define i8 @select_offsets_not_simplifiable_1 (i1 %cnd1 , i1 %cnd2 ) {
114
138
; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
115
139
; CHECK-LABEL: define {{[^@]+}}@select_offsets_not_simplifiable_1
116
- ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR0 ]] {
140
+ ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1 ]] {
117
141
; CHECK-NEXT: entry:
118
142
; CHECK-NEXT: [[BYTES:%.*]] = alloca [1024 x i8], align 16
119
143
; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[CND1]], i64 23, i64 29
@@ -138,7 +162,7 @@ entry:
138
162
define i8 @select_offsets_not_simplifiable_2 (i1 %cnd1 , i1 %cnd2 ) {
139
163
; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
140
164
; CHECK-LABEL: define {{[^@]+}}@select_offsets_not_simplifiable_2
141
- ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR0 ]] {
165
+ ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1 ]] {
142
166
; CHECK-NEXT: entry:
143
167
; CHECK-NEXT: [[BYTES:%.*]] = alloca [1024 x i8], align 16
144
168
; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[CND1]], i64 23, i64 29
@@ -163,11 +187,10 @@ entry:
163
187
}
164
188
165
189
define i8 @select_offsets_not_simplifiable_3 (i1 %cnd1 , i1 %cnd2 ) {
166
- ; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
167
190
; CHECK-LABEL: define {{[^@]+}}@select_offsets_not_simplifiable_3
168
- ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR0]] {
191
+ ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) {
169
192
; CHECK-NEXT: entry:
170
- ; CHECK-NEXT: [[BYTES:%.*]] = alloca [1024 x i8], align 16
193
+ ; CHECK-NEXT: [[BYTES:%.*]] = call ptr @calloc(i64 noundef 1024, i64 noundef 1)
171
194
; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[CND1]], i64 23, i64 29
172
195
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CND2]], i64 [[SEL0]], i64 7
173
196
; CHECK-NEXT: [[GEP_SEL:%.*]] = getelementptr inbounds [1024 x i8], ptr [[BYTES]], i64 0, i64 [[SEL1]]
@@ -177,7 +200,7 @@ define i8 @select_offsets_not_simplifiable_3(i1 %cnd1, i1 %cnd2) {
177
200
; CHECK-NEXT: ret i8 [[I]]
178
201
;
179
202
entry:
180
- %Bytes = alloca [ 1024 x i8 ], align 16
203
+ %Bytes = call ptr @calloc ( i64 1024 , i64 1 )
181
204
%sel0 = select i1 %cnd1 , i64 23 , i64 29
182
205
%sel1 = select i1 %cnd2 , i64 %sel0 , i64 7
183
206
%gep.sel = getelementptr inbounds [1024 x i8 ], ptr %Bytes , i64 0 , i64 %sel1
@@ -188,22 +211,21 @@ entry:
188
211
}
189
212
190
213
define i8 @select_offsets_not_simplifiable_4 (i1 %cnd1 , i1 %cnd2 ) {
191
- ; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
192
214
; CHECK-LABEL: define {{[^@]+}}@select_offsets_not_simplifiable_4
193
- ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR0]] {
215
+ ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) {
194
216
; CHECK-NEXT: entry:
195
- ; CHECK-NEXT: [[BYTES:%.*]] = alloca [1024 x i8], align 16
217
+ ; CHECK-NEXT: [[BYTES:%.*]] = call ptr @calloc(i64 noundef 1024, i64 noundef 1)
196
218
; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[CND1]], i64 23, i64 29
197
219
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CND2]], i64 [[SEL0]], i64 7
198
220
; CHECK-NEXT: [[GEP_SEL:%.*]] = getelementptr inbounds [1024 x i8], ptr [[BYTES]], i64 0, i64 [[SEL1]]
199
221
; CHECK-NEXT: [[GEP_PLUS:%.*]] = getelementptr inbounds i8, ptr [[GEP_SEL]], i64 3
200
222
; CHECK-NEXT: store i8 100, ptr [[GEP_PLUS]], align 4
201
223
; CHECK-NEXT: [[GEP32:%.*]] = getelementptr inbounds [1024 x i8], ptr [[BYTES]], i64 0, i64 32
202
- ; CHECK-NEXT: [[I:%.*]] = load i8, ptr [[GEP32]], align 16
224
+ ; CHECK-NEXT: [[I:%.*]] = load i8, ptr [[GEP32]], align 4
203
225
; CHECK-NEXT: ret i8 [[I]]
204
226
;
205
227
entry:
206
- %Bytes = alloca [ 1024 x i8 ], align 16
228
+ %Bytes = call ptr @calloc ( i64 1024 , i64 1 )
207
229
%sel0 = select i1 %cnd1 , i64 23 , i64 29
208
230
%sel1 = select i1 %cnd2 , i64 %sel0 , i64 7
209
231
%gep.sel = getelementptr inbounds [1024 x i8 ], ptr %Bytes , i64 0 , i64 %sel1
@@ -217,7 +239,7 @@ entry:
217
239
define i8 @select_offsets_not_simplifiable_5 (i1 %cnd1 , i1 %cnd2 ) {
218
240
; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
219
241
; CHECK-LABEL: define {{[^@]+}}@select_offsets_not_simplifiable_5
220
- ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR0 ]] {
242
+ ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1 ]] {
221
243
; CHECK-NEXT: entry:
222
244
; CHECK-NEXT: [[BUNDLE:%.*]] = alloca [[STRUCT_T:%.*]], align 64
223
245
; CHECK-NEXT: [[GEP_FIXED:%.*]] = getelementptr inbounds [[STRUCT_T]], ptr [[BUNDLE]], i64 0, i32 1, i64 3, i64 5
@@ -247,7 +269,7 @@ entry:
247
269
define i8 @select_gep_simplifiable_1 (i1 %cnd1 , i1 %cnd2 ) {
248
270
; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write)
249
271
; CHECK-LABEL: define {{[^@]+}}@select_gep_simplifiable_1
250
- ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1 :[0-9]+]] {
272
+ ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR2 :[0-9]+]] {
251
273
; CHECK-NEXT: entry:
252
274
; CHECK-NEXT: [[BYTES:%.*]] = alloca [1024 x i8], align 16
253
275
; CHECK-NEXT: [[GEP7:%.*]] = getelementptr inbounds [1024 x i8], ptr [[BYTES]], i64 0, i64 7
@@ -271,10 +293,11 @@ entry:
271
293
define i8 @select_gep_not_simplifiable_1 (i1 %cnd1 , i1 %cnd2 ) {
272
294
; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn
273
295
; CHECK-LABEL: define {{[^@]+}}@select_gep_not_simplifiable_1
274
- ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR2 :[0-9]+]] {
296
+ ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR3 :[0-9]+]] {
275
297
; CHECK-NEXT: entry:
276
298
; CHECK-NEXT: [[BYTES:%.*]] = alloca [1024 x i8], align 16
277
299
; CHECK-NEXT: [[GEP7:%.*]] = getelementptr inbounds [1024 x i8], ptr [[BYTES]], i64 0, i64 7
300
+ ; CHECK-NEXT: store i8 1, ptr [[GEP7]], align 4
278
301
; CHECK-NEXT: [[GEP23:%.*]] = getelementptr inbounds [1024 x i8], ptr [[BYTES]], i64 0, i64 23
279
302
; CHECK-NEXT: [[SEL_PTR:%.*]] = select i1 [[CND1]], ptr [[GEP7]], ptr [[GEP23]]
280
303
; CHECK-NEXT: store i8 42, ptr [[SEL_PTR]], align 4
@@ -284,6 +307,7 @@ define i8 @select_gep_not_simplifiable_1(i1 %cnd1, i1 %cnd2) {
284
307
entry:
285
308
%Bytes = alloca [1024 x i8 ], align 16
286
309
%gep7 = getelementptr inbounds [1024 x i8 ], ptr %Bytes , i64 0 , i64 7
310
+ store i8 1 , ptr %gep7 , align 4
287
311
%gep23 = getelementptr inbounds [1024 x i8 ], ptr %Bytes , i64 0 , i64 23
288
312
%sel.ptr = select i1 %cnd1 , ptr %gep7 , ptr %gep23
289
313
store i8 42 , ptr %sel.ptr , align 4
@@ -296,7 +320,7 @@ entry:
296
320
define i8 @phi_gep_simplifiable_1 (i1 %cnd1 , i1 %cnd2 ) {
297
321
; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn
298
322
; CHECK-LABEL: define {{[^@]+}}@phi_gep_simplifiable_1
299
- ; CHECK-SAME: (i1 noundef [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR2 ]] {
323
+ ; CHECK-SAME: (i1 noundef [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR3 ]] {
300
324
; CHECK-NEXT: entry:
301
325
; CHECK-NEXT: [[BYTES:%.*]] = alloca [1024 x i8], align 16
302
326
; CHECK-NEXT: br i1 [[CND1]], label [[THEN:%.*]], label [[ELSE:%.*]]
@@ -342,7 +366,7 @@ join:
342
366
define i8 @phi_gep_simplifiable_2 (i1 %cnd1 , i1 %cnd2 ) {
343
367
; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write)
344
368
; CHECK-LABEL: define {{[^@]+}}@phi_gep_simplifiable_2
345
- ; CHECK-SAME: (i1 noundef [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1 ]] {
369
+ ; CHECK-SAME: (i1 noundef [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR2 ]] {
346
370
; CHECK-NEXT: entry:
347
371
; CHECK-NEXT: [[BYTES:%.*]] = alloca [1024 x i8], align 16
348
372
; CHECK-NEXT: br i1 [[CND1]], label [[THEN:%.*]], label [[ELSE:%.*]]
@@ -383,7 +407,7 @@ join:
383
407
define i8 @phi_gep_not_simplifiable_1 (i1 %cnd1 , i1 %cnd2 ) {
384
408
; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn
385
409
; CHECK-LABEL: define {{[^@]+}}@phi_gep_not_simplifiable_1
386
- ; CHECK-SAME: (i1 noundef [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR2 ]] {
410
+ ; CHECK-SAME: (i1 noundef [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR3 ]] {
387
411
; CHECK-NEXT: entry:
388
412
; CHECK-NEXT: [[BYTES:%.*]] = alloca [1024 x i8], align 16
389
413
; CHECK-NEXT: [[GEP23:%.*]] = getelementptr inbounds [1024 x i8], ptr [[BYTES]], i64 0, i64 23
@@ -420,11 +444,10 @@ join:
420
444
}
421
445
422
446
define i8 @phi_gep_not_simplifiable_2 (i1 %cnd1 , i1 %cnd2 ) {
423
- ; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn
424
447
; CHECK-LABEL: define {{[^@]+}}@phi_gep_not_simplifiable_2
425
- ; CHECK-SAME: (i1 noundef [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR2]] {
448
+ ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) {
426
449
; CHECK-NEXT: entry:
427
- ; CHECK-NEXT: [[BYTES:%.*]] = alloca [1024 x i8], align 16
450
+ ; CHECK-NEXT: [[BYTES:%.*]] = call ptr @calloc(i64 noundef 1024, i64 noundef 1)
428
451
; CHECK-NEXT: [[GEP23:%.*]] = getelementptr inbounds [1024 x i8], ptr [[BYTES]], i64 0, i64 23
429
452
; CHECK-NEXT: br i1 [[CND1]], label [[THEN:%.*]], label [[ELSE:%.*]]
430
453
; CHECK: then:
@@ -439,7 +462,7 @@ define i8 @phi_gep_not_simplifiable_2(i1 %cnd1, i1 %cnd2) {
439
462
; CHECK-NEXT: ret i8 [[I]]
440
463
;
441
464
entry:
442
- %Bytes = alloca [ 1024 x i8 ], align 16
465
+ %Bytes = call ptr @calloc ( i64 1024 , i64 1 )
443
466
%gep23 = getelementptr inbounds [1024 x i8 ], ptr %Bytes , i64 0 , i64 23
444
467
br i1 %cnd1 , label %then , label %else
445
468
@@ -460,7 +483,7 @@ join:
460
483
define i8 @phi_offsets (i1 %cnd1 , i1 %cnd2 ) {
461
484
; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
462
485
; CHECK-LABEL: define {{[^@]+}}@phi_offsets
463
- ; CHECK-SAME: (i1 noundef [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR0 ]] {
486
+ ; CHECK-SAME: (i1 noundef [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1 ]] {
464
487
; CHECK-NEXT: entry:
465
488
; CHECK-NEXT: [[BYTES:%.*]] = alloca [1024 x i8], align 16
466
489
; CHECK-NEXT: br i1 [[CND1]], label [[THEN:%.*]], label [[ELSE:%.*]]
@@ -493,9 +516,10 @@ join:
493
516
}
494
517
495
518
;.
496
- ; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) }
497
- ; CHECK: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(write) }
498
- ; CHECK: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn }
519
+ ; CHECK: attributes #[[ATTR0:[0-9]+]] = { allockind("alloc,zeroed") allocsize(0,1) "alloc-family"="malloc" }
520
+ ; CHECK: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) }
521
+ ; CHECK: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(write) }
522
+ ; CHECK: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind willreturn }
499
523
;.
500
524
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
501
525
; CGSCC: {{.*}}
0 commit comments