1
1
target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
2
2
; RUN: opt < %s -passes=alignment-from-assumptions -S | FileCheck %s
3
3
4
- define i32 @foo (i32* nocapture %a ) nounwind uwtable readonly {
4
+ define i32 @foo (ptr nocapture %a ) nounwind uwtable readonly {
5
5
entry:
6
- tail call void @llvm.assume (i1 true ) ["align" (i32* %a , i32 32 )]
7
- %0 = load i32 , i32* %a , align 4
6
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i32 32 )]
7
+ %0 = load i32 , ptr %a , align 4
8
8
ret i32 %0
9
9
10
10
; CHECK-LABEL: @foo
11
- ; CHECK: load i32, i32* {{[^,]+}}, align 32
11
+ ; CHECK: load i32, ptr {{[^,]+}}, align 32
12
12
; CHECK: ret i32
13
13
}
14
14
15
- define i32 @foo2 (i32* nocapture %a ) nounwind uwtable readonly {
15
+ define i32 @foo2 (ptr nocapture %a ) nounwind uwtable readonly {
16
16
entry:
17
- tail call void @llvm.assume (i1 true ) ["align" (i32* %a , i32 32 , i32 24 )]
18
- %arrayidx = getelementptr inbounds i32 , i32* %a , i64 -2
19
- %0 = load i32 , i32* %arrayidx , align 4
17
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i32 32 , i32 24 )]
18
+ %arrayidx = getelementptr inbounds i32 , ptr %a , i64 -2
19
+ %0 = load i32 , ptr %arrayidx , align 4
20
20
ret i32 %0
21
21
22
22
; CHECK-LABEL: @foo2
23
- ; CHECK: load i32, i32* {{[^,]+}}, align 16
23
+ ; CHECK: load i32, ptr {{[^,]+}}, align 16
24
24
; CHECK: ret i32
25
25
}
26
26
27
- define i32 @foo2a (i32* nocapture %a ) nounwind uwtable readonly {
27
+ define i32 @foo2a (ptr nocapture %a ) nounwind uwtable readonly {
28
28
entry:
29
- tail call void @llvm.assume (i1 true ) ["align" (i32* %a , i32 32 , i32 28 )]
30
- %arrayidx = getelementptr inbounds i32 , i32* %a , i64 1
31
- %0 = load i32 , i32* %arrayidx , align 4
29
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i32 32 , i32 28 )]
30
+ %arrayidx = getelementptr inbounds i32 , ptr %a , i64 1
31
+ %0 = load i32 , ptr %arrayidx , align 4
32
32
ret i32 %0
33
33
34
34
; CHECK-LABEL: @foo2a
35
- ; CHECK: load i32, i32* {{[^,]+}}, align 32
35
+ ; CHECK: load i32, ptr {{[^,]+}}, align 32
36
36
; CHECK: ret i32
37
37
}
38
38
39
39
; TODO: this can be 8-bytes aligned
40
- define i32 @foo2b (i32* nocapture %a ) nounwind uwtable readonly {
40
+ define i32 @foo2b (ptr nocapture %a ) nounwind uwtable readonly {
41
41
entry:
42
- tail call void @llvm.assume (i1 true ) ["align" (i32* %a , i32 32 , i32 28 )]
43
- %arrayidx = getelementptr inbounds i32 , i32* %a , i64 -1
44
- %0 = load i32 , i32* %arrayidx , align 4
42
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i32 32 , i32 28 )]
43
+ %arrayidx = getelementptr inbounds i32 , ptr %a , i64 -1
44
+ %0 = load i32 , ptr %arrayidx , align 4
45
45
ret i32 %0
46
46
47
47
; CHECK-LABEL: @foo2b
48
- ; CHECK: load i32, i32* {{[^,]+}}, align 4
48
+ ; CHECK: load i32, ptr {{[^,]+}}, align 4
49
49
; CHECK: ret i32
50
50
}
51
51
52
- define i32 @goo (i32* nocapture %a ) nounwind uwtable readonly {
52
+ define i32 @goo (ptr nocapture %a ) nounwind uwtable readonly {
53
53
entry:
54
- tail call void @llvm.assume (i1 true ) ["align" (i32* %a , i32 32 , i32 0 )]
55
- %0 = load i32 , i32* %a , align 4
54
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i32 32 , i32 0 )]
55
+ %0 = load i32 , ptr %a , align 4
56
56
ret i32 %0
57
57
58
58
; CHECK-LABEL: @goo
59
- ; CHECK: load i32, i32* {{[^,]+}}, align 32
59
+ ; CHECK: load i32, ptr {{[^,]+}}, align 32
60
60
; CHECK: ret i32
61
61
}
62
62
63
- define i32 @hoo (i32* nocapture %a ) nounwind uwtable readonly {
63
+ define i32 @hoo (ptr nocapture %a ) nounwind uwtable readonly {
64
64
entry:
65
- tail call void @llvm.assume (i1 true ) ["align" (i32* %a , i64 32 , i32 0 )]
65
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i64 32 , i32 0 )]
66
66
br label %for.body
67
67
68
68
for.body: ; preds = %entry, %for.body
69
69
%indvars.iv = phi i64 [ 0 , %entry ], [ %indvars.iv.next , %for.body ]
70
70
%r.06 = phi i32 [ 0 , %entry ], [ %add , %for.body ]
71
- %arrayidx = getelementptr inbounds i32 , i32* %a , i64 %indvars.iv
72
- %0 = load i32 , i32* %arrayidx , align 4
71
+ %arrayidx = getelementptr inbounds i32 , ptr %a , i64 %indvars.iv
72
+ %0 = load i32 , ptr %arrayidx , align 4
73
73
%add = add nsw i32 %0 , %r.06
74
74
%indvars.iv.next = add i64 %indvars.iv , 8
75
75
%1 = trunc i64 %indvars.iv.next to i32
@@ -81,7 +81,7 @@ for.end: ; preds = %for.body
81
81
ret i32 %add.lcssa
82
82
83
83
; CHECK-LABEL: @hoo
84
- ; CHECK: load i32, i32* %arrayidx, align 32
84
+ ; CHECK: load i32, ptr %arrayidx, align 32
85
85
; CHECK: ret i32 %add.lcssa
86
86
}
87
87
@@ -91,9 +91,9 @@ for.end: ; preds = %for.body
91
91
; for i1 in range(0, 4096, 32):
92
92
; for i2 in range(0, 4096, 32):
93
93
; load(a, i0+i1+i2+32)
94
- define void @hoo2 (i32* nocapture %a , i64 %id , i64 %num ) nounwind uwtable readonly {
94
+ define void @hoo2 (ptr nocapture %a , i64 %id , i64 %num ) nounwind uwtable readonly {
95
95
entry:
96
- tail call void @llvm.assume (i1 true ) ["align" (i32* %a , i8 32 , i64 0 )]
96
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i8 32 , i64 0 )]
97
97
%id.mul = shl nsw i64 %id , 6
98
98
%num.mul = shl nsw i64 %num , 6
99
99
br label %for0.body
@@ -112,8 +112,8 @@ for2.body:
112
112
%t1 = add nuw nsw i64 %i0 , %i1
113
113
%t2 = add nuw nsw i64 %t1 , %i2
114
114
%t3 = add nuw nsw i64 %t2 , 32
115
- %arrayidx = getelementptr inbounds i32 , i32* %a , i64 %t3
116
- %x = load i32 , i32* %arrayidx , align 4
115
+ %arrayidx = getelementptr inbounds i32 , ptr %a , i64 %t3
116
+ %x = load i32 , ptr %arrayidx , align 4
117
117
118
118
%i2.next = add nuw nsw i64 %i2 , 32
119
119
%cmp2 = icmp ult i64 %i2.next , 4096
@@ -133,20 +133,20 @@ return:
133
133
ret void
134
134
135
135
; CHECK-LABEL: @hoo2
136
- ; CHECK: load i32, i32* %arrayidx, align 32
136
+ ; CHECK: load i32, ptr %arrayidx, align 32
137
137
; CHECK: ret void
138
138
}
139
139
140
- define i32 @joo (i32* nocapture %a ) nounwind uwtable readonly {
140
+ define i32 @joo (ptr nocapture %a ) nounwind uwtable readonly {
141
141
entry:
142
- tail call void @llvm.assume (i1 true ) ["align" (i32* %a , i8 32 , i8 0 )]
142
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i8 32 , i8 0 )]
143
143
br label %for.body
144
144
145
145
for.body: ; preds = %entry, %for.body
146
146
%indvars.iv = phi i64 [ 4 , %entry ], [ %indvars.iv.next , %for.body ]
147
147
%r.06 = phi i32 [ 0 , %entry ], [ %add , %for.body ]
148
- %arrayidx = getelementptr inbounds i32 , i32* %a , i64 %indvars.iv
149
- %0 = load i32 , i32* %arrayidx , align 4
148
+ %arrayidx = getelementptr inbounds i32 , ptr %a , i64 %indvars.iv
149
+ %0 = load i32 , ptr %arrayidx , align 4
150
150
%add = add nsw i32 %0 , %r.06
151
151
%indvars.iv.next = add i64 %indvars.iv , 8
152
152
%1 = trunc i64 %indvars.iv.next to i32
@@ -158,20 +158,20 @@ for.end: ; preds = %for.body
158
158
ret i32 %add.lcssa
159
159
160
160
; CHECK-LABEL: @joo
161
- ; CHECK: load i32, i32* %arrayidx, align 16
161
+ ; CHECK: load i32, ptr %arrayidx, align 16
162
162
; CHECK: ret i32 %add.lcssa
163
163
}
164
164
165
- define i32 @koo (i32* nocapture %a ) nounwind uwtable readonly {
165
+ define i32 @koo (ptr nocapture %a ) nounwind uwtable readonly {
166
166
entry:
167
167
br label %for.body
168
168
169
169
for.body: ; preds = %entry, %for.body
170
170
%indvars.iv = phi i64 [ 0 , %entry ], [ %indvars.iv.next , %for.body ]
171
171
%r.06 = phi i32 [ 0 , %entry ], [ %add , %for.body ]
172
- %arrayidx = getelementptr inbounds i32 , i32* %a , i64 %indvars.iv
173
- tail call void @llvm.assume (i1 true ) ["align" (i32* %a , i8 32 , i8 0 )]
174
- %0 = load i32 , i32* %arrayidx , align 4
172
+ %arrayidx = getelementptr inbounds i32 , ptr %a , i64 %indvars.iv
173
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i8 32 , i8 0 )]
174
+ %0 = load i32 , ptr %arrayidx , align 4
175
175
%add = add nsw i32 %0 , %r.06
176
176
%indvars.iv.next = add i64 %indvars.iv , 4
177
177
%1 = trunc i64 %indvars.iv.next to i32
@@ -183,20 +183,20 @@ for.end: ; preds = %for.body
183
183
ret i32 %add.lcssa
184
184
185
185
; CHECK-LABEL: @koo
186
- ; CHECK: load i32, i32* %arrayidx, align 16
186
+ ; CHECK: load i32, ptr %arrayidx, align 16
187
187
; CHECK: ret i32 %add.lcssa
188
188
}
189
189
190
- define i32 @koo2 (i32* nocapture %a ) nounwind uwtable readonly {
190
+ define i32 @koo2 (ptr nocapture %a ) nounwind uwtable readonly {
191
191
entry:
192
- tail call void @llvm.assume (i1 true ) ["align" (i32* %a , i128 32 , i128 0 )]
192
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i128 32 , i128 0 )]
193
193
br label %for.body
194
194
195
195
for.body: ; preds = %entry, %for.body
196
196
%indvars.iv = phi i64 [ -4 , %entry ], [ %indvars.iv.next , %for.body ]
197
197
%r.06 = phi i32 [ 0 , %entry ], [ %add , %for.body ]
198
- %arrayidx = getelementptr inbounds i32 , i32* %a , i64 %indvars.iv
199
- %0 = load i32 , i32* %arrayidx , align 4
198
+ %arrayidx = getelementptr inbounds i32 , ptr %a , i64 %indvars.iv
199
+ %0 = load i32 , ptr %arrayidx , align 4
200
200
%add = add nsw i32 %0 , %r.06
201
201
%indvars.iv.next = add i64 %indvars.iv , 4
202
202
%1 = trunc i64 %indvars.iv.next to i32
@@ -208,64 +208,59 @@ for.end: ; preds = %for.body
208
208
ret i32 %add.lcssa
209
209
210
210
; CHECK-LABEL: @koo2
211
- ; CHECK: load i32, i32* %arrayidx, align 16
211
+ ; CHECK: load i32, ptr %arrayidx, align 16
212
212
; CHECK: ret i32 %add.lcssa
213
213
}
214
214
215
- define i32 @moo (i32* nocapture %a ) nounwind uwtable {
215
+ define i32 @moo (ptr nocapture %a ) nounwind uwtable {
216
216
entry:
217
- tail call void @llvm.assume (i1 true ) ["align" (i32* %a , i16 32 )]
218
- %0 = bitcast i32* %a to i8*
219
- tail call void @llvm.memset.p0i8.i64 (i8* align 4 %0 , i8 0 , i64 64 , i1 false )
217
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i16 32 )]
218
+ tail call void @llvm.memset.p0.i64 (ptr align 4 %a , i8 0 , i64 64 , i1 false )
220
219
ret i32 undef
221
220
222
221
; CHECK-LABEL: @moo
223
- ; CHECK: @llvm.memset.p0i8 .i64(i8* align 32 %0 , i8 0, i64 64, i1 false)
222
+ ; CHECK: @llvm.memset.p0 .i64(ptr align 32 %a , i8 0, i64 64, i1 false)
224
223
; CHECK: ret i32 undef
225
224
}
226
225
227
- define i32 @moo2 (i32* nocapture %a , i32* nocapture %b ) nounwind uwtable {
226
+ define i32 @moo2 (ptr nocapture %a , ptr nocapture %b ) nounwind uwtable {
228
227
entry:
229
- tail call void @llvm.assume (i1 true ) ["align" (i32* %b , i32 128 )]
230
- %0 = bitcast i32* %a to i8*
231
- tail call void @llvm.assume (i1 true ) ["align" (i8* %0 , i16 32 )]
232
- %1 = bitcast i32* %b to i8*
233
- tail call void @llvm.memcpy.p0i8.p0i8.i64 (i8* align 4 %0 , i8* align 4 %1 , i64 64 , i1 false )
228
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %b , i32 128 )]
229
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i16 32 )]
230
+ tail call void @llvm.memcpy.p0.p0.i64 (ptr align 4 %a , ptr align 4 %b , i64 64 , i1 false )
234
231
ret i32 undef
235
232
236
233
; CHECK-LABEL: @moo2
237
- ; CHECK: @llvm.memcpy.p0i8.p0i8 .i64(i8* align 32 %0, i8* align 128 %1 , i64 64, i1 false)
234
+ ; CHECK: @llvm.memcpy.p0.p0 .i64(ptr align 32 %a, ptr align 128 %b , i64 64, i1 false)
238
235
; CHECK: ret i32 undef
239
236
}
240
237
241
- define i32 @moo3 (i32* nocapture %a , i32* nocapture %b ) nounwind uwtable {
238
+ define i32 @moo3 (ptr nocapture %a , ptr nocapture %b ) nounwind uwtable {
242
239
entry:
243
- %0 = bitcast i32* %a to i8*
244
- tail call void @llvm.assume (i1 true ) ["align" (i8* %0 , i16 32 ), "align" (i32* %b , i32 128 )]
245
- %1 = bitcast i32* %b to i8*
246
- tail call void @llvm.memcpy.p0i8.p0i8.i64 (i8* align 4 %0 , i8* align 4 %1 , i64 64 , i1 false )
240
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i16 32 ), "align" (ptr %b , i32 128 )]
241
+ tail call void @llvm.memcpy.p0.p0.i64 (ptr align 4 %a , ptr align 4 %b , i64 64 , i1 false )
247
242
ret i32 undef
248
243
249
244
; CHECK-LABEL: @moo3
250
- ; CHECK: @llvm.memcpy.p0i8.p0i8 .i64(i8* align 32 %0, i8* align 128 %1 , i64 64, i1 false)
245
+ ; CHECK: @llvm.memcpy.p0.p0 .i64(ptr align 32 %a, ptr align 128 %b , i64 64, i1 false)
251
246
; CHECK: ret i32 undef
252
247
}
253
248
254
249
255
250
; Variable alignments appear to be legal, don't crash
256
- define i32 @pr51680 (i32* nocapture %a , i32 %align ) nounwind uwtable readonly {
251
+ define i32 @pr51680 (ptr nocapture %a , i32 %align ) nounwind uwtable readonly {
257
252
entry:
258
- tail call void @llvm.assume (i1 true ) ["align" (i32* %a , i32 %align )]
259
- %0 = load i32 , i32* %a , align 4
253
+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i32 %align )]
254
+ %0 = load i32 , ptr %a , align 4
260
255
ret i32 %0
261
256
262
257
; CHECK-LABEL: @pr51680
263
- ; CHECK: load i32, i32* {{[^,]+}}, align 4
258
+ ; CHECK: load i32, ptr {{[^,]+}}, align 4
264
259
; CHECK: ret i32
265
260
}
266
261
267
262
declare void @llvm.assume (i1 ) nounwind
268
263
269
- declare void @llvm.memset.p0i8 .i64 (i8* nocapture , i8 , i64 , i1 ) nounwind
270
- declare void @llvm.memcpy.p0i8.p0i8 .i64 (i8* nocapture , i8* nocapture , i64 , i1 ) nounwind
264
+ declare void @llvm.memset.p0 .i64 (ptr nocapture , i8 , i64 , i1 ) nounwind
265
+ declare void @llvm.memcpy.p0.p0 .i64 (ptr nocapture , ptr nocapture , i64 , i1 ) nounwind
271
266
0 commit comments