mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
518d937ae6
JumpThreading iterates over F until the IR quiesces. Transforming unreachable BBs increases compile time and it is also possible to never stabilize causing JumpThreading to hang. An older attempt at fixing this problem was D3991 where removeUnreachableBlocks(F) was called before JumpThreading began. This has a few drawbacks: * expensive - the routine attempts to fix up the IR to identify additional BBs that can be removed along with unreachable BBs. * aggressive - does not identify and preserve the shape of the IR. At a minimum it does not preserve loop hierarchies. * invasive - altering reachable blocks it may disrupt IR shapes that could have otherwise been JumpThreaded. This patch avoids removeUnreachableBlocks(F) and instead tracks unreachable BBs in a SmallPtrSet using DominatorTree to validate the initial state of all BBs. We then rely on subsequent passes to identify and remove these unreachable blocks from F. Reviewers: dberlin, sebpop, kuhar, dinesh.d Reviewed by: sebpop, kuhar Subscribers: hiraditya, uabelho, llvm-commits Differential Revision: https://reviews.llvm.org/D44177 llvm-svn: 327713
33 lines
821 B
LLVM
33 lines
821 B
LLVM
; RUN: opt -S -jump-threading < %s | FileCheck %s
|
|
|
|
; CHECK-LABEL: @f(
|
|
; CHECK-LABEL: entry
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
; JumpThreading must detect the next two blocks are unreachable from entry
|
|
; and leave them alone. A subsequent pass will remove them from @f.
|
|
;
|
|
; CHECK: for.cond1:
|
|
; CHECK-NEXT: phi
|
|
; CHECK-NEXT: icmp
|
|
; CHECK-NEXT: br i1 %cmp, label %for.body, label %for.cond1
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: add
|
|
; CHECK-NEXT: icmp
|
|
; CHECK-NEXT: br i1 %a, label %for.cond1, label %for.cond1
|
|
|
|
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
|
|
}
|