We cannot infer more information from backedges in `solveBlockValueNonLocal`. However, since DT is unavailable in LVI, there is not a precise way to check whether a BB edge is a backedge. This patch only skips self loops to unblock the range analysis. The motivating case is extracted from https://github.com/llvm/llvm-project/pull/127663. Compile-time impact is high: https://llvm-compile-time-tracker.com/compare.php?from=84ddda58c870681dd12ed765e9d59d5e00567f94&to=af032f1351358f2f5b5d9f4e87c5601c23b9bd37&stat=instructions:u
40 lines
1.4 KiB
LLVM
40 lines
1.4 KiB
LLVM
; 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
|
|
}
|