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

Generated by: LCOV version 1.13