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:
Dinesh Dwivedi 2014-06-17 14:34:19 +00:00
parent 2e940a11e7
commit 657105e582
3 changed files with 26 additions and 1 deletions

View File

@ -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;

View File

@ -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
}

View File

@ -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