forked from OSchip/llvm-project
Fixed jump threading going to infinite loop.
This patch add code to remove unreachable blocks from function as they may cause jump threading to stuck in infinite loop. Differential Revision: http://reviews.llvm.org/D3991 llvm-svn: 211103
This commit is contained in:
parent
2e940a11e7
commit
657105e582
|
@ -158,6 +158,9 @@ bool JumpThreading::runOnFunction(Function &F) {
|
||||||
TLI = &getAnalysis<TargetLibraryInfo>();
|
TLI = &getAnalysis<TargetLibraryInfo>();
|
||||||
LVI = &getAnalysis<LazyValueInfo>();
|
LVI = &getAnalysis<LazyValueInfo>();
|
||||||
|
|
||||||
|
// Remove unreachable blocks from function as they may result in infinite loop.
|
||||||
|
removeUnreachableBlocks(F);
|
||||||
|
|
||||||
FindLoopHeaders(F);
|
FindLoopHeaders(F);
|
||||||
|
|
||||||
bool Changed, EverChanged = false;
|
bool Changed, EverChanged = false;
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
; RUN: opt -S -jump-threading < %s | FileCheck %s
|
||||||
|
|
||||||
|
; CHECK-LABEL: @f(
|
||||||
|
; CHECK-LABEL: entry
|
||||||
|
; CHECK: ret void
|
||||||
|
; CHECK-NOT: for.cond1
|
||||||
|
; CHECK-NOT: for.body
|
||||||
|
|
||||||
|
define void @f() {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
|
||||||
|
for.cond1:
|
||||||
|
%i.025 = phi i32 [ %inc, %for.body ], [ %inc, %for.body ], [ 1, %for.cond1 ]
|
||||||
|
%cmp = icmp slt i32 %i.025, 2
|
||||||
|
br i1 %cmp, label %for.body, label %for.cond1
|
||||||
|
|
||||||
|
for.body:
|
||||||
|
%inc = add nsw i32 %i.025, 0
|
||||||
|
%a = icmp ugt i32 %inc, 2
|
||||||
|
br i1 %a, label %for.cond1, label %for.cond1
|
||||||
|
}
|
|
@ -127,7 +127,7 @@ L4:
|
||||||
; CHECK: test_switch_default
|
; CHECK: test_switch_default
|
||||||
; CHECK: entry:
|
; CHECK: entry:
|
||||||
; CHECK: load
|
; CHECK: load
|
||||||
; CHECK: switch
|
; CHECK: icmp
|
||||||
; CHECK: [[THREADED:[A-Za-z.0-9]+]]:
|
; CHECK: [[THREADED:[A-Za-z.0-9]+]]:
|
||||||
; CHECK: store
|
; CHECK: store
|
||||||
; CHECK: br
|
; CHECK: br
|
||||||
|
|
Loading…
Reference in New Issue