|
5 | 5 | target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2"
|
6 | 6 | target triple = "x86_64-unknown-linux-gnu"
|
7 | 7 |
|
8 |
| -; FIXME: the returned value should be equal to |
9 |
| -; zext (trunk (%phi-1) to i16) to i64 |
10 |
| -; or simply |
| 8 | +; The returned value should be equal to |
11 | 9 | ; zext (%phi-1) to i64
|
12 |
| -; which means it should be equal to 1209. Currently, due to a bug in SCEV, it's |
13 |
| -; over 65534. |
| 10 | +; or simply 1209. |
14 | 11 | define noundef i64 @test() {
|
15 | 12 | ; CHECK-LABEL: define noundef i64 @test() {
|
16 | 13 | ; CHECK-NEXT: bb2:
|
17 | 14 | ; CHECK-NEXT: br label [[BB3:%.*]]
|
18 | 15 | ; CHECK: bb3:
|
19 |
| -; CHECK-NEXT: [[LSR_IV:%.*]] = phi i64 [ [[LSR_IV_NEXT:%.*]], [[BB10:%.*]] ], [ 0, [[BB2:%.*]] ] |
20 |
| -; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[LSR_IV]], 65535 |
21 |
| -; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[LSR_IV]], 65407 |
22 |
| -; CHECK-NEXT: [[ICMP5:%.*]] = icmp ult i64 [[TMP1]], -256 |
23 |
| -; CHECK-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP0]] to i32 |
24 |
| -; CHECK-NEXT: [[ICMP6:%.*]] = icmp ult i32 [[TMP2]], 128 |
| 16 | +; CHECK-NEXT: [[LSR_IV:%.*]] = phi i32 [ [[LSR_IV_NEXT:%.*]], [[BB10:%.*]] ], [ -1, [[BB2:%.*]] ] |
| 17 | +; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[LSR_IV]], 65536 |
| 18 | +; CHECK-NEXT: [[AND:%.*]] = and i32 [[TMP0]], 65535 |
| 19 | +; CHECK-NEXT: [[ZEXT:%.*]] = zext i32 [[AND]] to i64 |
| 20 | +; CHECK-NEXT: [[ADD4:%.*]] = add nsw i64 [[ZEXT]], -128 |
| 21 | +; CHECK-NEXT: [[ICMP5:%.*]] = icmp ult i64 [[ADD4]], -256 |
| 22 | +; CHECK-NEXT: [[ICMP6:%.*]] = icmp ult i32 [[AND]], 128 |
25 | 23 | ; CHECK-NEXT: [[OR:%.*]] = or i1 [[ICMP5]], [[ICMP6]]
|
26 | 24 | ; CHECK-NEXT: br i1 [[OR]], label [[BB10]], label [[BB7:%.*]]
|
27 | 25 | ; CHECK: bb7:
|
28 |
| -; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[LSR_IV]] to i32 |
| 26 | +; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[LSR_IV]], 1 |
29 | 27 | ; CHECK-NEXT: call void @foo(i32 [[TMP1]])
|
30 | 28 | ; CHECK-NEXT: unreachable
|
31 | 29 | ; CHECK: bb10:
|
32 |
| -; CHECK-NEXT: [[LSR_IV_NEXT]] = add nuw nsw i64 [[LSR_IV]], 1 |
33 |
| -; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[LSR_IV_NEXT]], -1 |
34 |
| -; CHECK-NEXT: [[TMP:%.*]] = trunc i64 [[TMP2]] to i32 |
35 |
| -; CHECK-NEXT: [[ICMP12:%.*]] = icmp ult i32 [[TMP]], 1210 |
| 30 | +; CHECK-NEXT: [[LSR_IV_NEXT]] = add nsw i32 [[LSR_IV]], 1 |
| 31 | +; CHECK-NEXT: [[ICMP12:%.*]] = icmp ult i32 [[LSR_IV_NEXT]], 1210 |
36 | 32 | ; CHECK-NEXT: br i1 [[ICMP12]], label [[BB3]], label [[BB13:%.*]]
|
37 | 33 | ; CHECK: bb13:
|
38 |
| -; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[LSR_IV_NEXT]], 65534 |
39 |
| -; CHECK-NEXT: ret i64 [[TMP3]] |
| 34 | +; CHECK-NEXT: ret i64 [[ZEXT]] |
40 | 35 | ;
|
41 | 36 | bb2:
|
42 | 37 | br label %bb3
|
|
0 commit comments