diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 10:51:19 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 10:51:19 +0000 | 
| commit | eb11fae6d08f479c0799db45860a98af528fa6e7 (patch) | |
| tree | 44d492a50c8c1a7eb8e2d17ea3360ec4d066f042 /lib/Transforms/Scalar/LoopUnswitch.cpp | |
| parent | b8a2042aa938069e862750553db0e4d82d25822c (diff) | |
Notes
Diffstat (limited to 'lib/Transforms/Scalar/LoopUnswitch.cpp')
| -rw-r--r-- | lib/Transforms/Scalar/LoopUnswitch.cpp | 97 | 
1 files changed, 51 insertions, 46 deletions
diff --git a/lib/Transforms/Scalar/LoopUnswitch.cpp b/lib/Transforms/Scalar/LoopUnswitch.cpp index bd468338a1d0..b12586758925 100644 --- a/lib/Transforms/Scalar/LoopUnswitch.cpp +++ b/lib/Transforms/Scalar/LoopUnswitch.cpp @@ -28,7 +28,7 @@  #include "llvm/ADT/DenseMap.h"  #include "llvm/ADT/SmallPtrSet.h" -#include "llvm/ADT/SmallSet.h" +#include "llvm/ADT/SmallPtrSet.h"  #include "llvm/ADT/SmallVector.h"  #include "llvm/ADT/Statistic.h"  #include "llvm/Analysis/AssumptionCache.h" @@ -39,6 +39,7 @@  #include "llvm/Analysis/LoopPass.h"  #include "llvm/Analysis/ScalarEvolution.h"  #include "llvm/Analysis/TargetTransformInfo.h" +#include "llvm/Transforms/Utils/Local.h"  #include "llvm/IR/Attributes.h"  #include "llvm/IR/BasicBlock.h"  #include "llvm/IR/CallSite.h" @@ -66,7 +67,6 @@  #include "llvm/Transforms/Scalar.h"  #include "llvm/Transforms/Utils/BasicBlockUtils.h"  #include "llvm/Transforms/Utils/Cloning.h" -#include "llvm/Transforms/Utils/Local.h"  #include "llvm/Transforms/Utils/LoopUtils.h"  #include "llvm/Transforms/Utils/ValueMapper.h"  #include <algorithm> @@ -298,9 +298,9 @@ bool LUAnalysisCache::countLoop(const Loop *L, const TargetTransformInfo &TTI,      MaxSize -= Props.SizeEstimation * Props.CanBeUnswitchedCount;      if (Metrics.notDuplicatable) { -      DEBUG(dbgs() << "NOT unswitching loop %" -                   << L->getHeader()->getName() << ", contents cannot be " -                   << "duplicated!\n"); +      LLVM_DEBUG(dbgs() << "NOT unswitching loop %" << L->getHeader()->getName() +                        << ", contents cannot be " +                        << "duplicated!\n");        return false;      }    } @@ -635,6 +635,12 @@ bool LoopUnswitch::processCurrentLoop() {      return true;    } +  // Do not do non-trivial unswitch while optimizing for size. +  // FIXME: Use Function::optForSize(). +  if (OptimizeForSize || +      loopHeader->getParent()->hasFnAttribute(Attribute::OptimizeForSize)) +    return false; +    // Run through the instructions in the loop, keeping track of three things:    //    //  - That we do not unswitch loops containing convergent operations, as we @@ -666,12 +672,6 @@ bool LoopUnswitch::processCurrentLoop() {      }    } -  // Do not do non-trivial unswitch while optimizing for size. -  // FIXME: Use Function::optForSize(). -  if (OptimizeForSize || -      loopHeader->getParent()->hasFnAttribute(Attribute::OptimizeForSize)) -    return false; -    for (IntrinsicInst *Guard : Guards) {      Value *LoopCond =          FindLIVLoopCondition(Guard->getOperand(0), currentLoop, Changed).first; @@ -856,20 +856,20 @@ bool LoopUnswitch::UnswitchIfProfitable(Value *LoopCond, Constant *Val,                                          TerminatorInst *TI) {    // Check to see if it would be profitable to unswitch current loop.    if (!BranchesInfo.CostAllowsUnswitching()) { -    DEBUG(dbgs() << "NOT unswitching loop %" -                 << currentLoop->getHeader()->getName() -                 << " at non-trivial condition '" << *Val -                 << "' == " << *LoopCond << "\n" -                 << ". Cost too high.\n"); +    LLVM_DEBUG(dbgs() << "NOT unswitching loop %" +                      << currentLoop->getHeader()->getName() +                      << " at non-trivial condition '" << *Val +                      << "' == " << *LoopCond << "\n" +                      << ". Cost too high.\n");      return false;    }    if (hasBranchDivergence &&        getAnalysis<DivergenceAnalysis>().isDivergent(LoopCond)) { -    DEBUG(dbgs() << "NOT unswitching loop %" -                 << currentLoop->getHeader()->getName() -                 << " at non-trivial condition '" << *Val -                 << "' == " << *LoopCond << "\n" -                 << ". Condition is divergent.\n"); +    LLVM_DEBUG(dbgs() << "NOT unswitching loop %" +                      << currentLoop->getHeader()->getName() +                      << " at non-trivial condition '" << *Val +                      << "' == " << *LoopCond << "\n" +                      << ". Condition is divergent.\n");      return false;    } @@ -910,6 +910,7 @@ void LoopUnswitch::EmitPreheaderBranchOnCondition(Value *LIC, Constant *Val,                                                    BranchInst *OldBranch,                                                    TerminatorInst *TI) {    assert(OldBranch->isUnconditional() && "Preheader is not split correctly"); +  assert(TrueDest != FalseDest && "Branch targets should be different");    // Insert a conditional branch on LIC to the two preheaders.  The original    // code is the true version and the new code is the false version.    Value *BranchVal = LIC; @@ -942,9 +943,9 @@ void LoopUnswitch::EmitPreheaderBranchOnCondition(Value *LIC, Constant *Val,    if (DT) {      // First, add both successors.      SmallVector<DominatorTree::UpdateType, 3> Updates; -    if (TrueDest != OldBranchParent) +    if (TrueDest != OldBranchSucc)        Updates.push_back({DominatorTree::Insert, OldBranchParent, TrueDest}); -    if (FalseDest != OldBranchParent) +    if (FalseDest != OldBranchSucc)        Updates.push_back({DominatorTree::Insert, OldBranchParent, FalseDest});      // If both of the new successors are different from the old one, inform the      // DT that the edge was deleted. @@ -970,11 +971,15 @@ void LoopUnswitch::EmitPreheaderBranchOnCondition(Value *LIC, Constant *Val,  void LoopUnswitch::UnswitchTrivialCondition(Loop *L, Value *Cond, Constant *Val,                                              BasicBlock *ExitBlock,                                              TerminatorInst *TI) { -  DEBUG(dbgs() << "loop-unswitch: Trivial-Unswitch loop %" -               << loopHeader->getName() << " [" << L->getBlocks().size() -               << " blocks] in Function " -               << L->getHeader()->getParent()->getName() << " on cond: " << *Val -               << " == " << *Cond << "\n"); +  LLVM_DEBUG(dbgs() << "loop-unswitch: Trivial-Unswitch loop %" +                    << loopHeader->getName() << " [" << L->getBlocks().size() +                    << " blocks] in Function " +                    << L->getHeader()->getParent()->getName() +                    << " on cond: " << *Val << " == " << *Cond << "\n"); +  // We are going to make essential changes to CFG. This may invalidate cached +  // information for L or one of its parent loops in SCEV. +  if (auto *SEWP = getAnalysisIfAvailable<ScalarEvolutionWrapperPass>()) +    SEWP->getSE().forgetTopmostLoop(L);    // First step, split the preheader, so that we know that there is a safe place    // to insert the conditional branch.  We will change loopPreheader to have a @@ -1038,7 +1043,7 @@ bool LoopUnswitch::TryTrivialLoopUnswitch(bool &Changed) {    // until it finds the trivial condition candidate (condition that is not a    // constant). Since unswitching generates branches with constant conditions,    // this scenario could be very common in practice. -  SmallSet<BasicBlock*, 8> Visited; +  SmallPtrSet<BasicBlock*, 8> Visited;    while (true) {      // If we exit loop or reach a previous visited block, then @@ -1196,13 +1201,15 @@ void LoopUnswitch::SplitExitEdges(Loop *L,  void LoopUnswitch::UnswitchNontrivialCondition(Value *LIC, Constant *Val,                                                 Loop *L, TerminatorInst *TI) {    Function *F = loopHeader->getParent(); -  DEBUG(dbgs() << "loop-unswitch: Unswitching loop %" -        << loopHeader->getName() << " [" << L->getBlocks().size() -        << " blocks] in Function " << F->getName() -        << " when '" << *Val << "' == " << *LIC << "\n"); +  LLVM_DEBUG(dbgs() << "loop-unswitch: Unswitching loop %" +                    << loopHeader->getName() << " [" << L->getBlocks().size() +                    << " blocks] in Function " << F->getName() << " when '" +                    << *Val << "' == " << *LIC << "\n"); +  // We are going to make essential changes to CFG. This may invalidate cached +  // information for L or one of its parent loops in SCEV.    if (auto *SEWP = getAnalysisIfAvailable<ScalarEvolutionWrapperPass>()) -    SEWP->getSE().forgetLoop(L); +    SEWP->getSE().forgetTopmostLoop(L);    LoopBlocks.clear();    NewBlocks.clear(); @@ -1274,12 +1281,11 @@ void LoopUnswitch::UnswitchNontrivialCondition(Value *LIC, Constant *Val,      // If the successor of the exit block had PHI nodes, add an entry for      // NewExit. -    for (BasicBlock::iterator I = ExitSucc->begin(); -         PHINode *PN = dyn_cast<PHINode>(I); ++I) { -      Value *V = PN->getIncomingValueForBlock(ExitBlocks[i]); +    for (PHINode &PN : ExitSucc->phis()) { +      Value *V = PN.getIncomingValueForBlock(ExitBlocks[i]);        ValueToValueMapTy::iterator It = VMap.find(V);        if (It != VMap.end()) V = It->second; -      PN->addIncoming(V, NewExit); +      PN.addIncoming(V, NewExit);      }      if (LandingPadInst *LPad = NewExit->getLandingPadInst()) { @@ -1356,7 +1362,7 @@ static void RemoveFromWorklist(Instruction *I,  static void ReplaceUsesOfWith(Instruction *I, Value *V,                                std::vector<Instruction*> &Worklist,                                Loop *L, LPPassManager *LPM) { -  DEBUG(dbgs() << "Replace with '" << *V << "': " << *I << "\n"); +  LLVM_DEBUG(dbgs() << "Replace with '" << *V << "': " << *I << "\n");    // Add uses to the worklist, which may be dead now.    for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) @@ -1496,10 +1502,9 @@ void LoopUnswitch::RewriteLoopBodyWithConditionConstant(Loop *L, Value *LIC,      BranchInst::Create(Abort, OldSISucc,                         ConstantInt::getTrue(Context), NewSISucc);      // Release the PHI operands for this edge. -    for (BasicBlock::iterator II = NewSISucc->begin(); -         PHINode *PN = dyn_cast<PHINode>(II); ++II) -      PN->setIncomingValue(PN->getBasicBlockIndex(Switch), -                           UndefValue::get(PN->getType())); +    for (PHINode &PN : NewSISucc->phis()) +      PN.setIncomingValue(PN.getBasicBlockIndex(Switch), +                          UndefValue::get(PN.getType()));      // Tell the domtree about the new block. We don't fully update the      // domtree here -- instead we force it to do a full recomputation      // after the pass is complete -- but we do need to inform it of @@ -1526,7 +1531,7 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist, Loop *L) {      // Simple DCE.      if (isInstructionTriviallyDead(I)) { -      DEBUG(dbgs() << "Remove dead instruction '" << *I << "\n"); +      LLVM_DEBUG(dbgs() << "Remove dead instruction '" << *I << "\n");        // Add uses to the worklist, which may be dead now.        for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) @@ -1559,8 +1564,8 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist, Loop *L) {          if (!SinglePred) continue;  // Nothing to do.          assert(SinglePred == Pred && "CFG broken"); -        DEBUG(dbgs() << "Merging blocks: " << Pred->getName() << " <- " -              << Succ->getName() << "\n"); +        LLVM_DEBUG(dbgs() << "Merging blocks: " << Pred->getName() << " <- " +                          << Succ->getName() << "\n");          // Resolve any single entry PHI nodes in Succ.          while (PHINode *PN = dyn_cast<PHINode>(Succ->begin()))  | 
