diff options
author | Davide Italiano <davide@freebsd.org> | 2017-07-13 15:40:59 +0000 |
---|---|---|
committer | Davide Italiano <davide@freebsd.org> | 2017-07-13 15:40:59 +0000 |
commit | c3dc0557801e06b1d1dd58931cd28a4d2eda8aba (patch) | |
tree | faad23c070ef9f9f2449a458fdc42e77e105a189 /llvm/lib/Transforms | |
parent | ebe02904d4b91f3445b8e358588bc3237e28ec46 (diff) | |
download | bcm5719-llvm-c3dc0557801e06b1d1dd58931cd28a4d2eda8aba.tar.gz bcm5719-llvm-c3dc0557801e06b1d1dd58931cd28a4d2eda8aba.zip |
Reapply [GlobalOpt] Remove unreachable blocks before optimizing a function.
This commit reapplies r307215 now that we found out and fixed
the cause of the cfi test failure (in r307871).
llvm-svn: 307920
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/IPO/GlobalOpt.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp index 3d57acf06e7..93eab680ca6 100644 --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -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()) |