|
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