@@ -38,15 +38,20 @@ define void @gep0(i8* %unused, i8* %other, i8* %ptr) {
38
38
}
39
39
40
40
; Order of accesses does not change computation.
41
-
42
- define void @ordering (i8* %ptr ) {
43
- ; CHECK-LABEL: @ordering(i8* %ptr)
44
- %arrayidx2 = getelementptr i8 , i8* %ptr , i64 2
45
- %t2 = load i8 , i8* %arrayidx2
46
- %arrayidx1 = getelementptr i8 , i8* %ptr , i64 1
47
- %arrayidx0 = getelementptr i8 , i8* %ptr , i64 0
48
- %t0 = load i8 , i8* %arrayidx0
49
- %t1 = load i8 , i8* %arrayidx1
41
+ ; Multiple arguments may be dereferenceable.
42
+
43
+ define void @ordering (i8* %ptr1 , i32* %ptr2 ) {
44
+ ; CHECK-LABEL: @ordering(i8* %ptr1, i32* %ptr2)
45
+ %a20 = getelementptr i32 , i32* %ptr2 , i64 0
46
+ %a12 = getelementptr i8 , i8* %ptr1 , i64 2
47
+ %t12 = load i8 , i8* %a12
48
+ %a11 = getelementptr i8 , i8* %ptr1 , i64 1
49
+ %t20 = load i32 , i32* %a20
50
+ %a10 = getelementptr i8 , i8* %ptr1 , i64 0
51
+ %t10 = load i8 , i8* %a10
52
+ %t11 = load i8 , i8* %a11
53
+ %a21 = getelementptr i32 , i32* %ptr2 , i64 1
54
+ %t21 = load i32 , i32* %a21
50
55
ret void
51
56
}
52
57
@@ -199,3 +204,40 @@ define void @better_bytes(i32* dereferenceable(100) %ptr) {
199
204
ret void
200
205
}
201
206
207
+ define void @bitcast (i32* %arg ) {
208
+ ; CHECK-LABEL: @bitcast(i32* %arg)
209
+ %ptr = bitcast i32* %arg to float *
210
+ %arrayidx0 = getelementptr float , float * %ptr , i64 0
211
+ %arrayidx1 = getelementptr float , float * %ptr , i64 1
212
+ %t0 = load float , float * %arrayidx0
213
+ %t1 = load float , float * %arrayidx1
214
+ ret void
215
+ }
216
+
217
+ define void @bitcast_different_sizes (double * %arg1 , i8* %arg2 ) {
218
+ ; CHECK-LABEL: @bitcast_different_sizes(double* %arg1, i8* %arg2)
219
+ %ptr1 = bitcast double * %arg1 to float *
220
+ %a10 = getelementptr float , float * %ptr1 , i64 0
221
+ %a11 = getelementptr float , float * %ptr1 , i64 1
222
+ %a12 = getelementptr float , float * %ptr1 , i64 2
223
+ %ld10 = load float , float * %a10
224
+ %ld11 = load float , float * %a11
225
+ %ld12 = load float , float * %a12
226
+
227
+ %ptr2 = bitcast i8* %arg2 to i64*
228
+ %a20 = getelementptr i64 , i64* %ptr2 , i64 0
229
+ %a21 = getelementptr i64 , i64* %ptr2 , i64 1
230
+ %ld20 = load i64 , i64* %a20
231
+ %ld21 = load i64 , i64* %a21
232
+ ret void
233
+ }
234
+
235
+ define void @negative_offset (i32* %arg ) {
236
+ ; CHECK-LABEL: @negative_offset(i32* %arg)
237
+ %ptr = bitcast i32* %arg to float *
238
+ %arrayidx0 = getelementptr float , float * %ptr , i64 0
239
+ %arrayidx1 = getelementptr float , float * %ptr , i64 -1
240
+ %t0 = load float , float * %arrayidx0
241
+ %t1 = load float , float * %arrayidx1
242
+ ret void
243
+ }
0 commit comments