mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
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
ed6ddd8719
commit
3f5165cd6a
@ -158,6 +158,9 @@ bool JumpThreading::runOnFunction(Function &F) {
|
||||
TLI = &getAnalysis<TargetLibraryInfo>();
|
||||
LVI = &getAnalysis<LazyValueInfo>();
|
||||
|
||||
// Remove unreachable blocks from function as they may result in infinite loop.
|
||||
removeUnreachableBlocks(F);
|
||||
|
||||
FindLoopHeaders(F);
|
||||
|
||||
bool Changed, EverChanged = false;
|
||||
|
22
test/Transforms/JumpThreading/pr15851_hang.ll
Normal file
22
test/Transforms/JumpThreading/pr15851_hang.ll
Normal 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
|
||||
}
|
@ -127,7 +127,7 @@ L4:
|
||||
; CHECK: test_switch_default
|
||||
; CHECK: entry:
|
||||
; CHECK: load
|
||||
; CHECK: switch
|
||||
; CHECK: icmp
|
||||
; CHECK: [[THREADED:[A-Za-z.0-9]+]]:
|
||||
; CHECK: store
|
||||
; CHECK: br
|
||||
|
Loading…
x
Reference in New Issue
Block a user