| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
| ; RUN: opt -passes=correlated-propagation -S %s | FileCheck %s |
| |
| define i64 @test_self_loop(i64 %x, i1 %cond) { |
| ; CHECK-LABEL: define range(i64 0, 576460752303423488) i64 @test_self_loop( |
| ; CHECK-SAME: i64 [[X:%.*]], i1 [[COND:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*]]: |
| ; CHECK-NEXT: [[COND1:%.*]] = icmp ugt i64 [[X]], 576460752303423487 |
| ; CHECK-NEXT: br i1 [[COND1]], label %[[COMMON_RET:.*]], label %[[LOOP:.*]] |
| ; CHECK: [[LOOP]]: |
| ; CHECK-NEXT: br i1 [[COND]], label %[[INDIRECT:.*]], label %[[LOOP]] |
| ; CHECK: [[INDIRECT]]: |
| ; CHECK-NEXT: [[COND2:%.*]] = icmp eq i64 [[X]], 0 |
| ; CHECK-NEXT: br i1 [[COND2]], label %[[COMMON_RET]], label %[[EXIT:.*]] |
| ; CHECK: [[EXIT]]: |
| ; CHECK-NEXT: br label %[[COMMON_RET]] |
| ; CHECK: [[COMMON_RET]]: |
| ; CHECK-NEXT: [[RES:%.*]] = phi i64 [ [[X]], %[[EXIT]] ], [ 0, %[[INDIRECT]] ], [ 0, %[[ENTRY]] ] |
| ; CHECK-NEXT: ret i64 [[RES]] |
| ; |
| entry: |
| %cond1 = icmp ugt i64 %x, 576460752303423487 |
| br i1 %cond1, label %common.ret, label %loop |
| |
| loop: |
| br i1 %cond, label %indirect, label %loop |
| |
| indirect: |
| %cond2 = icmp eq i64 %x, 0 |
| br i1 %cond2, label %common.ret, label %exit |
| |
| exit: |
| %smax = tail call i64 @llvm.smax.i64(i64 %x, i64 1) |
| br label %common.ret |
| |
| common.ret: |
| %res = phi i64 [ %smax, %exit ], [ 0, %indirect ], [ 0, %entry ] |
| ret i64 %res |
| } |