diff options
Diffstat (limited to 'lib/Transforms/Scalar/JumpThreading.cpp')
| -rw-r--r-- | lib/Transforms/Scalar/JumpThreading.cpp | 28 | 
1 files changed, 21 insertions, 7 deletions
| diff --git a/lib/Transforms/Scalar/JumpThreading.cpp b/lib/Transforms/Scalar/JumpThreading.cpp index 4056cc5cb346..dc9143bebc45 100644 --- a/lib/Transforms/Scalar/JumpThreading.cpp +++ b/lib/Transforms/Scalar/JumpThreading.cpp @@ -64,6 +64,11 @@ ImplicationSearchThreshold(             "condition to use to thread over a weaker condition"),    cl::init(3), cl::Hidden); +static cl::opt<bool> PrintLVIAfterJumpThreading( +    "print-lvi-after-jump-threading", +    cl::desc("Print the LazyValueInfo cache after JumpThreading"), cl::init(false), +    cl::Hidden); +  namespace {    /// This pass performs 'jump threading', which looks at blocks that have    /// multiple predecessors and multiple successors.  If one or more of the @@ -93,9 +98,10 @@ namespace {      bool runOnFunction(Function &F) override;      void getAnalysisUsage(AnalysisUsage &AU) const override { +      if (PrintLVIAfterJumpThreading) +        AU.addRequired<DominatorTreeWrapperPass>();        AU.addRequired<AAResultsWrapperPass>();        AU.addRequired<LazyValueInfoWrapperPass>(); -      AU.addPreserved<LazyValueInfoWrapperPass>();        AU.addPreserved<GlobalsAAWrapperPass>();        AU.addRequired<TargetLibraryInfoWrapperPass>();      } @@ -137,8 +143,14 @@ bool JumpThreading::runOnFunction(Function &F) {      BFI.reset(new BlockFrequencyInfo(F, *BPI, LI));    } -  return Impl.runImpl(F, TLI, LVI, AA, HasProfileData, std::move(BFI), -                      std::move(BPI)); +  bool Changed = Impl.runImpl(F, TLI, LVI, AA, HasProfileData, std::move(BFI), +                              std::move(BPI)); +  if (PrintLVIAfterJumpThreading) { +    dbgs() << "LVI for function '" << F.getName() << "':\n"; +    LVI->printLVI(F, getAnalysis<DominatorTreeWrapperPass>().getDomTree(), +                  dbgs()); +  } +  return Changed;  }  PreservedAnalyses JumpThreadingPass::run(Function &F, @@ -231,13 +243,15 @@ bool JumpThreadingPass::runImpl(Function &F, TargetLibraryInfo *TLI_,        // Can't thread an unconditional jump, but if the block is "almost        // empty", we can replace uses of it with uses of the successor and make        // this dead. -      // We should not eliminate the loop header either, because eliminating -      // a loop header might later prevent LoopSimplify from transforming nested -      // loops into simplified form. +      // We should not eliminate the loop header or latch either, because +      // eliminating a loop header or latch might later prevent LoopSimplify +      // from transforming nested loops into simplified form. We will rely on +      // later passes in backend to clean up empty blocks.        if (BI && BI->isUnconditional() &&            BB != &BB->getParent()->getEntryBlock() &&            // If the terminator is the only non-phi instruction, try to nuke it. -          BB->getFirstNonPHIOrDbg()->isTerminator() && !LoopHeaders.count(BB)) { +          BB->getFirstNonPHIOrDbg()->isTerminator() && !LoopHeaders.count(BB) && +          !LoopHeaders.count(BI->getSuccessor(0))) {          // FIXME: It is always conservatively correct to drop the info          // for a block even if it doesn't get erased.  This isn't totally          // awesome, but it allows us to use AssertingVH to prevent nasty | 
