Home | History | Annotate | Download | only in Utils
      1 //===-- SimplifyIndVar.cpp - Induction variable simplification ------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file implements induction variable simplification. It does
     11 // not define any actual pass or policy, but provides a single function to
     12 // simplify a loop's induction variables based on ScalarEvolution.
     13 //
     14 //===----------------------------------------------------------------------===//
     15 
     16 #define DEBUG_TYPE "indvars"
     17 
     18 #include "llvm/Instructions.h"
     19 #include "llvm/Analysis/Dominators.h"
     20 #include "llvm/Analysis/IVUsers.h"
     21 #include "llvm/Analysis/LoopInfo.h"
     22 #include "llvm/Analysis/LoopPass.h"
     23 #include "llvm/Analysis/ScalarEvolutionExpressions.h"
     24 #include "llvm/Support/CommandLine.h"
     25 #include "llvm/Support/Debug.h"
     26 #include "llvm/Support/raw_ostream.h"
     27 #include "llvm/Transforms/Utils/SimplifyIndVar.h"
     28 #include "llvm/Target/TargetData.h"
     29 #include "llvm/ADT/SmallVector.h"
     30 #include "llvm/ADT/Statistic.h"
     31 
     32 using namespace llvm;
     33 
     34 STATISTIC(NumElimIdentity, "Number of IV identities eliminated");
     35 STATISTIC(NumElimOperand,  "Number of IV operands folded into a use");
     36 STATISTIC(NumElimRem     , "Number of IV remainder operations eliminated");
     37 STATISTIC(NumElimCmp     , "Number of IV comparisons eliminated");
     38 
     39 namespace {
     40   /// SimplifyIndvar - This is a utility for simplifying induction variables
     41   /// based on ScalarEvolution. It is the primary instrument of the
     42   /// IndvarSimplify pass, but it may also be directly invoked to cleanup after
     43   /// other loop passes that preserve SCEV.
     44   class SimplifyIndvar {
     45     Loop             *L;
     46     LoopInfo         *LI;
     47     DominatorTree    *DT;
     48     ScalarEvolution  *SE;
     49     IVUsers          *IU; // NULL for DisableIVRewrite
     50     const TargetData *TD; // May be NULL
     51 
     52     SmallVectorImpl<WeakVH> &DeadInsts;
     53 
     54     bool Changed;
     55 
     56   public:
     57     SimplifyIndvar(Loop *Loop, ScalarEvolution *SE, LPPassManager *LPM,
     58                    SmallVectorImpl<WeakVH> &Dead, IVUsers *IVU = NULL) :
     59       L(Loop),
     60       LI(LPM->getAnalysisIfAvailable<LoopInfo>()),
     61       SE(SE),
     62       IU(IVU),
     63       TD(LPM->getAnalysisIfAvailable<TargetData>()),
     64       DeadInsts(Dead),
     65       Changed(false) {
     66       assert(LI && "IV simplification requires LoopInfo");
     67     }
     68 
     69     bool hasChanged() const { return Changed; }
     70 
     71     /// Iteratively perform simplification on a worklist of users of the
     72     /// specified induction variable. This is the top-level driver that applies
     73     /// all simplicitions to users of an IV.
     74     void simplifyUsers(PHINode *CurrIV, IVVisitor *V = NULL);
     75 
     76     Value *foldIVUser(Instruction *UseInst, Instruction *IVOperand);
     77 
     78     bool eliminateIVUser(Instruction *UseInst, Instruction *IVOperand);
     79     void eliminateIVComparison(ICmpInst *ICmp, Value *IVOperand);
     80     void eliminateIVRemainder(BinaryOperator *Rem, Value *IVOperand,
     81                               bool IsSigned);
     82   };
     83 }
     84 
     85 /// foldIVUser - Fold an IV operand into its use.  This removes increments of an
     86 /// aligned IV when used by a instruction that ignores the low bits.
     87 ///
     88 /// IVOperand is guaranteed SCEVable, but UseInst may not be.
     89 ///
     90 /// Return the operand of IVOperand for this induction variable if IVOperand can
     91 /// be folded (in case more folding opportunities have been exposed).
     92 /// Otherwise return null.
     93 Value *SimplifyIndvar::foldIVUser(Instruction *UseInst, Instruction *IVOperand) {
     94   Value *IVSrc = 0;
     95   unsigned OperIdx = 0;
     96   const SCEV *FoldedExpr = 0;
     97   switch (UseInst->getOpcode()) {
     98   default:
     99     return 0;
    100   case Instruction::UDiv:
    101   case Instruction::LShr:
    102     // We're only interested in the case where we know something about
    103     // the numerator and have a constant denominator.
    104     if (IVOperand != UseInst->getOperand(OperIdx) ||
    105         !isa<ConstantInt>(UseInst->getOperand(1)))
    106       return 0;
    107 
    108     // Attempt to fold a binary operator with constant operand.
    109     // e.g. ((I + 1) >> 2) => I >> 2
    110     if (IVOperand->getNumOperands() != 2 ||
    111         !isa<ConstantInt>(IVOperand->getOperand(1)))
    112       return 0;
    113 
    114     IVSrc = IVOperand->getOperand(0);
    115     // IVSrc must be the (SCEVable) IV, since the other operand is const.
    116     assert(SE->isSCEVable(IVSrc->getType()) && "Expect SCEVable IV operand");
    117 
    118     ConstantInt *D = cast<ConstantInt>(UseInst->getOperand(1));
    119     if (UseInst->getOpcode() == Instruction::LShr) {
    120       // Get a constant for the divisor. See createSCEV.
    121       uint32_t BitWidth = cast<IntegerType>(UseInst->getType())->getBitWidth();
    122       if (D->getValue().uge(BitWidth))
    123         return 0;
    124 
    125       D = ConstantInt::get(UseInst->getContext(),
    126                            APInt(BitWidth, 1).shl(D->getZExtValue()));
    127     }
    128     FoldedExpr = SE->getUDivExpr(SE->getSCEV(IVSrc), SE->getSCEV(D));
    129   }
    130   // We have something that might fold it's operand. Compare SCEVs.
    131   if (!SE->isSCEVable(UseInst->getType()))
    132     return 0;
    133 
    134   // Bypass the operand if SCEV can prove it has no effect.
    135   if (SE->getSCEV(UseInst) != FoldedExpr)
    136     return 0;
    137 
    138   DEBUG(dbgs() << "INDVARS: Eliminated IV operand: " << *IVOperand
    139         << " -> " << *UseInst << '\n');
    140 
    141   UseInst->setOperand(OperIdx, IVSrc);
    142   assert(SE->getSCEV(UseInst) == FoldedExpr && "bad SCEV with folded oper");
    143 
    144   ++NumElimOperand;
    145   Changed = true;
    146   if (IVOperand->use_empty())
    147     DeadInsts.push_back(IVOperand);
    148   return IVSrc;
    149 }
    150 
    151 /// eliminateIVComparison - SimplifyIVUsers helper for eliminating useless
    152 /// comparisons against an induction variable.
    153 void SimplifyIndvar::eliminateIVComparison(ICmpInst *ICmp, Value *IVOperand) {
    154   unsigned IVOperIdx = 0;
    155   ICmpInst::Predicate Pred = ICmp->getPredicate();
    156   if (IVOperand != ICmp->getOperand(0)) {
    157     // Swapped
    158     assert(IVOperand == ICmp->getOperand(1) && "Can't find IVOperand");
    159     IVOperIdx = 1;
    160     Pred = ICmpInst::getSwappedPredicate(Pred);
    161   }
    162 
    163   // Get the SCEVs for the ICmp operands.
    164   const SCEV *S = SE->getSCEV(ICmp->getOperand(IVOperIdx));
    165   const SCEV *X = SE->getSCEV(ICmp->getOperand(1 - IVOperIdx));
    166 
    167   // Simplify unnecessary loops away.
    168   const Loop *ICmpLoop = LI->getLoopFor(ICmp->getParent());
    169   S = SE->getSCEVAtScope(S, ICmpLoop);
    170   X = SE->getSCEVAtScope(X, ICmpLoop);
    171 
    172   // If the condition is always true or always false, replace it with
    173   // a constant value.
    174   if (SE->isKnownPredicate(Pred, S, X))
    175     ICmp->replaceAllUsesWith(ConstantInt::getTrue(ICmp->getContext()));
    176   else if (SE->isKnownPredicate(ICmpInst::getInversePredicate(Pred), S, X))
    177     ICmp->replaceAllUsesWith(ConstantInt::getFalse(ICmp->getContext()));
    178   else
    179     return;
    180 
    181   DEBUG(dbgs() << "INDVARS: Eliminated comparison: " << *ICmp << '\n');
    182   ++NumElimCmp;
    183   Changed = true;
    184   DeadInsts.push_back(ICmp);
    185 }
    186 
    187 /// eliminateIVRemainder - SimplifyIVUsers helper for eliminating useless
    188 /// remainder operations operating on an induction variable.
    189 void SimplifyIndvar::eliminateIVRemainder(BinaryOperator *Rem,
    190                                       Value *IVOperand,
    191                                       bool IsSigned) {
    192   // We're only interested in the case where we know something about
    193   // the numerator.
    194   if (IVOperand != Rem->getOperand(0))
    195     return;
    196 
    197   // Get the SCEVs for the ICmp operands.
    198   const SCEV *S = SE->getSCEV(Rem->getOperand(0));
    199   const SCEV *X = SE->getSCEV(Rem->getOperand(1));
    200 
    201   // Simplify unnecessary loops away.
    202   const Loop *ICmpLoop = LI->getLoopFor(Rem->getParent());
    203   S = SE->getSCEVAtScope(S, ICmpLoop);
    204   X = SE->getSCEVAtScope(X, ICmpLoop);
    205 
    206   // i % n  -->  i  if i is in [0,n).
    207   if ((!IsSigned || SE->isKnownNonNegative(S)) &&
    208       SE->isKnownPredicate(IsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
    209                            S, X))
    210     Rem->replaceAllUsesWith(Rem->getOperand(0));
    211   else {
    212     // (i+1) % n  -->  (i+1)==n?0:(i+1)  if i is in [0,n).
    213     const SCEV *LessOne =
    214       SE->getMinusSCEV(S, SE->getConstant(S->getType(), 1));
    215     if (IsSigned && !SE->isKnownNonNegative(LessOne))
    216       return;
    217 
    218     if (!SE->isKnownPredicate(IsSigned ?
    219                               ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
    220                               LessOne, X))
    221       return;
    222 
    223     ICmpInst *ICmp = new ICmpInst(Rem, ICmpInst::ICMP_EQ,
    224                                   Rem->getOperand(0), Rem->getOperand(1));
    225     SelectInst *Sel =
    226       SelectInst::Create(ICmp,
    227                          ConstantInt::get(Rem->getType(), 0),
    228                          Rem->getOperand(0), "tmp", Rem);
    229     Rem->replaceAllUsesWith(Sel);
    230   }
    231 
    232   // Inform IVUsers about the new users.
    233   if (IU) {
    234     if (Instruction *I = dyn_cast<Instruction>(Rem->getOperand(0)))
    235       IU->AddUsersIfInteresting(I);
    236   }
    237   DEBUG(dbgs() << "INDVARS: Simplified rem: " << *Rem << '\n');
    238   ++NumElimRem;
    239   Changed = true;
    240   DeadInsts.push_back(Rem);
    241 }
    242 
    243 /// eliminateIVUser - Eliminate an operation that consumes a simple IV and has
    244 /// no observable side-effect given the range of IV values.
    245 /// IVOperand is guaranteed SCEVable, but UseInst may not be.
    246 bool SimplifyIndvar::eliminateIVUser(Instruction *UseInst,
    247                                      Instruction *IVOperand) {
    248   if (ICmpInst *ICmp = dyn_cast<ICmpInst>(UseInst)) {
    249     eliminateIVComparison(ICmp, IVOperand);
    250     return true;
    251   }
    252   if (BinaryOperator *Rem = dyn_cast<BinaryOperator>(UseInst)) {
    253     bool IsSigned = Rem->getOpcode() == Instruction::SRem;
    254     if (IsSigned || Rem->getOpcode() == Instruction::URem) {
    255       eliminateIVRemainder(Rem, IVOperand, IsSigned);
    256       return true;
    257     }
    258   }
    259 
    260   // Eliminate any operation that SCEV can prove is an identity function.
    261   if (!SE->isSCEVable(UseInst->getType()) ||
    262       (UseInst->getType() != IVOperand->getType()) ||
    263       (SE->getSCEV(UseInst) != SE->getSCEV(IVOperand)))
    264     return false;
    265 
    266   DEBUG(dbgs() << "INDVARS: Eliminated identity: " << *UseInst << '\n');
    267 
    268   UseInst->replaceAllUsesWith(IVOperand);
    269   ++NumElimIdentity;
    270   Changed = true;
    271   DeadInsts.push_back(UseInst);
    272   return true;
    273 }
    274 
    275 /// pushIVUsers - Add all uses of Def to the current IV's worklist.
    276 ///
    277 static void pushIVUsers(
    278   Instruction *Def,
    279   SmallPtrSet<Instruction*,16> &Simplified,
    280   SmallVectorImpl< std::pair<Instruction*,Instruction*> > &SimpleIVUsers) {
    281 
    282   for (Value::use_iterator UI = Def->use_begin(), E = Def->use_end();
    283        UI != E; ++UI) {
    284     Instruction *User = cast<Instruction>(*UI);
    285 
    286     // Avoid infinite or exponential worklist processing.
    287     // Also ensure unique worklist users.
    288     // If Def is a LoopPhi, it may not be in the Simplified set, so check for
    289     // self edges first.
    290     if (User != Def && Simplified.insert(User))
    291       SimpleIVUsers.push_back(std::make_pair(User, Def));
    292   }
    293 }
    294 
    295 /// isSimpleIVUser - Return true if this instruction generates a simple SCEV
    296 /// expression in terms of that IV.
    297 ///
    298 /// This is similar to IVUsers' isInteresting() but processes each instruction
    299 /// non-recursively when the operand is already known to be a simpleIVUser.
    300 ///
    301 static bool isSimpleIVUser(Instruction *I, const Loop *L, ScalarEvolution *SE) {
    302   if (!SE->isSCEVable(I->getType()))
    303     return false;
    304 
    305   // Get the symbolic expression for this instruction.
    306   const SCEV *S = SE->getSCEV(I);
    307 
    308   // Only consider affine recurrences.
    309   const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S);
    310   if (AR && AR->getLoop() == L)
    311     return true;
    312 
    313   return false;
    314 }
    315 
    316 /// simplifyUsers - Iteratively perform simplification on a worklist of users
    317 /// of the specified induction variable. Each successive simplification may push
    318 /// more users which may themselves be candidates for simplification.
    319 ///
    320 /// This algorithm does not require IVUsers analysis. Instead, it simplifies
    321 /// instructions in-place during analysis. Rather than rewriting induction
    322 /// variables bottom-up from their users, it transforms a chain of IVUsers
    323 /// top-down, updating the IR only when it encouters a clear optimization
    324 /// opportunitiy.
    325 ///
    326 /// Once DisableIVRewrite is default, LSR will be the only client of IVUsers.
    327 ///
    328 void SimplifyIndvar::simplifyUsers(PHINode *CurrIV, IVVisitor *V) {
    329   if (!SE->isSCEVable(CurrIV->getType()))
    330     return;
    331 
    332   // Instructions processed by SimplifyIndvar for CurrIV.
    333   SmallPtrSet<Instruction*,16> Simplified;
    334 
    335   // Use-def pairs if IV users waiting to be processed for CurrIV.
    336   SmallVector<std::pair<Instruction*, Instruction*>, 8> SimpleIVUsers;
    337 
    338   // Push users of the current LoopPhi. In rare cases, pushIVUsers may be
    339   // called multiple times for the same LoopPhi. This is the proper thing to
    340   // do for loop header phis that use each other.
    341   pushIVUsers(CurrIV, Simplified, SimpleIVUsers);
    342 
    343   while (!SimpleIVUsers.empty()) {
    344     std::pair<Instruction*, Instruction*> UseOper =
    345       SimpleIVUsers.pop_back_val();
    346     // Bypass back edges to avoid extra work.
    347     if (UseOper.first == CurrIV) continue;
    348 
    349     Instruction *IVOperand = UseOper.second;
    350     for (unsigned N = 0; IVOperand; ++N) {
    351       assert(N <= Simplified.size() && "runaway iteration");
    352 
    353       Value *NewOper = foldIVUser(UseOper.first, IVOperand);
    354       if (!NewOper)
    355         break; // done folding
    356       IVOperand = dyn_cast<Instruction>(NewOper);
    357     }
    358     if (!IVOperand)
    359       continue;
    360 
    361     if (eliminateIVUser(UseOper.first, IVOperand)) {
    362       pushIVUsers(IVOperand, Simplified, SimpleIVUsers);
    363       continue;
    364     }
    365     CastInst *Cast = dyn_cast<CastInst>(UseOper.first);
    366     if (V && Cast) {
    367       V->visitCast(Cast);
    368       continue;
    369     }
    370     if (isSimpleIVUser(UseOper.first, L, SE)) {
    371       pushIVUsers(UseOper.first, Simplified, SimpleIVUsers);
    372     }
    373   }
    374 }
    375 
    376 namespace llvm {
    377 
    378 /// simplifyUsersOfIV - Simplify instructions that use this induction variable
    379 /// by using ScalarEvolution to analyze the IV's recurrence.
    380 bool simplifyUsersOfIV(PHINode *CurrIV, ScalarEvolution *SE, LPPassManager *LPM,
    381                        SmallVectorImpl<WeakVH> &Dead, IVVisitor *V)
    382 {
    383   LoopInfo *LI = &LPM->getAnalysis<LoopInfo>();
    384   SimplifyIndvar SIV(LI->getLoopFor(CurrIV->getParent()), SE, LPM, Dead);
    385   SIV.simplifyUsers(CurrIV, V);
    386   return SIV.hasChanged();
    387 }
    388 
    389 /// simplifyLoopIVs - Simplify users of induction variables within this
    390 /// loop. This does not actually change or add IVs.
    391 bool simplifyLoopIVs(Loop *L, ScalarEvolution *SE, LPPassManager *LPM,
    392                      SmallVectorImpl<WeakVH> &Dead) {
    393   bool Changed = false;
    394   for (BasicBlock::iterator I = L->getHeader()->begin(); isa<PHINode>(I); ++I) {
    395     Changed |= simplifyUsersOfIV(cast<PHINode>(I), SE, LPM, Dead);
    396   }
    397   return Changed;
    398 }
    399 
    400 /// simplifyIVUsers - Perform simplification on instructions recorded by the
    401 /// IVUsers pass.
    402 ///
    403 /// This is the old approach to IV simplification to be replaced by
    404 /// SimplifyLoopIVs.
    405 bool simplifyIVUsers(IVUsers *IU, ScalarEvolution *SE, LPPassManager *LPM,
    406                      SmallVectorImpl<WeakVH> &Dead) {
    407   SimplifyIndvar SIV(IU->getLoop(), SE, LPM, Dead);
    408 
    409   // Each round of simplification involves a round of eliminating operations
    410   // followed by a round of widening IVs. A single IVUsers worklist is used
    411   // across all rounds. The inner loop advances the user. If widening exposes
    412   // more uses, then another pass through the outer loop is triggered.
    413   for (IVUsers::iterator I = IU->begin(); I != IU->end(); ++I) {
    414     Instruction *UseInst = I->getUser();
    415     Value *IVOperand = I->getOperandValToReplace();
    416 
    417     if (ICmpInst *ICmp = dyn_cast<ICmpInst>(UseInst)) {
    418       SIV.eliminateIVComparison(ICmp, IVOperand);
    419       continue;
    420     }
    421     if (BinaryOperator *Rem = dyn_cast<BinaryOperator>(UseInst)) {
    422       bool IsSigned = Rem->getOpcode() == Instruction::SRem;
    423       if (IsSigned || Rem->getOpcode() == Instruction::URem) {
    424         SIV.eliminateIVRemainder(Rem, IVOperand, IsSigned);
    425         continue;
    426       }
    427     }
    428   }
    429   return SIV.hasChanged();
    430 }
    431 
    432 } // namespace llvm
    433