1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
1
2
target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
2
3
; RUN: opt < %s -passes=alignment-from-assumptions -S | FileCheck %s
3
4
4
- define i32 @foo (ptr nocapture %a ) nounwind uwtable readonly {
5
+ define i32 @foo (ptr nocapture %a ) {
6
+ ; CHECK-LABEL: define i32 @foo
7
+ ; CHECK-SAME: (ptr nocapture [[A:%.*]]) {
8
+ ; CHECK-NEXT: entry:
9
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i32 32) ]
10
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A]], align 32
11
+ ; CHECK-NEXT: ret i32 [[TMP0]]
12
+ ;
5
13
entry:
6
14
tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i32 32 )]
7
15
%0 = load i32 , ptr %a , align 4
8
16
ret i32 %0
9
-
10
- ; CHECK-LABEL: @foo
11
- ; CHECK: load i32, ptr {{[^,]+}}, align 32
12
- ; CHECK: ret i32
13
17
}
14
18
15
- define i32 @foo2 (ptr nocapture %a ) nounwind uwtable readonly {
19
+ define i32 @foo2 (ptr nocapture %a ) {
20
+ ; CHECK-LABEL: define i32 @foo2
21
+ ; CHECK-SAME: (ptr nocapture [[A:%.*]]) {
22
+ ; CHECK-NEXT: entry:
23
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i32 32, i32 24) ]
24
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 -2
25
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 16
26
+ ; CHECK-NEXT: ret i32 [[TMP0]]
27
+ ;
16
28
entry:
17
29
tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i32 32 , i32 24 )]
18
30
%arrayidx = getelementptr inbounds i32 , ptr %a , i64 -2
19
31
%0 = load i32 , ptr %arrayidx , align 4
20
32
ret i32 %0
21
-
22
- ; CHECK-LABEL: @foo2
23
- ; CHECK: load i32, ptr {{[^,]+}}, align 16
24
- ; CHECK: ret i32
25
33
}
26
34
27
- define i32 @foo2a (ptr nocapture %a ) nounwind uwtable readonly {
35
+ define i32 @foo2a (ptr nocapture %a ) {
36
+ ; CHECK-LABEL: define i32 @foo2a
37
+ ; CHECK-SAME: (ptr nocapture [[A:%.*]]) {
38
+ ; CHECK-NEXT: entry:
39
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i32 32, i32 28) ]
40
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 1
41
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 32
42
+ ; CHECK-NEXT: ret i32 [[TMP0]]
43
+ ;
28
44
entry:
29
45
tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i32 32 , i32 28 )]
30
46
%arrayidx = getelementptr inbounds i32 , ptr %a , i64 1
31
47
%0 = load i32 , ptr %arrayidx , align 4
32
48
ret i32 %0
33
-
34
- ; CHECK-LABEL: @foo2a
35
- ; CHECK: load i32, ptr {{[^,]+}}, align 32
36
- ; CHECK: ret i32
37
49
}
38
50
39
51
; TODO: this can be 8-bytes aligned
40
- define i32 @foo2b (ptr nocapture %a ) nounwind uwtable readonly {
52
+ define i32 @foo2b (ptr nocapture %a ) {
53
+ ; CHECK-LABEL: define i32 @foo2b
54
+ ; CHECK-SAME: (ptr nocapture [[A:%.*]]) {
55
+ ; CHECK-NEXT: entry:
56
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i32 32, i32 28) ]
57
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 -1
58
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
59
+ ; CHECK-NEXT: ret i32 [[TMP0]]
60
+ ;
41
61
entry:
42
62
tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i32 32 , i32 28 )]
43
63
%arrayidx = getelementptr inbounds i32 , ptr %a , i64 -1
44
64
%0 = load i32 , ptr %arrayidx , align 4
45
65
ret i32 %0
46
-
47
- ; CHECK-LABEL: @foo2b
48
- ; CHECK: load i32, ptr {{[^,]+}}, align 4
49
- ; CHECK: ret i32
50
66
}
51
67
52
- define i32 @goo (ptr nocapture %a ) nounwind uwtable readonly {
68
+ define i32 @goo (ptr nocapture %a ) {
69
+ ; CHECK-LABEL: define i32 @goo
70
+ ; CHECK-SAME: (ptr nocapture [[A:%.*]]) {
71
+ ; CHECK-NEXT: entry:
72
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i32 32, i32 0) ]
73
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A]], align 32
74
+ ; CHECK-NEXT: ret i32 [[TMP0]]
75
+ ;
53
76
entry:
54
77
tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i32 32 , i32 0 )]
55
78
%0 = load i32 , ptr %a , align 4
56
79
ret i32 %0
57
-
58
- ; CHECK-LABEL: @goo
59
- ; CHECK: load i32, ptr {{[^,]+}}, align 32
60
- ; CHECK: ret i32
61
80
}
62
81
63
- define i32 @hoo (ptr nocapture %a ) nounwind uwtable readonly {
82
+ define i32 @hoo (ptr nocapture %a ) {
83
+ ; CHECK-LABEL: define i32 @hoo
84
+ ; CHECK-SAME: (ptr nocapture [[A:%.*]]) {
85
+ ; CHECK-NEXT: entry:
86
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32, i32 0) ]
87
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
88
+ ; CHECK: for.body:
89
+ ; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
90
+ ; CHECK-NEXT: [[R_06:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD:%.*]], [[FOR_BODY]] ]
91
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV]]
92
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 32
93
+ ; CHECK-NEXT: [[ADD]] = add nsw i32 [[TMP0]], [[R_06]]
94
+ ; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 8
95
+ ; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
96
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP1]], 2048
97
+ ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
98
+ ; CHECK: for.end:
99
+ ; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ]
100
+ ; CHECK-NEXT: ret i32 [[ADD_LCSSA]]
101
+ ;
64
102
entry:
65
103
tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i64 32 , i32 0 )]
66
104
br label %for.body
@@ -79,10 +117,6 @@ for.body: ; preds = %entry, %for.body
79
117
for.end: ; preds = %for.body
80
118
%add.lcssa = phi i32 [ %add , %for.body ]
81
119
ret i32 %add.lcssa
82
-
83
- ; CHECK-LABEL: @hoo
84
- ; CHECK: load i32, ptr %arrayidx, align 32
85
- ; CHECK: ret i32 %add.lcssa
86
120
}
87
121
88
122
; test D66575
@@ -91,7 +125,41 @@ for.end: ; preds = %for.body
91
125
; for i1 in range(0, 4096, 32):
92
126
; for i2 in range(0, 4096, 32):
93
127
; load(a, i0+i1+i2+32)
94
- define void @hoo2 (ptr nocapture %a , i64 %id , i64 %num ) nounwind uwtable readonly {
128
+ define void @hoo2 (ptr nocapture %a , i64 %id , i64 %num ) {
129
+ ; CHECK-LABEL: define void @hoo2
130
+ ; CHECK-SAME: (ptr nocapture [[A:%.*]], i64 [[ID:%.*]], i64 [[NUM:%.*]]) {
131
+ ; CHECK-NEXT: entry:
132
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i8 32, i64 0) ]
133
+ ; CHECK-NEXT: [[ID_MUL:%.*]] = shl nsw i64 [[ID]], 6
134
+ ; CHECK-NEXT: [[NUM_MUL:%.*]] = shl nsw i64 [[NUM]], 6
135
+ ; CHECK-NEXT: br label [[FOR0_BODY:%.*]]
136
+ ; CHECK: for0.body:
137
+ ; CHECK-NEXT: [[I0:%.*]] = phi i64 [ [[ID_MUL]], [[ENTRY:%.*]] ], [ [[I0_NEXT:%.*]], [[FOR0_END:%.*]] ]
138
+ ; CHECK-NEXT: br label [[FOR1_BODY:%.*]]
139
+ ; CHECK: for1.body:
140
+ ; CHECK-NEXT: [[I1:%.*]] = phi i64 [ 0, [[FOR0_BODY]] ], [ [[I1_NEXT:%.*]], [[FOR1_END:%.*]] ]
141
+ ; CHECK-NEXT: br label [[FOR2_BODY:%.*]]
142
+ ; CHECK: for2.body:
143
+ ; CHECK-NEXT: [[I2:%.*]] = phi i64 [ 0, [[FOR1_BODY]] ], [ [[I2_NEXT:%.*]], [[FOR2_BODY]] ]
144
+ ; CHECK-NEXT: [[T1:%.*]] = add nuw nsw i64 [[I0]], [[I1]]
145
+ ; CHECK-NEXT: [[T2:%.*]] = add nuw nsw i64 [[T1]], [[I2]]
146
+ ; CHECK-NEXT: [[T3:%.*]] = add nuw nsw i64 [[T2]], 32
147
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[T3]]
148
+ ; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[ARRAYIDX]], align 32
149
+ ; CHECK-NEXT: [[I2_NEXT]] = add nuw nsw i64 [[I2]], 32
150
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i64 [[I2_NEXT]], 4096
151
+ ; CHECK-NEXT: br i1 [[CMP2]], label [[FOR2_BODY]], label [[FOR1_END]]
152
+ ; CHECK: for1.end:
153
+ ; CHECK-NEXT: [[I1_NEXT]] = add nuw nsw i64 [[I1]], 32
154
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i64 [[I1_NEXT]], 4096
155
+ ; CHECK-NEXT: br i1 [[CMP1]], label [[FOR1_BODY]], label [[FOR0_END]]
156
+ ; CHECK: for0.end:
157
+ ; CHECK-NEXT: [[I0_NEXT]] = add nuw nsw i64 [[I0]], [[NUM_MUL]]
158
+ ; CHECK-NEXT: [[CMP0:%.*]] = icmp ult i64 [[I0_NEXT]], 4096
159
+ ; CHECK-NEXT: br i1 [[CMP0]], label [[FOR0_BODY]], label [[RETURN:%.*]]
160
+ ; CHECK: return:
161
+ ; CHECK-NEXT: ret void
162
+ ;
95
163
entry:
96
164
tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i8 32 , i64 0 )]
97
165
%id.mul = shl nsw i64 %id , 6
@@ -131,13 +199,28 @@ for0.end:
131
199
132
200
return:
133
201
ret void
134
-
135
- ; CHECK-LABEL: @hoo2
136
- ; CHECK: load i32, ptr %arrayidx, align 32
137
- ; CHECK: ret void
138
202
}
139
203
140
- define i32 @joo (ptr nocapture %a ) nounwind uwtable readonly {
204
+ define i32 @joo (ptr nocapture %a ) {
205
+ ; CHECK-LABEL: define i32 @joo
206
+ ; CHECK-SAME: (ptr nocapture [[A:%.*]]) {
207
+ ; CHECK-NEXT: entry:
208
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i8 32, i8 0) ]
209
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
210
+ ; CHECK: for.body:
211
+ ; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 4, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
212
+ ; CHECK-NEXT: [[R_06:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD:%.*]], [[FOR_BODY]] ]
213
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV]]
214
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 16
215
+ ; CHECK-NEXT: [[ADD]] = add nsw i32 [[TMP0]], [[R_06]]
216
+ ; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 8
217
+ ; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
218
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP1]], 2048
219
+ ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
220
+ ; CHECK: for.end:
221
+ ; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ]
222
+ ; CHECK-NEXT: ret i32 [[ADD_LCSSA]]
223
+ ;
141
224
entry:
142
225
tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i8 32 , i8 0 )]
143
226
br label %for.body
@@ -156,13 +239,28 @@ for.body: ; preds = %entry, %for.body
156
239
for.end: ; preds = %for.body
157
240
%add.lcssa = phi i32 [ %add , %for.body ]
158
241
ret i32 %add.lcssa
159
-
160
- ; CHECK-LABEL: @joo
161
- ; CHECK: load i32, ptr %arrayidx, align 16
162
- ; CHECK: ret i32 %add.lcssa
163
242
}
164
243
165
- define i32 @koo (ptr nocapture %a ) nounwind uwtable readonly {
244
+ define i32 @koo (ptr nocapture %a ) {
245
+ ; CHECK-LABEL: define i32 @koo
246
+ ; CHECK-SAME: (ptr nocapture [[A:%.*]]) {
247
+ ; CHECK-NEXT: entry:
248
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
249
+ ; CHECK: for.body:
250
+ ; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
251
+ ; CHECK-NEXT: [[R_06:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD:%.*]], [[FOR_BODY]] ]
252
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV]]
253
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i8 32, i8 0) ]
254
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 16
255
+ ; CHECK-NEXT: [[ADD]] = add nsw i32 [[TMP0]], [[R_06]]
256
+ ; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 4
257
+ ; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
258
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP1]], 2048
259
+ ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
260
+ ; CHECK: for.end:
261
+ ; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ]
262
+ ; CHECK-NEXT: ret i32 [[ADD_LCSSA]]
263
+ ;
166
264
entry:
167
265
br label %for.body
168
266
@@ -181,13 +279,28 @@ for.body: ; preds = %entry, %for.body
181
279
for.end: ; preds = %for.body
182
280
%add.lcssa = phi i32 [ %add , %for.body ]
183
281
ret i32 %add.lcssa
184
-
185
- ; CHECK-LABEL: @koo
186
- ; CHECK: load i32, ptr %arrayidx, align 16
187
- ; CHECK: ret i32 %add.lcssa
188
282
}
189
283
190
- define i32 @koo2 (ptr nocapture %a ) nounwind uwtable readonly {
284
+ define i32 @koo2 (ptr nocapture %a ) {
285
+ ; CHECK-LABEL: define i32 @koo2
286
+ ; CHECK-SAME: (ptr nocapture [[A:%.*]]) {
287
+ ; CHECK-NEXT: entry:
288
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i128 32, i128 0) ]
289
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
290
+ ; CHECK: for.body:
291
+ ; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ -4, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
292
+ ; CHECK-NEXT: [[R_06:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD:%.*]], [[FOR_BODY]] ]
293
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV]]
294
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 16
295
+ ; CHECK-NEXT: [[ADD]] = add nsw i32 [[TMP0]], [[R_06]]
296
+ ; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 4
297
+ ; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
298
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP1]], 2048
299
+ ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
300
+ ; CHECK: for.end:
301
+ ; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ]
302
+ ; CHECK-NEXT: ret i32 [[ADD_LCSSA]]
303
+ ;
191
304
entry:
192
305
tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i128 32 , i128 0 )]
193
306
br label %for.body
@@ -206,57 +319,66 @@ for.body: ; preds = %entry, %for.body
206
319
for.end: ; preds = %for.body
207
320
%add.lcssa = phi i32 [ %add , %for.body ]
208
321
ret i32 %add.lcssa
209
-
210
- ; CHECK-LABEL: @koo2
211
- ; CHECK: load i32, ptr %arrayidx, align 16
212
- ; CHECK: ret i32 %add.lcssa
213
322
}
214
323
215
- define i32 @moo (ptr nocapture %a ) nounwind uwtable {
324
+ define i32 @moo (ptr nocapture %a ) {
325
+ ; CHECK-LABEL: define i32 @moo
326
+ ; CHECK-SAME: (ptr nocapture [[A:%.*]]) {
327
+ ; CHECK-NEXT: entry:
328
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i16 32) ]
329
+ ; CHECK-NEXT: tail call void @llvm.memset.p0.i64(ptr align 32 [[A]], i8 0, i64 64, i1 false)
330
+ ; CHECK-NEXT: ret i32 undef
331
+ ;
216
332
entry:
217
333
tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i16 32 )]
218
334
tail call void @llvm.memset.p0.i64 (ptr align 4 %a , i8 0 , i64 64 , i1 false )
219
335
ret i32 undef
220
-
221
- ; CHECK-LABEL: @moo
222
- ; CHECK: @llvm.memset.p0.i64(ptr align 32 %a, i8 0, i64 64, i1 false)
223
- ; CHECK: ret i32 undef
224
336
}
225
337
226
- define i32 @moo2 (ptr nocapture %a , ptr nocapture %b ) nounwind uwtable {
338
+ define i32 @moo2 (ptr nocapture %a , ptr nocapture %b ) {
339
+ ; CHECK-LABEL: define i32 @moo2
340
+ ; CHECK-SAME: (ptr nocapture [[A:%.*]], ptr nocapture [[B:%.*]]) {
341
+ ; CHECK-NEXT: entry:
342
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[B]], i32 128) ]
343
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i16 32) ]
344
+ ; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr align 32 [[A]], ptr align 128 [[B]], i64 64, i1 false)
345
+ ; CHECK-NEXT: ret i32 undef
346
+ ;
227
347
entry:
228
348
tail call void @llvm.assume (i1 true ) ["align" (ptr %b , i32 128 )]
229
349
tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i16 32 )]
230
350
tail call void @llvm.memcpy.p0.p0.i64 (ptr align 4 %a , ptr align 4 %b , i64 64 , i1 false )
231
351
ret i32 undef
232
-
233
- ; CHECK-LABEL: @moo2
234
- ; CHECK: @llvm.memcpy.p0.p0.i64(ptr align 32 %a, ptr align 128 %b, i64 64, i1 false)
235
- ; CHECK: ret i32 undef
236
352
}
237
353
238
- define i32 @moo3 (ptr nocapture %a , ptr nocapture %b ) nounwind uwtable {
354
+ define i32 @moo3 (ptr nocapture %a , ptr nocapture %b ) {
355
+ ; CHECK-LABEL: define i32 @moo3
356
+ ; CHECK-SAME: (ptr nocapture [[A:%.*]], ptr nocapture [[B:%.*]]) {
357
+ ; CHECK-NEXT: entry:
358
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i16 32), "align"(ptr [[B]], i32 128) ]
359
+ ; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr align 32 [[A]], ptr align 128 [[B]], i64 64, i1 false)
360
+ ; CHECK-NEXT: ret i32 undef
361
+ ;
239
362
entry:
240
363
tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i16 32 ), "align" (ptr %b , i32 128 )]
241
364
tail call void @llvm.memcpy.p0.p0.i64 (ptr align 4 %a , ptr align 4 %b , i64 64 , i1 false )
242
365
ret i32 undef
243
-
244
- ; CHECK-LABEL: @moo3
245
- ; CHECK: @llvm.memcpy.p0.p0.i64(ptr align 32 %a, ptr align 128 %b, i64 64, i1 false)
246
- ; CHECK: ret i32 undef
247
366
}
248
367
249
368
250
369
; Variable alignments appear to be legal, don't crash
251
- define i32 @pr51680 (ptr nocapture %a , i32 %align ) nounwind uwtable readonly {
370
+ define i32 @pr51680 (ptr nocapture %a , i32 %align ) {
371
+ ; CHECK-LABEL: define i32 @pr51680
372
+ ; CHECK-SAME: (ptr nocapture [[A:%.*]], i32 [[ALIGN:%.*]]) {
373
+ ; CHECK-NEXT: entry:
374
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i32 [[ALIGN]]) ]
375
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A]], align 4
376
+ ; CHECK-NEXT: ret i32 [[TMP0]]
377
+ ;
252
378
entry:
253
379
tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i32 %align )]
254
380
%0 = load i32 , ptr %a , align 4
255
381
ret i32 %0
256
-
257
- ; CHECK-LABEL: @pr51680
258
- ; CHECK: load i32, ptr {{[^,]+}}, align 4
259
- ; CHECK: ret i32
260
382
}
261
383
262
384
declare void @llvm.assume (i1 ) nounwind
0 commit comments