LCOV - code coverage report
Current view: top level - lib/Analysis - IVUsers.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 169 171 98.8 %
Date: 2017-09-14 15:23:50 Functions: 24 25 96.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- IVUsers.cpp - Induction Variable Users -------------------*- C++ -*-===//
       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 bookkeeping for "interesting" users of expressions
      11             : // computed from induction variables.
      12             : //
      13             : //===----------------------------------------------------------------------===//
      14             : 
      15             : #include "llvm/Analysis/IVUsers.h"
      16             : #include "llvm/ADT/STLExtras.h"
      17             : #include "llvm/Analysis/AssumptionCache.h"
      18             : #include "llvm/Analysis/CodeMetrics.h"
      19             : #include "llvm/Analysis/LoopAnalysisManager.h"
      20             : #include "llvm/Analysis/LoopPass.h"
      21             : #include "llvm/Analysis/ScalarEvolutionExpressions.h"
      22             : #include "llvm/Analysis/ValueTracking.h"
      23             : #include "llvm/IR/Constants.h"
      24             : #include "llvm/IR/DataLayout.h"
      25             : #include "llvm/IR/DerivedTypes.h"
      26             : #include "llvm/IR/Dominators.h"
      27             : #include "llvm/IR/Instructions.h"
      28             : #include "llvm/IR/Module.h"
      29             : #include "llvm/IR/Type.h"
      30             : #include "llvm/Support/Debug.h"
      31             : #include "llvm/Support/raw_ostream.h"
      32             : #include <algorithm>
      33             : using namespace llvm;
      34             : 
      35             : #define DEBUG_TYPE "iv-users"
      36             : 
      37             : AnalysisKey IVUsersAnalysis::Key;
      38             : 
      39          12 : IVUsers IVUsersAnalysis::run(Loop &L, LoopAnalysisManager &AM,
      40             :                              LoopStandardAnalysisResults &AR) {
      41          12 :   return IVUsers(&L, &AR.AC, &AR.LI, &AR.DT, &AR.SE);
      42             : }
      43             : 
      44             : char IVUsersWrapperPass::ID = 0;
      45       26356 : INITIALIZE_PASS_BEGIN(IVUsersWrapperPass, "iv-users",
      46             :                       "Induction Variable Users", false, true)
      47       26356 : INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
      48       26356 : INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
      49       26356 : INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
      50       26356 : INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)
      51      179938 : INITIALIZE_PASS_END(IVUsersWrapperPass, "iv-users", "Induction Variable Users",
      52             :                     false, true)
      53             : 
      54           0 : Pass *llvm::createIVUsersPass() { return new IVUsersWrapperPass(); }
      55             : 
      56             : /// isInteresting - Test whether the given expression is "interesting" when
      57             : /// used by the given expression, within the context of analyzing the
      58             : /// given loop.
      59       18202 : static bool isInteresting(const SCEV *S, const Instruction *I, const Loop *L,
      60             :                           ScalarEvolution *SE, LoopInfo *LI) {
      61             :   // An addrec is interesting if it's affine or if it has an interesting start.
      62       14125 :   if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S)) {
      63             :     // Keep things simple. Don't touch loop-variant strides unless they're
      64             :     // only used outside the loop and we can simplify them.
      65       14125 :     if (AR->getLoop() == L)
      66       14001 :       return AR->isAffine() ||
      67          45 :              (!L->contains(I) &&
      68          14 :               SE->getSCEVAtScope(AR, LI->getLoopFor(I->getParent())) != AR);
      69             :     // Otherwise recurse to see if the start value is interesting, and that
      70             :     // the step value is not interesting, since we don't yet know how to
      71             :     // do effective SCEV expansions for addrecs with interesting steps.
      72         285 :     return isInteresting(AR->getStart(), I, L, SE, LI) &&
      73         142 :           !isInteresting(AR->getStepRecurrence(*SE), I, L, SE, LI);
      74             :   }
      75             : 
      76             :   // An add is interesting if exactly one of its operands is interesting.
      77         648 :   if (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(S)) {
      78         648 :     bool AnyInterestingYet = false;
      79        2620 :     for (const auto *Op : Add->operands())
      80        1324 :       if (isInteresting(Op, I, L, SE, LI)) {
      81         614 :         if (AnyInterestingYet)
      82             :           return false;
      83             :         AnyInterestingYet = true;
      84             :       }
      85             :     return AnyInterestingYet;
      86             :   }
      87             : 
      88             :   // Nothing else is interesting here.
      89             :   return false;
      90             : }
      91             : 
      92             : /// Return true if all loop headers that dominate this block are in simplified
      93             : /// form.
      94       21204 : static bool isSimplifiedLoopNest(BasicBlock *BB, const DominatorTree *DT,
      95             :                                  const LoopInfo *LI,
      96             :                                  SmallPtrSetImpl<Loop*> &SimpleLoopNests) {
      97       21204 :   Loop *NearestLoop = nullptr;
      98       81319 :   for (DomTreeNode *Rung = DT->getNode(BB);
      99       60115 :        Rung; Rung = Rung->getIDom()) {
     100       56487 :     BasicBlock *DomBB = Rung->getBlock();
     101      112974 :     Loop *DomLoop = LI->getLoopFor(DomBB);
     102       84110 :     if (DomLoop && DomLoop->getHeader() == DomBB) {
     103             :       // If the domtree walk reaches a loop with no preheader, return false.
     104       23435 :       if (!DomLoop->isLoopSimplifyForm())
     105             :         return false;
     106             :       // If we have already checked this loop nest, stop checking.
     107       23422 :       if (SimpleLoopNests.count(DomLoop))
     108             :         break;
     109             :       // If we have not already checked this loop nest, remember the loop
     110             :       // header nearest to BB. The nearest loop may not contain BB.
     111        5859 :       if (!NearestLoop)
     112        3767 :         NearestLoop = DomLoop;
     113             :     }
     114             :   }
     115       21191 :   if (NearestLoop)
     116        3760 :     SimpleLoopNests.insert(NearestLoop);
     117             :   return true;
     118             : }
     119             : 
     120             : /// IVUseShouldUsePostIncValue - We have discovered a "User" of an IV expression
     121             : /// and now we need to decide whether the user should use the preinc or post-inc
     122             : /// value.  If this user should use the post-inc version of the IV, return true.
     123             : ///
     124             : /// Choosing wrong here can break dominance properties (if we choose to use the
     125             : /// post-inc value when we cannot) or it can end up adding extra live-ranges to
     126             : /// the loop, resulting in reg-reg copies (if we use the pre-inc value when we
     127             : /// should use the post-inc value).
     128       11316 : static bool IVUseShouldUsePostIncValue(Instruction *User, Value *Operand,
     129             :                                        const Loop *L, DominatorTree *DT) {
     130             :   // If the user is in the loop, use the preinc value.
     131       22632 :   if (L->contains(User))
     132             :     return false;
     133             : 
     134         985 :   BasicBlock *LatchBlock = L->getLoopLatch();
     135         985 :   if (!LatchBlock)
     136             :     return false;
     137             : 
     138             :   // Ok, the user is outside of the loop.  If it is dominated by the latch
     139             :   // block, use the post-inc value.
     140         985 :   if (DT->dominates(LatchBlock, User->getParent()))
     141             :     return true;
     142             : 
     143             :   // There is one case we have to be careful of: PHI nodes.  These little guys
     144             :   // can live in blocks that are not dominated by the latch block, but (since
     145             :   // their uses occur in the predecessor block, not the block the PHI lives in)
     146             :   // should still use the post-inc value.  Check for this case now.
     147         804 :   PHINode *PN = dyn_cast<PHINode>(User);
     148         804 :   if (!PN || !Operand)
     149             :     return false; // not a phi, not dominated by latch block.
     150             : 
     151             :   // Look at all of the uses of Operand by the PHI node.  If any use corresponds
     152             :   // to a block that is not dominated by the latch block, give up and use the
     153             :   // preincremented value.
     154        1497 :   for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
     155        1288 :     if (PN->getIncomingValue(i) == Operand &&
     156         832 :         !DT->dominates(LatchBlock, PN->getIncomingBlock(i)))
     157             :       return false;
     158             : 
     159             :   // Okay, all uses of Operand by PN are in predecessor blocks that really are
     160             :   // dominated by the latch block.  Use the post-incremented value.
     161             :   return true;
     162             : }
     163             : 
     164             : /// AddUsersImpl - Inspect the specified instruction.  If it is a
     165             : /// reducible SCEV, recursively add its users to the IVUsesByStride set and
     166             : /// return true.  Otherwise, return false.
     167       28247 : bool IVUsers::AddUsersImpl(Instruction *I,
     168             :                            SmallPtrSetImpl<Loop*> &SimpleLoopNests) {
     169       56494 :   const DataLayout &DL = I->getModule()->getDataLayout();
     170             : 
     171             :   // Add this IV user to the Processed set before returning false to ensure that
     172             :   // all IV users are members of the set. See IVUsers::isIVUserOrOperand.
     173       28247 :   if (!Processed.insert(I).second)
     174             :     return true;    // Instruction already handled.
     175             : 
     176       28222 :   if (!SE->isSCEVable(I->getType()))
     177             :     return false;   // Void and FP expressions cannot be reduced.
     178             : 
     179             :   // IVUsers is used by LSR which assumes that all SCEV expressions are safe to
     180             :   // pass to SCEVExpander. Expressions are not safe to expand if they represent
     181             :   // operations that are not safe to speculate, namely integer division.
     182       46298 :   if (!isa<PHINode>(I) && !isSafeToSpeculativelyExecute(I))
     183             :     return false;
     184             : 
     185             :   // LSR is not APInt clean, do not touch integers bigger than 64-bits.
     186             :   // Also avoid creating IVs of non-native types. For example, we don't want a
     187             :   // 64-bit IV in 32-bit code just because the loop has one 64-bit cast.
     188       20451 :   uint64_t Width = SE->getTypeSizeInBits(I->getType());
     189       40880 :   if (Width > 64 || !DL.isLegalInteger(Width))
     190             :     return false;
     191             : 
     192             :   // Don't attempt to promote ephemeral values to indvars. They will be removed
     193             :   // later anyway.
     194       16594 :   if (EphValues.count(I))
     195             :     return false;
     196             : 
     197             :   // Get the symbolic expression for this instruction.
     198       16593 :   const SCEV *ISE = SE->getSCEV(I);
     199             : 
     200             :   // If we've come to an uninteresting expression, stop the traversal and
     201             :   // call this a user.
     202       16593 :   if (!isInteresting(ISE, I, L, SE, LI))
     203             :     return false;
     204             : 
     205       13965 :   SmallPtrSet<Instruction *, 4> UniqueUsers;
     206       66665 :   for (Use &U : I->uses()) {
     207       49568 :     Instruction *User = cast<Instruction>(U.getUser());
     208       24784 :     if (!UniqueUsers.insert(User).second)
     209        3616 :       continue;
     210             : 
     211             :     // Do not infinitely recurse on PHI nodes.
     212       53040 :     if (isa<PHINode>(User) && Processed.count(User))
     213        3544 :       continue;
     214             : 
     215             :     // Only consider IVUsers that are dominated by simplified loop
     216             :     // headers. Otherwise, SCEVExpander will crash.
     217       21204 :     BasicBlock *UseBB = User->getParent();
     218             :     // A phi's use is live out of its predecessor block.
     219       21807 :     if (PHINode *PHI = dyn_cast<PHINode>(User)) {
     220         603 :       unsigned OperandNo = U.getOperandNo();
     221         603 :       unsigned ValNo = PHINode::getIncomingValueNumForOperand(OperandNo);
     222         603 :       UseBB = PHI->getIncomingBlock(ValNo);
     223             :     }
     224       21204 :     if (!isSimplifiedLoopNest(UseBB, DT, LI, SimpleLoopNests))
     225          14 :       return false;
     226             : 
     227             :     // Descend recursively, but not into PHI nodes outside the current loop.
     228             :     // It's important to see the entire expression outside the loop to get
     229             :     // choices that depend on addressing mode use right, although we won't
     230             :     // consider references outside the loop in all cases.
     231             :     // If User is already in Processed, we don't want to recurse into it again,
     232             :     // but do want to record a second reference in the same instruction.
     233       21191 :     bool AddUserToIVUsers = false;
     234       42382 :     if (LI->getLoopFor(User->getParent()) != L) {
     235        4703 :       if (isa<PHINode>(User) || Processed.count(User) ||
     236        1221 :           !AddUsersImpl(User, SimpleLoopNests)) {
     237             :         DEBUG(dbgs() << "FOUND USER in other loop: " << *User << '\n'
     238             :                      << "   OF SCEV: " << *ISE << '\n');
     239             :         AddUserToIVUsers = true;
     240             :       }
     241       19450 :     } else if (Processed.count(User) || !AddUsersImpl(User, SimpleLoopNests)) {
     242             :       DEBUG(dbgs() << "FOUND USER: " << *User << '\n'
     243             :                    << "   OF SCEV: " << *ISE << '\n');
     244             :       AddUserToIVUsers = true;
     245             :     }
     246             : 
     247             :     if (AddUserToIVUsers) {
     248             :       // Okay, we found a user that we cannot reduce.
     249       10767 :       IVStrideUse &NewUse = AddUser(User, I);
     250             :       // Autodetect the post-inc loop set, populating NewUse.PostIncLoops.
     251             :       // The regular return value here is discarded; instead of recording
     252             :       // it, we just recompute it when we need it.
     253       10767 :       const SCEV *OriginalISE = ISE;
     254             : 
     255       11316 :       auto NormalizePred = [&](const SCEVAddRecExpr *AR) {
     256       11316 :         auto *L = AR->getLoop();
     257       11316 :         bool Result = IVUseShouldUsePostIncValue(User, I, L, DT);
     258       11316 :         if (Result)
     259         391 :           NewUse.PostIncLoops.insert(L);
     260       11316 :         return Result;
     261       10767 :       };
     262             : 
     263       21534 :       ISE = normalizeForPostIncUseIf(ISE, NormalizePred, *SE);
     264             : 
     265             :       // PostIncNormalization effectively simplifies the expression under
     266             :       // pre-increment assumptions. Those assumptions (no wrapping) might not
     267             :       // hold for the post-inc value. Catch such cases by making sure the
     268             :       // transformation is invertible.
     269       10767 :       if (OriginalISE != ISE) {
     270             :         const SCEV *DenormalizedISE =
     271         365 :             denormalizeForPostIncUse(ISE, NewUse.PostIncLoops, *SE);
     272             : 
     273             :         // If we normalized the expression, but denormalization doesn't give the
     274             :         // original one, discard this user.
     275         365 :         if (OriginalISE != DenormalizedISE) {
     276             :           DEBUG(dbgs() << "   DISCARDING (NORMALIZATION ISN'T INVERTIBLE): "
     277             :                        << *ISE << '\n');
     278           2 :           IVUses.pop_back();
     279           1 :           return false;
     280             :         }
     281             :       }
     282             :       DEBUG(if (SE->getSCEV(I) != ISE)
     283             :               dbgs() << "   NORMALIZED TO: " << *ISE << '\n');
     284             :     }
     285             :   }
     286             :   return true;
     287             : }
     288             : 
     289        7787 : bool IVUsers::AddUsersIfInteresting(Instruction *I) {
     290             :   // SCEVExpander can only handle users that are dominated by simplified loop
     291             :   // entries. Keep track of all loops that are only dominated by other simple
     292             :   // loops so we don't traverse the domtree for each user.
     293       15574 :   SmallPtrSet<Loop*,16> SimpleLoopNests;
     294             : 
     295       15574 :   return AddUsersImpl(I, SimpleLoopNests);
     296             : }
     297             : 
     298       11432 : IVStrideUse &IVUsers::AddUser(Instruction *User, Value *Operand) {
     299       22864 :   IVUses.push_back(new IVStrideUse(this, User, Operand));
     300       22864 :   return IVUses.back();
     301             : }
     302             : 
     303        5947 : IVUsers::IVUsers(Loop *L, AssumptionCache *AC, LoopInfo *LI, DominatorTree *DT,
     304        5947 :                  ScalarEvolution *SE)
     305       23788 :     : L(L), AC(AC), LI(LI), DT(DT), SE(SE), IVUses() {
     306             :   // Collect ephemeral values so that AddUsersIfInteresting skips them.
     307        5947 :   EphValues.clear();
     308        5947 :   CodeMetrics::collectEphemeralValues(L, AC, EphValues);
     309             : 
     310             :   // Find all uses of induction variables in this loop, and categorize
     311             :   // them by stride.  Start by finding all of the PHI nodes in the header for
     312             :   // this loop.  If they are induction variables, inspect their uses.
     313       31575 :   for (BasicBlock::iterator I = L->getHeader()->begin(); isa<PHINode>(I); ++I)
     314        7787 :     (void)AddUsersIfInteresting(&*I);
     315        5947 : }
     316             : 
     317          10 : void IVUsers::print(raw_ostream &OS, const Module *M) const {
     318          10 :   OS << "IV Users for loop ";
     319          20 :   L->getHeader()->printAsOperand(OS, false);
     320          10 :   if (SE->hasLoopInvariantBackedgeTakenCount(L)) {
     321           8 :     OS << " with backedge-taken count " << *SE->getBackedgeTakenCount(L);
     322             :   }
     323          10 :   OS << ":\n";
     324             : 
     325          46 :   for (const IVStrideUse &IVUse : IVUses) {
     326          16 :     OS << "  ";
     327          16 :     IVUse.getOperandValToReplace()->printAsOperand(OS, false);
     328          32 :     OS << " = " << *getReplacementExpr(IVUse);
     329          26 :     for (auto PostIncLoop : IVUse.PostIncLoops) {
     330          10 :       OS << " (post-inc with loop ";
     331          20 :       PostIncLoop->getHeader()->printAsOperand(OS, false);
     332          10 :       OS << ")";
     333             :     }
     334          16 :     OS << " in  ";
     335          16 :     if (IVUse.getUser())
     336          16 :       IVUse.getUser()->print(OS);
     337             :     else
     338           0 :       OS << "Printing <null> User";
     339          16 :     OS << '\n';
     340             :   }
     341          10 : }
     342             : 
     343             : #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
     344             : LLVM_DUMP_METHOD void IVUsers::dump() const { print(dbgs()); }
     345             : #endif
     346             : 
     347        5935 : void IVUsers::releaseMemory() {
     348        5935 :   Processed.clear();
     349       11870 :   IVUses.clear();
     350        5935 : }
     351             : 
     352       47040 : IVUsersWrapperPass::IVUsersWrapperPass() : LoopPass(ID) {
     353       15680 :   initializeIVUsersWrapperPassPass(*PassRegistry::getPassRegistry());
     354       15680 : }
     355             : 
     356       15680 : void IVUsersWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
     357       15680 :   AU.addRequired<AssumptionCacheTracker>();
     358       15680 :   AU.addRequired<LoopInfoWrapperPass>();
     359       15680 :   AU.addRequired<DominatorTreeWrapperPass>();
     360       15680 :   AU.addRequired<ScalarEvolutionWrapperPass>();
     361       15680 :   AU.setPreservesAll();
     362       15680 : }
     363             : 
     364        5935 : bool IVUsersWrapperPass::runOnLoop(Loop *L, LPPassManager &LPM) {
     365        5935 :   auto *AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(
     366       11870 :       *L->getHeader()->getParent());
     367       11870 :   auto *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
     368       11870 :   auto *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
     369       11870 :   auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
     370             : 
     371       11870 :   IU.reset(new IVUsers(L, AC, LI, DT, SE));
     372        5935 :   return false;
     373             : }
     374             : 
     375           5 : void IVUsersWrapperPass::print(raw_ostream &OS, const Module *M) const {
     376          10 :   IU->print(OS, M);
     377           5 : }
     378             : 
     379       11870 : void IVUsersWrapperPass::releaseMemory() { IU->releaseMemory(); }
     380             : 
     381             : /// getReplacementExpr - Return a SCEV expression which computes the
     382             : /// value of the OperandValToReplace.
     383       19122 : const SCEV *IVUsers::getReplacementExpr(const IVStrideUse &IU) const {
     384       38244 :   return SE->getSCEV(IU.getOperandValToReplace());
     385             : }
     386             : 
     387             : /// getExpr - Return the expression for the use.
     388       19106 : const SCEV *IVUsers::getExpr(const IVStrideUse &IU) const {
     389       19106 :   return normalizeForPostIncUse(getReplacementExpr(IU), IU.getPostIncLoops(),
     390       38212 :                                 *SE);
     391             : }
     392             : 
     393         161 : static const SCEVAddRecExpr *findAddRecForLoop(const SCEV *S, const Loop *L) {
     394         161 :   if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S)) {
     395         161 :     if (AR->getLoop() == L)
     396             :       return AR;
     397           3 :     return findAddRecForLoop(AR->getStart(), L);
     398             :   }
     399             : 
     400           3 :   if (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(S)) {
     401           6 :     for (const auto *Op : Add->operands())
     402           3 :       if (const SCEVAddRecExpr *AR = findAddRecForLoop(Op, L))
     403             :         return AR;
     404             :     return nullptr;
     405             :   }
     406             : 
     407             :   return nullptr;
     408             : }
     409             : 
     410         158 : const SCEV *IVUsers::getStride(const IVStrideUse &IU, const Loop *L) const {
     411         158 :   if (const SCEVAddRecExpr *AR = findAddRecForLoop(getExpr(IU), L))
     412         158 :     return AR->getStepRecurrence(*SE);
     413             :   return nullptr;
     414             : }
     415             : 
     416        2312 : void IVStrideUse::transformToPostInc(const Loop *L) {
     417        2312 :   PostIncLoops.insert(L);
     418        2312 : }
     419             : 
     420          19 : void IVStrideUse::deleted() {
     421             :   // Remove this user from the list.
     422          57 :   Parent->Processed.erase(this->getUser());
     423          38 :   Parent->IVUses.erase(this);
     424             :   // this now dangles!
     425          19 : }

Generated by: LCOV version 1.13