1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00
Brian M. Rzycki 518d937ae6 [JumpThreading] Track unreachable BBs to avoid processing
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
2018-03-16 15:13:47 +00:00

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
}