mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[GlobalOpt] Remove unreachable blocks before optimizing a function.
LLVM's definition of dominance allows instructions that are cyclic in unreachable blocks, e.g.: %pat = select i1 %condition, @global, i16* %pat because any instruction dominates an instruction in a block that's not reachable from entry. So, remove unreachable blocks from the function, because a) there's no point in analyzing them and b) GlobalOpt should otherwise grow some more complicated logic to break these cycles. Differential Revision: https://reviews.llvm.org/D35028 llvm-svn: 307215
This commit is contained in:
parent
f573c2a298
commit
2a42d26579
@ -2026,6 +2026,24 @@ OptimizeFunctions(Module &M, TargetLibraryInfo *TLI,
|
||||
continue;
|
||||
}
|
||||
|
||||
// LLVM's definition of dominance allows instructions that are cyclic
|
||||
// in unreachable blocks, e.g.:
|
||||
// %pat = select i1 %condition, @global, i16* %pat
|
||||
// because any instruction dominates an instruction in a block that's
|
||||
// not reachable from entry.
|
||||
// So, remove unreachable blocks from the function, because a) there's
|
||||
// no point in analyzing them and b) GlobalOpt should otherwise grow
|
||||
// some more complicated logic to break these cycles.
|
||||
// Removing unreachable blocks might invalidate the dominator so we
|
||||
// recalculate it.
|
||||
if (!F->isDeclaration()) {
|
||||
if (removeUnreachableBlocks(*F)) {
|
||||
auto &DT = LookupDomTree(*F);
|
||||
DT.recalculate(*F);
|
||||
Changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
Changed |= processGlobal(*F, TLI, LookupDomTree);
|
||||
|
||||
if (!F->hasLocalLinkage())
|
||||
|
17
test/Transforms/GlobalOpt/pr33686.ll
Normal file
17
test/Transforms/GlobalOpt/pr33686.ll
Normal file
@ -0,0 +1,17 @@
|
||||
; RUN: opt -S -globalopt %s | FileCheck %s
|
||||
|
||||
; CHECK-LABEL: define void @beth
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: ret void
|
||||
; CHEC-NEXT: }
|
||||
|
||||
@glob = external global i16, align 1
|
||||
|
||||
define void @beth() {
|
||||
entry:
|
||||
ret void
|
||||
|
||||
notreachable:
|
||||
%patatino = select i1 undef, i16* @glob, i16* %patatino
|
||||
br label %notreachable
|
||||
}
|
Loading…
Reference in New Issue
Block a user