|
3 | 3 |
|
4 | 4 | ; The inbounds flags cannot be preserved here: If the pointers point to the
|
5 | 5 | ; beginning of an object and %i is 1, the intermediate GEPs are out of bounds.
|
6 |
| -define void @maybe_oob(ptr %dst, ptr %src, i64 %i) { |
| 6 | +define ptr @maybe_oob(ptr %p, i64 %i) { |
7 | 7 | ; CHECK-LABEL: @maybe_oob(
|
8 | 8 | ; CHECK-NEXT: entry:
|
9 | 9 | ; CHECK-NEXT: [[IDX1:%.*]] = sub i64 0, [[I:%.*]]
|
10 |
| -; CHECK-NEXT: [[TMP0:%.*]] = getelementptr float, ptr [[SRC:%.*]], i64 [[IDX1]] |
11 |
| -; CHECK-NEXT: [[ARRAYIDX_SRC2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 4 |
12 |
| -; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[ARRAYIDX_SRC2]], align 4 |
13 |
| -; CHECK-NEXT: [[IDX3:%.*]] = sub i64 0, [[I]] |
14 |
| -; CHECK-NEXT: [[TMP2:%.*]] = getelementptr float, ptr [[DST:%.*]], i64 [[IDX3]] |
15 |
| -; CHECK-NEXT: [[ARRAYIDX_DST4:%.*]] = getelementptr i8, ptr [[TMP2]], i64 4 |
16 |
| -; CHECK-NEXT: store float [[TMP1]], ptr [[ARRAYIDX_DST4]], align 4 |
17 |
| -; CHECK-NEXT: ret void |
| 10 | +; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX1]] |
| 11 | +; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 4 |
| 12 | +; CHECK-NEXT: ret ptr [[ARRAYIDX2]] |
18 | 13 | ;
|
19 | 14 | entry:
|
20 | 15 | %idx = sub nsw i64 1, %i
|
21 |
| - %arrayidx.src = getelementptr inbounds float, ptr %src, i64 %idx |
22 |
| - %3 = load float, ptr %arrayidx.src, align 4 |
23 |
| - %arrayidx.dst = getelementptr inbounds float, ptr %dst, i64 %idx |
24 |
| - store float %3, ptr %arrayidx.dst, align 4 |
25 |
| - ret void |
| 16 | + %arrayidx = getelementptr inbounds i32, ptr %p, i64 %idx |
| 17 | + ret ptr %arrayidx |
26 | 18 | }
|
0 commit comments