diff options
Diffstat (limited to 'lib/Transforms/IPO/GlobalOpt.cpp')
| -rw-r--r-- | lib/Transforms/IPO/GlobalOpt.cpp | 18 | 
1 files changed, 18 insertions, 0 deletions
| diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index 3d57acf06e746..93eab680ca6be 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/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()) | 
