|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
|
2 | 2 | ; RUN: opt -S -passes=indvars < %s | FileCheck %s
|
3 | 3 |
|
4 |
| -; FIXME: This is a miscompile. |
| 4 | +; Do not infer that %cmp is true. The %indvar3 input of %indvar2 comes from |
| 5 | +; a previous iteration, so we should not compare it to a value from the current |
| 6 | +; iteration. |
5 | 7 | define i32 @test() {
|
6 | 8 | ; CHECK-LABEL: define i32 @test() {
|
7 | 9 | ; CHECK-NEXT: [[ENTRY:.*]]:
|
8 | 10 | ; CHECK-NEXT: br label %[[FOR_PREHEADER:.*]]
|
9 | 11 | ; CHECK: [[FOR_PREHEADER]]:
|
10 | 12 | ; CHECK-NEXT: [[INDVAR1:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[PHI:%.*]], %[[FOR_INC:.*]] ]
|
11 |
| -; CHECK-NEXT: [[INDVAR3:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[INC:%.*]], %[[FOR_INC]] ] |
| 13 | +; CHECK-NEXT: [[INDVAR2:%.*]] = phi i32 [ 1, %[[ENTRY]] ], [ [[INDVAR3:%.*]], %[[FOR_INC]] ] |
| 14 | +; CHECK-NEXT: [[INDVAR3]] = phi i32 [ 0, %[[ENTRY]] ], [ [[INC:%.*]], %[[FOR_INC]] ] |
12 | 15 | ; CHECK-NEXT: [[COND1:%.*]] = icmp eq i32 [[INDVAR3]], 0
|
13 | 16 | ; CHECK-NEXT: br i1 [[COND1]], label %[[FOR_INC]], label %[[FOR_END:.*]]
|
14 | 17 | ; CHECK: [[FOR_END]]:
|
15 |
| -; CHECK-NEXT: [[EXT:%.*]] = zext i1 true to i32 |
| 18 | +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[INDVAR2]], 0 |
| 19 | +; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[CMP]] to i32 |
16 | 20 | ; CHECK-NEXT: br label %[[FOR_INC]]
|
17 | 21 | ; CHECK: [[FOR_INC]]:
|
18 | 22 | ; CHECK-NEXT: [[PHI]] = phi i32 [ [[EXT]], %[[FOR_END]] ], [ 0, %[[FOR_PREHEADER]] ]
|
|
0 commit comments