LCOV - code coverage report
Current view: top level - lib/Analysis - IVDescriptors.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 292 301 97.0 %
Date: 2018-10-20 13:21:21 Functions: 22 23 95.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- llvm/Analysis/IVDescriptors.cpp - IndVar Descriptors -----*- 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 "describes" induction and recurrence variables.
      11             : //
      12             : //===----------------------------------------------------------------------===//
      13             : 
      14             : #include "llvm/Analysis/IVDescriptors.h"
      15             : #include "llvm/ADT/ScopeExit.h"
      16             : #include "llvm/Analysis/AliasAnalysis.h"
      17             : #include "llvm/Analysis/BasicAliasAnalysis.h"
      18             : #include "llvm/Analysis/GlobalsModRef.h"
      19             : #include "llvm/Analysis/InstructionSimplify.h"
      20             : #include "llvm/Analysis/LoopInfo.h"
      21             : #include "llvm/Analysis/LoopPass.h"
      22             : #include "llvm/Analysis/MustExecute.h"
      23             : #include "llvm/Analysis/ScalarEvolution.h"
      24             : #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
      25             : #include "llvm/Analysis/ScalarEvolutionExpander.h"
      26             : #include "llvm/Analysis/ScalarEvolutionExpressions.h"
      27             : #include "llvm/Analysis/TargetTransformInfo.h"
      28             : #include "llvm/Analysis/ValueTracking.h"
      29             : #include "llvm/IR/DomTreeUpdater.h"
      30             : #include "llvm/IR/Dominators.h"
      31             : #include "llvm/IR/Instructions.h"
      32             : #include "llvm/IR/Module.h"
      33             : #include "llvm/IR/PatternMatch.h"
      34             : #include "llvm/IR/ValueHandle.h"
      35             : #include "llvm/Pass.h"
      36             : #include "llvm/Support/Debug.h"
      37             : #include "llvm/Support/KnownBits.h"
      38             : 
      39             : using namespace llvm;
      40             : using namespace llvm::PatternMatch;
      41             : 
      42             : #define DEBUG_TYPE "iv-descriptors"
      43             : 
      44         119 : bool RecurrenceDescriptor::areAllUsesIn(Instruction *I,
      45             :                                         SmallPtrSetImpl<Instruction *> &Set) {
      46         355 :   for (User::op_iterator Use = I->op_begin(), E = I->op_end(); Use != E; ++Use)
      47         209 :     if (!Set.count(dyn_cast<Instruction>(*Use)))
      48             :       return false;
      49             :   return true;
      50             : }
      51             : 
      52       27552 : bool RecurrenceDescriptor::isIntegerRecurrenceKind(RecurrenceKind Kind) {
      53       27552 :   switch (Kind) {
      54             :   default:
      55             :     break;
      56             :   case RK_IntegerAdd:
      57             :   case RK_IntegerMult:
      58             :   case RK_IntegerOr:
      59             :   case RK_IntegerAnd:
      60             :   case RK_IntegerXor:
      61             :   case RK_IntegerMinMax:
      62             :     return true;
      63             :   }
      64        8876 :   return false;
      65             : }
      66             : 
      67         953 : bool RecurrenceDescriptor::isFloatingPointRecurrenceKind(RecurrenceKind Kind) {
      68         953 :   return (Kind != RK_NoRecurrence) && !isIntegerRecurrenceKind(Kind);
      69             : }
      70             : 
      71       18004 : bool RecurrenceDescriptor::isArithmeticRecurrenceKind(RecurrenceKind Kind) {
      72             :   switch (Kind) {
      73             :   default:
      74             :     break;
      75             :   case RK_IntegerAdd:
      76             :   case RK_IntegerMult:
      77             :   case RK_FloatAdd:
      78             :   case RK_FloatMult:
      79             :     return true;
      80             :   }
      81             :   return false;
      82             : }
      83             : 
      84             : /// Determines if Phi may have been type-promoted. If Phi has a single user
      85             : /// that ANDs the Phi with a type mask, return the user. RT is updated to
      86             : /// account for the narrower bit width represented by the mask, and the AND
      87             : /// instruction is added to CI.
      88        6362 : static Instruction *lookThroughAnd(PHINode *Phi, Type *&RT,
      89             :                                    SmallPtrSetImpl<Instruction *> &Visited,
      90             :                                    SmallPtrSetImpl<Instruction *> &CI) {
      91        6332 :   if (!Phi->hasOneUse())
      92             :     return Phi;
      93             : 
      94        2327 :   const APInt *M = nullptr;
      95        2327 :   Instruction *I, *J = cast<Instruction>(Phi->use_begin()->getUser());
      96             : 
      97             :   // Matches either I & 2^x-1 or 2^x-1 & I. If we find a match, we update RT
      98             :   // with a new integer type of the corresponding bit width.
      99        2327 :   if (match(J, m_c_And(m_Instruction(I), m_APInt(M)))) {
     100         130 :     int32_t Bits = (*M + 1).exactLogBase2();
     101          65 :     if (Bits > 0) {
     102          18 :       RT = IntegerType::get(Phi->getContext(), Bits);
     103          18 :       Visited.insert(Phi);
     104          18 :       CI.insert(J);
     105          18 :       return J;
     106             :     }
     107             :   }
     108             :   return Phi;
     109             : }
     110             : 
     111             : /// Compute the minimal bit width needed to represent a reduction whose exit
     112             : /// instruction is given by Exit.
     113           9 : static std::pair<Type *, bool> computeRecurrenceType(Instruction *Exit,
     114             :                                                      DemandedBits *DB,
     115             :                                                      AssumptionCache *AC,
     116             :                                                      DominatorTree *DT) {
     117             :   bool IsSigned = false;
     118           9 :   const DataLayout &DL = Exit->getModule()->getDataLayout();
     119           9 :   uint64_t MaxBitWidth = DL.getTypeSizeInBits(Exit->getType());
     120             : 
     121           9 :   if (DB) {
     122             :     // Use the demanded bits analysis to determine the bits that are live out
     123             :     // of the exit instruction, rounding up to the nearest power of two. If the
     124             :     // use of demanded bits results in a smaller bit width, we know the value
     125             :     // must be positive (i.e., IsSigned = false), because if this were not the
     126             :     // case, the sign bit would have been demanded.
     127           9 :     auto Mask = DB->getDemandedBits(Exit);
     128           9 :     MaxBitWidth = Mask.getBitWidth() - Mask.countLeadingZeros();
     129             :   }
     130             : 
     131           9 :   if (MaxBitWidth == DL.getTypeSizeInBits(Exit->getType()) && AC && DT) {
     132             :     // If demanded bits wasn't able to limit the bit width, we can try to use
     133             :     // value tracking instead. This can be the case, for example, if the value
     134             :     // may be negative.
     135           3 :     auto NumSignBits = ComputeNumSignBits(Exit, DL, 0, AC, nullptr, DT);
     136           3 :     auto NumTypeBits = DL.getTypeSizeInBits(Exit->getType());
     137           3 :     MaxBitWidth = NumTypeBits - NumSignBits;
     138           6 :     KnownBits Bits = computeKnownBits(Exit, DL);
     139           3 :     if (!Bits.isNonNegative()) {
     140             :       // If the value is not known to be non-negative, we set IsSigned to true,
     141             :       // meaning that we will use sext instructions instead of zext
     142             :       // instructions to restore the original type.
     143             :       IsSigned = true;
     144           1 :       if (!Bits.isNegative())
     145             :         // If the value is not known to be negative, we don't known what the
     146             :         // upper bit is, and therefore, we don't know what kind of extend we
     147             :         // will need. In this case, just increase the bit width by one bit and
     148             :         // use sext.
     149           1 :         ++MaxBitWidth;
     150             :     }
     151             :   }
     152             :   if (!isPowerOf2_64(MaxBitWidth))
     153             :     MaxBitWidth = NextPowerOf2(MaxBitWidth);
     154             : 
     155           9 :   return std::make_pair(Type::getIntNTy(Exit->getContext(), MaxBitWidth),
     156           9 :                         IsSigned);
     157             : }
     158             : 
     159             : /// Collect cast instructions that can be ignored in the vectorizer's cost
     160             : /// model, given a reduction exit value and the minimal type in which the
     161             : /// reduction can be represented.
     162           6 : static void collectCastsToIgnore(Loop *TheLoop, Instruction *Exit,
     163             :                                  Type *RecurrenceType,
     164             :                                  SmallPtrSetImpl<Instruction *> &Casts) {
     165             : 
     166             :   SmallVector<Instruction *, 8> Worklist;
     167             :   SmallPtrSet<Instruction *, 8> Visited;
     168           6 :   Worklist.push_back(Exit);
     169             : 
     170          39 :   while (!Worklist.empty()) {
     171             :     Instruction *Val = Worklist.pop_back_val();
     172          33 :     Visited.insert(Val);
     173             :     if (auto *Cast = dyn_cast<CastInst>(Val))
     174           6 :       if (Cast->getSrcTy() == RecurrenceType) {
     175             :         // If the source type of a cast instruction is equal to the recurrence
     176             :         // type, it will be eliminated, and should be ignored in the vectorizer
     177             :         // cost model.
     178           4 :         Casts.insert(Cast);
     179           4 :         continue;
     180             :       }
     181             : 
     182             :     // Add all operands to the work list if they are loop-varying values that
     183             :     // we haven't yet visited.
     184          83 :     for (Value *O : cast<User>(Val)->operands())
     185          54 :       if (auto *I = dyn_cast<Instruction>(O))
     186          35 :         if (TheLoop->contains(I) && !Visited.count(I))
     187          27 :           Worklist.push_back(I);
     188             :   }
     189           6 : }
     190             : 
     191       27552 : bool RecurrenceDescriptor::AddReductionVar(PHINode *Phi, RecurrenceKind Kind,
     192             :                                            Loop *TheLoop, bool HasFunNoNaNAttr,
     193             :                                            RecurrenceDescriptor &RedDes,
     194             :                                            DemandedBits *DB,
     195             :                                            AssumptionCache *AC,
     196             :                                            DominatorTree *DT) {
     197       27552 :   if (Phi->getNumIncomingValues() != 2)
     198             :     return false;
     199             : 
     200             :   // Reduction variables are only found in the loop header block.
     201       55104 :   if (Phi->getParent() != TheLoop->getHeader())
     202             :     return false;
     203             : 
     204             :   // Obtain the reduction start value from the value that comes from the loop
     205             :   // preheader.
     206       27552 :   Value *RdxStart = Phi->getIncomingValueForBlock(TheLoop->getLoopPreheader());
     207             : 
     208             :   // ExitInstruction is the single value which is used outside the loop.
     209             :   // We only allow for a single reduction value to be used outside the loop.
     210             :   // This includes users of the reduction, variables (which form a cycle
     211             :   // which ends in the phi node).
     212             :   Instruction *ExitInstruction = nullptr;
     213             :   // Indicates that we found a reduction operation in our scan.
     214             :   bool FoundReduxOp = false;
     215             : 
     216             :   // We start with the PHI node and scan for all of the users of this
     217             :   // instruction. All users must be instructions that can be used as reduction
     218             :   // variables (such as ADD). We must have a single out-of-block user. The cycle
     219             :   // must include the original PHI.
     220             :   bool FoundStartPHI = false;
     221             : 
     222             :   // To recognize min/max patterns formed by a icmp select sequence, we store
     223             :   // the number of instruction we saw from the recognized min/max pattern,
     224             :   //  to make sure we only see exactly the two instructions.
     225             :   unsigned NumCmpSelectPatternInst = 0;
     226             :   InstDesc ReduxDesc(false, nullptr);
     227             : 
     228             :   // Data used for determining if the recurrence has been type-promoted.
     229       27552 :   Type *RecurrenceType = Phi->getType();
     230             :   SmallPtrSet<Instruction *, 4> CastInsts;
     231       27552 :   Instruction *Start = Phi;
     232       27552 :   bool IsSigned = false;
     233             : 
     234             :   SmallPtrSet<Instruction *, 8> VisitedInsts;
     235             :   SmallVector<Instruction *, 8> Worklist;
     236             : 
     237             :   // Return early if the recurrence kind does not match the type of Phi. If the
     238             :   // recurrence kind is arithmetic, we attempt to look through AND operations
     239             :   // resulting from the type promotion performed by InstCombine.  Vector
     240             :   // operations are not limited to the legal integer widths, so we may be able
     241             :   // to evaluate the reduction in the narrower width.
     242             :   if (RecurrenceType->isFloatingPointTy()) {
     243         953 :     if (!isFloatingPointRecurrenceKind(Kind))
     244             :       return false;
     245             :   } else {
     246       26599 :     if (!isIntegerRecurrenceKind(Kind))
     247             :       return false;
     248       18004 :     if (isArithmeticRecurrenceKind(Kind))
     249        6362 :       Start = lookThroughAnd(Phi, RecurrenceType, VisitedInsts, CastInsts);
     250             :   }
     251             : 
     252       18285 :   Worklist.push_back(Start);
     253       18285 :   VisitedInsts.insert(Start);
     254             : 
     255             :   // A value in the reduction can be used:
     256             :   //  - By the reduction:
     257             :   //      - Reduction operation:
     258             :   //        - One use of reduction value (safe).
     259             :   //        - Multiple use of reduction value (not safe).
     260             :   //      - PHI:
     261             :   //        - All uses of the PHI must be the reduction (safe).
     262             :   //        - Otherwise, not safe.
     263             :   //  - By instructions outside of the loop (safe).
     264             :   //      * One value may have several outside users, but all outside
     265             :   //        uses must be of the same value.
     266             :   //  - By an instruction that is not part of the reduction (not safe).
     267             :   //    This is either:
     268             :   //      * An instruction type other than PHI or the reduction operation.
     269             :   //      * A PHI in the header other than the initial PHI.
     270       37727 :   while (!Worklist.empty()) {
     271       37255 :     Instruction *Cur = Worklist.back();
     272             :     Worklist.pop_back();
     273             : 
     274             :     // No Users.
     275             :     // If the instruction has no users then this is a broken chain and can't be
     276             :     // a reduction variable.
     277       37255 :     if (Cur->use_empty())
     278       17813 :       return false;
     279             : 
     280             :     bool IsAPhi = isa<PHINode>(Cur);
     281             : 
     282             :     // A header PHI use other than the original PHI.
     283       35444 :     if (Cur != Phi && IsAPhi && Cur->getParent() == Phi->getParent())
     284             :       return false;
     285             : 
     286             :     // Reductions of instructions such as Div, and Sub is only possible if the
     287             :     // LHS is the reduction variable.
     288       28224 :     if (!Cur->isCommutative() && !IsAPhi && !isa<SelectInst>(Cur) &&
     289       18361 :         !isa<ICmpInst>(Cur) && !isa<FCmpInst>(Cur) &&
     290       18300 :         !VisitedInsts.count(dyn_cast<Instruction>(Cur->getOperand(0))))
     291             :       return false;
     292             : 
     293             :     // Any reduction instruction must be of one of the allowed kinds. We ignore
     294             :     // the starting value (the Phi or an AND instruction if the Phi has been
     295             :     // type-promoted).
     296       30422 :     if (Cur != Start) {
     297       12227 :       ReduxDesc = isRecurrenceInstr(Cur, Kind, ReduxDesc, HasFunNoNaNAttr);
     298       12227 :       if (!ReduxDesc.isRecurrence())
     299             :         return false;
     300             :     }
     301             : 
     302             :     bool IsASelect = isa<SelectInst>(Cur);
     303             : 
     304             :     // A conditional reduction operation must only have 2 or less uses in
     305             :     // VisitedInsts.
     306       20145 :     if (IsASelect && (Kind == RK_FloatAdd || Kind == RK_FloatMult) &&
     307          10 :         hasMultipleUsesOf(Cur, VisitedInsts, 2))
     308             :       return false;
     309             : 
     310             :     // A reduction operation must only have one use of the reduction value.
     311       23709 :     if (!IsAPhi && !IsASelect && Kind != RK_IntegerMinMax &&
     312       20135 :         Kind != RK_FloatMinMax && hasMultipleUsesOf(Cur, VisitedInsts, 1))
     313             :       return false;
     314             : 
     315             :     // All inputs to a PHI node must be a reduction value.
     316       20135 :     if (IsAPhi && Cur != Phi && !areAllUsesIn(Cur, VisitedInsts))
     317             :       return false;
     318             : 
     319       20043 :     if (Kind == RK_IntegerMinMax &&
     320        2900 :         (isa<ICmpInst>(Cur) || isa<SelectInst>(Cur)))
     321          52 :       ++NumCmpSelectPatternInst;
     322       20043 :     if (Kind == RK_FloatMinMax && (isa<FCmpInst>(Cur) || isa<SelectInst>(Cur)))
     323          34 :       ++NumCmpSelectPatternInst;
     324             : 
     325             :     // Check  whether we found a reduction operator.
     326       38265 :     FoundReduxOp |= !IsAPhi && Cur != Start;
     327             : 
     328             :     // Process users of current instruction. Push non-PHI nodes after PHI nodes
     329             :     // onto the stack. This way we are going to have seen all inputs to PHI
     330             :     // nodes once we get to them.
     331             :     SmallVector<Instruction *, 8> NonPHIs;
     332             :     SmallVector<Instruction *, 8> PHIs;
     333       62621 :     for (User *U : Cur->users()) {
     334       43179 :       Instruction *UI = cast<Instruction>(U);
     335             : 
     336             :       // Check if we found the exit user.
     337       43179 :       BasicBlock *Parent = UI->getParent();
     338       43179 :       if (!TheLoop->contains(Parent)) {
     339             :         // If we already know this instruction is used externally, move on to
     340             :         // the next user.
     341        1114 :         if (ExitInstruction == Cur)
     342         522 :           continue;
     343             : 
     344             :         // Exit if you find multiple values used outside or if the header phi
     345             :         // node is being used. In this case the user uses the value of the
     346             :         // previous iteration, in which case we would loose "VF-1" iterations of
     347             :         // the reduction operation if we vectorize.
     348        1102 :         if (ExitInstruction != nullptr || Cur == Phi)
     349         601 :           return false;
     350             : 
     351             :         // The instruction used by an outside user must be the last instruction
     352             :         // before we feed back to the reduction phi. Otherwise, we loose VF-1
     353             :         // operations on the value.
     354        1038 :         if (!is_contained(Phi->operands(), Cur))
     355             :           return false;
     356             : 
     357             :         ExitInstruction = Cur;
     358             :         continue;
     359             :       }
     360             : 
     361             :       // Process instructions only once (termination). Each reduction cycle
     362             :       // value must only be used once, except by phi nodes and min/max
     363             :       // reductions which are represented as a cmp followed by a select.
     364             :       InstDesc IgnoredVal(false, nullptr);
     365       42065 :       if (VisitedInsts.insert(UI).second) {
     366       80924 :         if (isa<PHINode>(UI))
     367         448 :           PHIs.push_back(UI);
     368             :         else
     369       40014 :           NonPHIs.push_back(UI);
     370        3206 :       } else if (!isa<PHINode>(UI) &&
     371          61 :                  ((!isa<FCmpInst>(UI) && !isa<ICmpInst>(UI) &&
     372          52 :                    !isa<SelectInst>(UI)) ||
     373          52 :                   (!isConditionalRdxPattern(Kind, UI).isRecurrence() &&
     374        1594 :                    !isMinMaxSelectCmpPattern(UI, IgnoredVal).isRecurrence())))
     375           9 :         return false;
     376             : 
     377             :       // Remember that we completed the cycle.
     378       42056 :       if (UI == Phi)
     379             :         FoundStartPHI = true;
     380             :     }
     381       19442 :     Worklist.append(PHIs.begin(), PHIs.end());
     382       19442 :     Worklist.append(NonPHIs.begin(), NonPHIs.end());
     383             :   }
     384             : 
     385             :   // This means we have seen one but not the other instruction of the
     386             :   // pattern or more than just a select and cmp.
     387         472 :   if ((Kind == RK_IntegerMinMax || Kind == RK_FloatMinMax) &&
     388             :       NumCmpSelectPatternInst != 2)
     389             :     return false;
     390             : 
     391         472 :   if (!FoundStartPHI || !FoundReduxOp || !ExitInstruction)
     392             :     return false;
     393             : 
     394         469 :   if (Start != Phi) {
     395             :     // If the starting value is not the same as the phi node, we speculatively
     396             :     // looked through an 'and' instruction when evaluating a potential
     397             :     // arithmetic reduction to determine if it may have been type-promoted.
     398             :     //
     399             :     // We now compute the minimal bit width that is required to represent the
     400             :     // reduction. If this is the same width that was indicated by the 'and', we
     401             :     // can represent the reduction in the smaller type. The 'and' instruction
     402             :     // will be eliminated since it will essentially be a cast instruction that
     403             :     // can be ignore in the cost model. If we compute a different type than we
     404             :     // did when evaluating the 'and', the 'and' will not be eliminated, and we
     405             :     // will end up with different kinds of operations in the recurrence
     406             :     // expression (e.g., RK_IntegerAND, RK_IntegerADD). We give up if this is
     407             :     // the case.
     408             :     //
     409             :     // The vectorizer relies on InstCombine to perform the actual
     410             :     // type-shrinking. It does this by inserting instructions to truncate the
     411             :     // exit value of the reduction to the width indicated by RecurrenceType and
     412             :     // then extend this value back to the original width. If IsSigned is false,
     413             :     // a 'zext' instruction will be generated; otherwise, a 'sext' will be
     414             :     // used.
     415             :     //
     416             :     // TODO: We should not rely on InstCombine to rewrite the reduction in the
     417             :     //       smaller type. We should just generate a correctly typed expression
     418             :     //       to begin with.
     419             :     Type *ComputedType;
     420             :     std::tie(ComputedType, IsSigned) =
     421           9 :         computeRecurrenceType(ExitInstruction, DB, AC, DT);
     422           9 :     if (ComputedType != RecurrenceType)
     423           3 :       return false;
     424             : 
     425             :     // The recurrence expression will be represented in a narrower type. If
     426             :     // there are any cast instructions that will be unnecessary, collect them
     427             :     // in CastInsts. Note that the 'and' instruction was already included in
     428             :     // this list.
     429             :     //
     430             :     // TODO: A better way to represent this may be to tag in some way all the
     431             :     //       instructions that are a part of the reduction. The vectorizer cost
     432             :     //       model could then apply the recurrence type to these instructions,
     433             :     //       without needing a white list of instructions to ignore.
     434           6 :     collectCastsToIgnore(TheLoop, ExitInstruction, RecurrenceType, CastInsts);
     435             :   }
     436             : 
     437             :   // We found a reduction var if we have reached the original phi node and we
     438             :   // only have a single instruction with out-of-loop users.
     439             : 
     440             :   // The ExitInstruction(Instruction which is allowed to have out-of-loop users)
     441             :   // is saved as part of the RecurrenceDescriptor.
     442             : 
     443             :   // Save the description of this reduction variable.
     444             :   RecurrenceDescriptor RD(
     445             :       RdxStart, ExitInstruction, Kind, ReduxDesc.getMinMaxKind(),
     446         932 :       ReduxDesc.getUnsafeAlgebraInst(), RecurrenceType, IsSigned, CastInsts);
     447         466 :   RedDes = RD;
     448             : 
     449             :   return true;
     450             : }
     451             : 
     452             : /// Returns true if the instruction is a Select(ICmp(X, Y), X, Y) instruction
     453             : /// pattern corresponding to a min(X, Y) or max(X, Y).
     454             : RecurrenceDescriptor::InstDesc
     455         147 : RecurrenceDescriptor::isMinMaxSelectCmpPattern(Instruction *I, InstDesc &Prev) {
     456             : 
     457             :   assert((isa<ICmpInst>(I) || isa<FCmpInst>(I) || isa<SelectInst>(I)) &&
     458             :          "Expect a select instruction");
     459             :   Instruction *Cmp = nullptr;
     460             :   SelectInst *Select = nullptr;
     461             : 
     462             :   // We must handle the select(cmp()) as a single instruction. Advance to the
     463             :   // select.
     464             :   if ((Cmp = dyn_cast<ICmpInst>(I)) || (Cmp = dyn_cast<FCmpInst>(I))) {
     465          60 :     if (!Cmp->hasOneUse() || !(Select = dyn_cast<SelectInst>(*I->user_begin())))
     466             :       return InstDesc(false, I);
     467          44 :     return InstDesc(Select, Prev.getMinMaxKind());
     468             :   }
     469             : 
     470             :   // Only handle single use cases for now.
     471             :   if (!(Select = dyn_cast<SelectInst>(I)))
     472             :     return InstDesc(false, I);
     473          87 :   if (!(Cmp = dyn_cast<ICmpInst>(I->getOperand(0))) &&
     474             :       !(Cmp = dyn_cast<FCmpInst>(I->getOperand(0))))
     475             :     return InstDesc(false, I);
     476          87 :   if (!Cmp->hasOneUse())
     477             :     return InstDesc(false, I);
     478             : 
     479             :   Value *CmpLeft;
     480             :   Value *CmpRight;
     481             : 
     482             :   // Look for a min/max pattern.
     483          87 :   if (m_UMin(m_Value(CmpLeft), m_Value(CmpRight)).match(Select))
     484             :     return InstDesc(Select, MRK_UIntMin);
     485          79 :   else if (m_UMax(m_Value(CmpLeft), m_Value(CmpRight)).match(Select))
     486             :     return InstDesc(Select, MRK_UIntMax);
     487          65 :   else if (m_SMax(m_Value(CmpLeft), m_Value(CmpRight)).match(Select))
     488             :     return InstDesc(Select, MRK_SIntMax);
     489          57 :   else if (m_SMin(m_Value(CmpLeft), m_Value(CmpRight)).match(Select))
     490             :     return InstDesc(Select, MRK_SIntMin);
     491          37 :   else if (m_OrdFMin(m_Value(CmpLeft), m_Value(CmpRight)).match(Select))
     492             :     return InstDesc(Select, MRK_FloatMin);
     493          27 :   else if (m_OrdFMax(m_Value(CmpLeft), m_Value(CmpRight)).match(Select))
     494             :     return InstDesc(Select, MRK_FloatMax);
     495          19 :   else if (m_UnordFMin(m_Value(CmpLeft), m_Value(CmpRight)).match(Select))
     496             :     return InstDesc(Select, MRK_FloatMin);
     497          11 :   else if (m_UnordFMax(m_Value(CmpLeft), m_Value(CmpRight)).match(Select))
     498             :     return InstDesc(Select, MRK_FloatMax);
     499             : 
     500             :   return InstDesc(false, I);
     501             : }
     502             : 
     503             : /// Returns true if the select instruction has users in the compare-and-add
     504             : /// reduction pattern below. The select instruction argument is the last one
     505             : /// in the sequence.
     506             : ///
     507             : /// %sum.1 = phi ...
     508             : /// ...
     509             : /// %cmp = fcmp pred %0, %CFP
     510             : /// %add = fadd %0, %sum.1
     511             : /// %sum.2 = select %cmp, %add, %sum.1
     512             : RecurrenceDescriptor::InstDesc
     513          62 : RecurrenceDescriptor::isConditionalRdxPattern(
     514             :     RecurrenceKind Kind, Instruction *I) {
     515             :   SelectInst *SI = dyn_cast<SelectInst>(I);
     516             :   if (!SI)
     517             :     return InstDesc(false, I);
     518             : 
     519             :   CmpInst *CI = dyn_cast<CmpInst>(SI->getCondition());
     520             :   // Only handle single use cases for now.
     521          62 :   if (!CI || !CI->hasOneUse())
     522             :     return InstDesc(false, I);
     523             : 
     524             :   Value *TrueVal = SI->getTrueValue();
     525             :   Value *FalseVal = SI->getFalseValue();
     526             :   // Handle only when either of operands of select instruction is a PHI
     527             :   // node for now.
     528             :   if ((isa<PHINode>(*TrueVal) && isa<PHINode>(*FalseVal)) ||
     529             :       (!isa<PHINode>(*TrueVal) && !isa<PHINode>(*FalseVal)))
     530             :     return InstDesc(false, I);
     531             : 
     532             :   Instruction *I1 =
     533             :       isa<PHINode>(*TrueVal) ? dyn_cast<Instruction>(FalseVal)
     534             :                              : dyn_cast<Instruction>(TrueVal);
     535          62 :   if (!I1 || !I1->isBinaryOp())
     536             :     return InstDesc(false, I);
     537             : 
     538             :   Value *Op1, *Op2;
     539          32 :   if (m_FAdd(m_Value(Op1), m_Value(Op2)).match(I1) ||
     540          10 :       m_FSub(m_Value(Op1), m_Value(Op2)).match(I1))
     541          16 :     return InstDesc(Kind == RK_FloatAdd, SI);
     542             : 
     543           6 :   if (m_FMul(m_Value(Op1), m_Value(Op2)).match(I1))
     544           4 :     return InstDesc(Kind == RK_FloatMult, SI);
     545             : 
     546             :   return InstDesc(false, I);
     547             : }
     548             : 
     549             : RecurrenceDescriptor::InstDesc
     550       12227 : RecurrenceDescriptor::isRecurrenceInstr(Instruction *I, RecurrenceKind Kind,
     551             :                                         InstDesc &Prev, bool HasFunNoNaNAttr) {
     552       12227 :   bool FP = I->getType()->isFloatingPointTy();
     553       12227 :   Instruction *UAI = Prev.getUnsafeAlgebraInst();
     554       12227 :   if (!UAI && FP && !I->isFast())
     555             :     UAI = I; // Found an unsafe (unvectorizable) algebra instruction.
     556             : 
     557       12227 :   switch (I->getOpcode()) {
     558             :   default:
     559             :     return InstDesc(false, I);
     560         119 :   case Instruction::PHI:
     561         119 :     return InstDesc(I, Prev.getMinMaxKind(), Prev.getUnsafeAlgebraInst());
     562        6586 :   case Instruction::Sub:
     563             :   case Instruction::Add:
     564        6586 :     return InstDesc(Kind == RK_IntegerAdd, I);
     565         118 :   case Instruction::Mul:
     566         118 :     return InstDesc(Kind == RK_IntegerMult, I);
     567         245 :   case Instruction::And:
     568         245 :     return InstDesc(Kind == RK_IntegerAnd, I);
     569          78 :   case Instruction::Or:
     570          78 :     return InstDesc(Kind == RK_IntegerOr, I);
     571          57 :   case Instruction::Xor:
     572          57 :     return InstDesc(Kind == RK_IntegerXor, I);
     573          25 :   case Instruction::FMul:
     574          25 :     return InstDesc(Kind == RK_FloatMult, I, UAI);
     575         150 :   case Instruction::FSub:
     576             :   case Instruction::FAdd:
     577         150 :     return InstDesc(Kind == RK_FloatAdd, I, UAI);
     578          70 :   case Instruction::Select:
     579          70 :     if (Kind == RK_FloatAdd || Kind == RK_FloatMult)
     580          10 :       return isConditionalRdxPattern(Kind, I);
     581             :     LLVM_FALLTHROUGH;
     582             :   case Instruction::FCmp:
     583             :   case Instruction::ICmp:
     584         768 :     if (Kind != RK_IntegerMinMax &&
     585         697 :         (!HasFunNoNaNAttr || Kind != RK_FloatMinMax))
     586             :       return InstDesc(false, I);
     587         105 :     return isMinMaxSelectCmpPattern(I, Prev);
     588             :   }
     589             : }
     590             : 
     591        1753 : bool RecurrenceDescriptor::hasMultipleUsesOf(
     592             :     Instruction *I, SmallPtrSetImpl<Instruction *> &Insts,
     593             :     unsigned MaxNumUses) {
     594             :   unsigned NumUses = 0;
     595        7022 :   for (User::op_iterator Use = I->op_begin(), E = I->op_end(); Use != E;
     596             :        ++Use) {
     597        3516 :     if (Insts.count(dyn_cast<Instruction>(*Use)))
     598        1763 :       ++NumUses;
     599        3516 :     if (NumUses > MaxNumUses)
     600             :       return true;
     601             :   }
     602             : 
     603             :   return false;
     604             : }
     605        3322 : bool RecurrenceDescriptor::isReductionPHI(PHINode *Phi, Loop *TheLoop,
     606             :                                           RecurrenceDescriptor &RedDes,
     607             :                                           DemandedBits *DB, AssumptionCache *AC,
     608             :                                           DominatorTree *DT) {
     609             : 
     610             :   BasicBlock *Header = TheLoop->getHeader();
     611        3322 :   Function &F = *Header->getParent();
     612             :   bool HasFunNoNaNAttr =
     613        3322 :       F.getFnAttribute("no-nans-fp-math").getValueAsString() == "true";
     614             : 
     615        3322 :   if (AddReductionVar(Phi, RK_IntegerAdd, TheLoop, HasFunNoNaNAttr, RedDes, DB,
     616             :                       AC, DT)) {
     617             :     LLVM_DEBUG(dbgs() << "Found an ADD reduction PHI." << *Phi << "\n");
     618             :     return true;
     619             :   }
     620        3056 :   if (AddReductionVar(Phi, RK_IntegerMult, TheLoop, HasFunNoNaNAttr, RedDes, DB,
     621             :                       AC, DT)) {
     622             :     LLVM_DEBUG(dbgs() << "Found a MUL reduction PHI." << *Phi << "\n");
     623             :     return true;
     624             :   }
     625        3051 :   if (AddReductionVar(Phi, RK_IntegerOr, TheLoop, HasFunNoNaNAttr, RedDes, DB,
     626             :                       AC, DT)) {
     627             :     LLVM_DEBUG(dbgs() << "Found an OR reduction PHI." << *Phi << "\n");
     628             :     return true;
     629             :   }
     630        3032 :   if (AddReductionVar(Phi, RK_IntegerAnd, TheLoop, HasFunNoNaNAttr, RedDes, DB,
     631             :                       AC, DT)) {
     632             :     LLVM_DEBUG(dbgs() << "Found an AND reduction PHI." << *Phi << "\n");
     633             :     return true;
     634             :   }
     635        3005 :   if (AddReductionVar(Phi, RK_IntegerXor, TheLoop, HasFunNoNaNAttr, RedDes, DB,
     636             :                       AC, DT)) {
     637             :     LLVM_DEBUG(dbgs() << "Found a XOR reduction PHI." << *Phi << "\n");
     638             :     return true;
     639             :   }
     640        3002 :   if (AddReductionVar(Phi, RK_IntegerMinMax, TheLoop, HasFunNoNaNAttr, RedDes,
     641             :                       DB, AC, DT)) {
     642             :     LLVM_DEBUG(dbgs() << "Found a MINMAX reduction PHI." << *Phi << "\n");
     643             :     return true;
     644             :   }
     645        2977 :   if (AddReductionVar(Phi, RK_FloatMult, TheLoop, HasFunNoNaNAttr, RedDes, DB,
     646             :                       AC, DT)) {
     647             :     LLVM_DEBUG(dbgs() << "Found an FMult reduction PHI." << *Phi << "\n");
     648             :     return true;
     649             :   }
     650        2974 :   if (AddReductionVar(Phi, RK_FloatAdd, TheLoop, HasFunNoNaNAttr, RedDes, DB,
     651             :                       AC, DT)) {
     652             :     LLVM_DEBUG(dbgs() << "Found an FAdd reduction PHI." << *Phi << "\n");
     653             :     return true;
     654             :   }
     655        2925 :   if (AddReductionVar(Phi, RK_FloatMinMax, TheLoop, HasFunNoNaNAttr, RedDes, DB,
     656             :                       AC, DT)) {
     657             :     LLVM_DEBUG(dbgs() << "Found an float MINMAX reduction PHI." << *Phi
     658             :                       << "\n");
     659          17 :     return true;
     660             :   }
     661             :   // Not a reduction of known type.
     662             :   return false;
     663             : }
     664             : 
     665         391 : bool RecurrenceDescriptor::isFirstOrderRecurrence(
     666             :     PHINode *Phi, Loop *TheLoop,
     667             :     DenseMap<Instruction *, Instruction *> &SinkAfter, DominatorTree *DT) {
     668             : 
     669             :   // Ensure the phi node is in the loop header and has two incoming values.
     670         782 :   if (Phi->getParent() != TheLoop->getHeader() ||
     671             :       Phi->getNumIncomingValues() != 2)
     672             :     return false;
     673             : 
     674             :   // Ensure the loop has a preheader and a single latch block. The loop
     675             :   // vectorizer will need the latch to set up the next iteration of the loop.
     676         391 :   auto *Preheader = TheLoop->getLoopPreheader();
     677         391 :   auto *Latch = TheLoop->getLoopLatch();
     678         391 :   if (!Preheader || !Latch)
     679             :     return false;
     680             : 
     681             :   // Ensure the phi node's incoming blocks are the loop preheader and latch.
     682         391 :   if (Phi->getBasicBlockIndex(Preheader) < 0 ||
     683         391 :       Phi->getBasicBlockIndex(Latch) < 0)
     684             :     return false;
     685             : 
     686             :   // Get the previous value. The previous value comes from the latch edge while
     687             :   // the initial value comes form the preheader edge.
     688         391 :   auto *Previous = dyn_cast<Instruction>(Phi->getIncomingValueForBlock(Latch));
     689         385 :   if (!Previous || !TheLoop->contains(Previous) || isa<PHINode>(Previous) ||
     690         304 :       SinkAfter.count(Previous)) // Cannot rely on dominance due to motion.
     691          87 :     return false;
     692             : 
     693             :   // Ensure every user of the phi node is dominated by the previous value.
     694             :   // The dominance requirement ensures the loop vectorizer will not need to
     695             :   // vectorize the initial value prior to the first iteration of the loop.
     696             :   // TODO: Consider extending this sinking to handle other kinds of instructions
     697             :   // and expressions, beyond sinking a single cast past Previous.
     698         291 :   if (Phi->hasOneUse()) {
     699         161 :     auto *I = Phi->user_back();
     700         263 :     if (I->isCast() && (I->getParent() == Phi->getParent()) && I->hasOneUse() &&
     701          51 :         DT->dominates(Previous, I->user_back())) {
     702          19 :       if (!DT->dominates(Previous, I)) // Otherwise we're good w/o sinking.
     703          13 :         SinkAfter[I] = Previous;
     704          19 :       return true;
     705             :     }
     706             :   }
     707             : 
     708         391 :   for (User *U : Phi->users())
     709             :     if (auto *I = dyn_cast<Instruction>(U)) {
     710         347 :       if (!DT->dominates(Previous, I))
     711             :         return false;
     712             :     }
     713             : 
     714             :   return true;
     715             : }
     716             : 
     717             : /// This function returns the identity element (or neutral element) for
     718             : /// the operation K.
     719         175 : Constant *RecurrenceDescriptor::getRecurrenceIdentity(RecurrenceKind K,
     720             :                                                       Type *Tp) {
     721         175 :   switch (K) {
     722         117 :   case RK_IntegerXor:
     723             :   case RK_IntegerAdd:
     724             :   case RK_IntegerOr:
     725             :     // Adding, Xoring, Oring zero to a number does not change it.
     726         117 :     return ConstantInt::get(Tp, 0);
     727           4 :   case RK_IntegerMult:
     728             :     // Multiplying a number by 1 does not change it.
     729           4 :     return ConstantInt::get(Tp, 1);
     730          21 :   case RK_IntegerAnd:
     731             :     // AND-ing a number with an all-1 value does not change it.
     732          21 :     return ConstantInt::get(Tp, -1, true);
     733           3 :   case RK_FloatMult:
     734             :     // Multiplying a number by 1 does not change it.
     735           3 :     return ConstantFP::get(Tp, 1.0L);
     736          30 :   case RK_FloatAdd:
     737             :     // Adding zero to a number does not change it.
     738          30 :     return ConstantFP::get(Tp, 0.0L);
     739           0 :   default:
     740           0 :     llvm_unreachable("Unknown recurrence kind");
     741             :   }
     742             : }
     743             : 
     744             : /// This function translates the recurrence kind to an LLVM binary operator.
     745         212 : unsigned RecurrenceDescriptor::getRecurrenceBinOp(RecurrenceKind Kind) {
     746             :   switch (Kind) {
     747             :   case RK_IntegerAdd:
     748             :     return Instruction::Add;
     749             :   case RK_IntegerMult:
     750             :     return Instruction::Mul;
     751             :   case RK_IntegerOr:
     752             :     return Instruction::Or;
     753             :   case RK_IntegerAnd:
     754             :     return Instruction::And;
     755             :   case RK_IntegerXor:
     756             :     return Instruction::Xor;
     757             :   case RK_FloatMult:
     758             :     return Instruction::FMul;
     759             :   case RK_FloatAdd:
     760             :     return Instruction::FAdd;
     761             :   case RK_IntegerMinMax:
     762             :     return Instruction::ICmp;
     763             :   case RK_FloatMinMax:
     764             :     return Instruction::FCmp;
     765           0 :   default:
     766           0 :     llvm_unreachable("Unknown recurrence operation");
     767             :   }
     768             : }
     769             : 
     770        2573 : InductionDescriptor::InductionDescriptor(Value *Start, InductionKind K,
     771             :                                          const SCEV *Step, BinaryOperator *BOp,
     772        2573 :                                          SmallVectorImpl<Instruction *> *Casts)
     773        2573 :     : StartValue(Start), IK(K), Step(Step), InductionBinOp(BOp) {
     774             :   assert(IK != IK_NoInduction && "Not an induction");
     775             : 
     776             :   // Start value type should match the induction kind and the value
     777             :   // itself should not be null.
     778             :   assert(StartValue && "StartValue is null");
     779             :   assert((IK != IK_PtrInduction || StartValue->getType()->isPointerTy()) &&
     780             :          "StartValue is not a pointer for pointer induction");
     781             :   assert((IK != IK_IntInduction || StartValue->getType()->isIntegerTy()) &&
     782             :          "StartValue is not an integer for integer induction");
     783             : 
     784             :   // Check the Step Value. It should be non-zero integer value.
     785             :   assert((!getConstIntStepValue() || !getConstIntStepValue()->isZero()) &&
     786             :          "Step value is zero");
     787             : 
     788             :   assert((IK != IK_PtrInduction || getConstIntStepValue()) &&
     789             :          "Step value should be constant for pointer induction");
     790             :   assert((IK == IK_FpInduction || Step->getType()->isIntegerTy()) &&
     791             :          "StepValue is not an integer");
     792             : 
     793             :   assert((IK != IK_FpInduction || Step->getType()->isFloatingPointTy()) &&
     794             :          "StepValue is not FP for FpInduction");
     795             :   assert((IK != IK_FpInduction ||
     796             :           (InductionBinOp &&
     797             :            (InductionBinOp->getOpcode() == Instruction::FAdd ||
     798             :             InductionBinOp->getOpcode() == Instruction::FSub))) &&
     799             :          "Binary opcode should be specified for FP induction");
     800             : 
     801        2573 :   if (Casts) {
     802          28 :     for (auto &Inst : *Casts) {
     803          17 :       RedundantCasts.push_back(Inst);
     804             :     }
     805             :   }
     806        2573 : }
     807             : 
     808           0 : int InductionDescriptor::getConsecutiveDirection() const {
     809           0 :   ConstantInt *ConstStep = getConstIntStepValue();
     810           0 :   if (ConstStep && (ConstStep->isOne() || ConstStep->isMinusOne()))
     811           0 :     return ConstStep->getSExtValue();
     812             :   return 0;
     813             : }
     814             : 
     815        4727 : ConstantInt *InductionDescriptor::getConstIntStepValue() const {
     816        9454 :   if (isa<SCEVConstant>(Step))
     817        4686 :     return dyn_cast<ConstantInt>(cast<SCEVConstant>(Step)->getValue());
     818             :   return nullptr;
     819             : }
     820             : 
     821          48 : bool InductionDescriptor::isFPInductionPHI(PHINode *Phi, const Loop *TheLoop,
     822             :                                            ScalarEvolution *SE,
     823             :                                            InductionDescriptor &D) {
     824             : 
     825             :   // Here we only handle FP induction variables.
     826             :   assert(Phi->getType()->isFloatingPointTy() && "Unexpected Phi type");
     827             : 
     828          48 :   if (TheLoop->getHeader() != Phi->getParent())
     829             :     return false;
     830             : 
     831             :   // The loop may have multiple entrances or multiple exits; we can analyze
     832             :   // this phi if it has a unique entry value and a unique backedge value.
     833          48 :   if (Phi->getNumIncomingValues() != 2)
     834             :     return false;
     835             :   Value *BEValue = nullptr, *StartValue = nullptr;
     836          48 :   if (TheLoop->contains(Phi->getIncomingBlock(0))) {
     837             :     BEValue = Phi->getIncomingValue(0);
     838             :     StartValue = Phi->getIncomingValue(1);
     839             :   } else {
     840             :     assert(TheLoop->contains(Phi->getIncomingBlock(1)) &&
     841             :            "Unexpected Phi node in the loop");
     842             :     BEValue = Phi->getIncomingValue(1);
     843             :     StartValue = Phi->getIncomingValue(0);
     844             :   }
     845             : 
     846             :   BinaryOperator *BOp = dyn_cast<BinaryOperator>(BEValue);
     847             :   if (!BOp)
     848             :     return false;
     849             : 
     850             :   Value *Addend = nullptr;
     851          34 :   if (BOp->getOpcode() == Instruction::FAdd) {
     852          30 :     if (BOp->getOperand(0) == Phi)
     853             :       Addend = BOp->getOperand(1);
     854           2 :     else if (BOp->getOperand(1) == Phi)
     855             :       Addend = BOp->getOperand(0);
     856           4 :   } else if (BOp->getOpcode() == Instruction::FSub)
     857           4 :     if (BOp->getOperand(0) == Phi)
     858             :       Addend = BOp->getOperand(1);
     859             : 
     860          34 :   if (!Addend)
     861             :     return false;
     862             : 
     863             :   // The addend should be loop invariant
     864             :   if (auto *I = dyn_cast<Instruction>(Addend))
     865          12 :     if (TheLoop->contains(I))
     866             :       return false;
     867             : 
     868             :   // FP Step has unknown SCEV
     869          30 :   const SCEV *Step = SE->getUnknown(Addend);
     870          30 :   D = InductionDescriptor(StartValue, IK_FpInduction, Step, BOp);
     871          30 :   return true;
     872             : }
     873             : 
     874             : /// This function is called when we suspect that the update-chain of a phi node
     875             : /// (whose symbolic SCEV expression sin \p PhiScev) contains redundant casts,
     876             : /// that can be ignored. (This can happen when the PSCEV rewriter adds a runtime
     877             : /// predicate P under which the SCEV expression for the phi can be the
     878             : /// AddRecurrence \p AR; See createAddRecFromPHIWithCast). We want to find the
     879             : /// cast instructions that are involved in the update-chain of this induction.
     880             : /// A caller that adds the required runtime predicate can be free to drop these
     881             : /// cast instructions, and compute the phi using \p AR (instead of some scev
     882             : /// expression with casts).
     883             : ///
     884             : /// For example, without a predicate the scev expression can take the following
     885             : /// form:
     886             : ///      (Ext ix (Trunc iy ( Start + i*Step ) to ix) to iy)
     887             : ///
     888             : /// It corresponds to the following IR sequence:
     889             : /// %for.body:
     890             : ///   %x = phi i64 [ 0, %ph ], [ %add, %for.body ]
     891             : ///   %casted_phi = "ExtTrunc i64 %x"
     892             : ///   %add = add i64 %casted_phi, %step
     893             : ///
     894             : /// where %x is given in \p PN,
     895             : /// PSE.getSCEV(%x) is equal to PSE.getSCEV(%casted_phi) under a predicate,
     896             : /// and the IR sequence that "ExtTrunc i64 %x" represents can take one of
     897             : /// several forms, for example, such as:
     898             : ///   ExtTrunc1:    %casted_phi = and  %x, 2^n-1
     899             : /// or:
     900             : ///   ExtTrunc2:    %t = shl %x, m
     901             : ///                 %casted_phi = ashr %t, m
     902             : ///
     903             : /// If we are able to find such sequence, we return the instructions
     904             : /// we found, namely %casted_phi and the instructions on its use-def chain up
     905             : /// to the phi (not including the phi).
     906          11 : static bool getCastsForInductionPHI(PredicatedScalarEvolution &PSE,
     907             :                                     const SCEVUnknown *PhiScev,
     908             :                                     const SCEVAddRecExpr *AR,
     909             :                                     SmallVectorImpl<Instruction *> &CastInsts) {
     910             : 
     911             :   assert(CastInsts.empty() && "CastInsts is expected to be empty.");
     912             :   auto *PN = cast<PHINode>(PhiScev->getValue());
     913             :   assert(PSE.getSCEV(PN) == AR && "Unexpected phi node SCEV expression");
     914          11 :   const Loop *L = AR->getLoop();
     915             : 
     916             :   // Find any cast instructions that participate in the def-use chain of
     917             :   // PhiScev in the loop.
     918             :   // FORNOW/TODO: We currently expect the def-use chain to include only
     919             :   // two-operand instructions, where one of the operands is an invariant.
     920             :   // createAddRecFromPHIWithCasts() currently does not support anything more
     921             :   // involved than that, so we keep the search simple. This can be
     922             :   // extended/generalized as needed.
     923             : 
     924             :   auto getDef = [&](const Value *Val) -> Value * {
     925             :     const BinaryOperator *BinOp = dyn_cast<BinaryOperator>(Val);
     926             :     if (!BinOp)
     927             :       return nullptr;
     928             :     Value *Op0 = BinOp->getOperand(0);
     929             :     Value *Op1 = BinOp->getOperand(1);
     930             :     Value *Def = nullptr;
     931             :     if (L->isLoopInvariant(Op0))
     932             :       Def = Op1;
     933             :     else if (L->isLoopInvariant(Op1))
     934             :       Def = Op0;
     935             :     return Def;
     936          11 :   };
     937             : 
     938             :   // Look for the instruction that defines the induction via the
     939             :   // loop backedge.
     940          11 :   BasicBlock *Latch = L->getLoopLatch();
     941          11 :   if (!Latch)
     942             :     return false;
     943          11 :   Value *Val = PN->getIncomingValueForBlock(Latch);
     944          11 :   if (!Val)
     945             :     return false;
     946             : 
     947             :   // Follow the def-use chain until the induction phi is reached.
     948             :   // If on the way we encounter a Value that has the same SCEV Expr as the
     949             :   // phi node, we can consider the instructions we visit from that point
     950             :   // as part of the cast-sequence that can be ignored.
     951             :   bool InCastSequence = false;
     952          11 :   auto *Inst = dyn_cast<Instruction>(Val);
     953          39 :   while (Val != PN) {
     954             :     // If we encountered a phi node other than PN, or if we left the loop,
     955             :     // we bail out.
     956          28 :     if (!Inst || !L->contains(Inst)) {
     957           0 :       return false;
     958             :     }
     959          28 :     auto *AddRec = dyn_cast<SCEVAddRecExpr>(PSE.getSCEV(Val));
     960          28 :     if (AddRec && PSE.areAddRecsEqualWithPreds(AddRec, AR))
     961             :       InCastSequence = true;
     962          17 :     if (InCastSequence) {
     963             :       // Only the last instruction in the cast sequence is expected to have
     964             :       // uses outside the induction def-use chain.
     965          17 :       if (!CastInsts.empty())
     966           6 :         if (!Inst->hasOneUse())
     967             :           return false;
     968          17 :       CastInsts.push_back(Inst);
     969             :     }
     970          28 :     Val = getDef(Val);
     971          28 :     if (!Val)
     972             :       return false;
     973          28 :     Inst = dyn_cast<Instruction>(Val);
     974             :   }
     975             : 
     976             :   return InCastSequence;
     977             : }
     978             : 
     979        3237 : bool InductionDescriptor::isInductionPHI(PHINode *Phi, const Loop *TheLoop,
     980             :                                          PredicatedScalarEvolution &PSE,
     981             :                                          InductionDescriptor &D, bool Assume) {
     982        3237 :   Type *PhiTy = Phi->getType();
     983             : 
     984             :   // Handle integer and pointer inductions variables.
     985             :   // Now we handle also FP induction but not trying to make a
     986             :   // recurrent expression from the PHI node in-place.
     987             : 
     988         774 :   if (!PhiTy->isIntegerTy() && !PhiTy->isPointerTy() && !PhiTy->isFloatTy() &&
     989        3237 :       !PhiTy->isDoubleTy() && !PhiTy->isHalfTy())
     990             :     return false;
     991             : 
     992             :   if (PhiTy->isFloatingPointTy())
     993          48 :     return isFPInductionPHI(Phi, TheLoop, PSE.getSE(), D);
     994             : 
     995        3189 :   const SCEV *PhiScev = PSE.getSCEV(Phi);
     996             :   const auto *AR = dyn_cast<SCEVAddRecExpr>(PhiScev);
     997             : 
     998             :   // We need this expression to be an AddRecExpr.
     999        3189 :   if (Assume && !AR)
    1000         316 :     AR = PSE.getAsAddRec(Phi);
    1001             : 
    1002        3189 :   if (!AR) {
    1003             :     LLVM_DEBUG(dbgs() << "LV: PHI is not a poly recurrence.\n");
    1004             :     return false;
    1005             :   }
    1006             : 
    1007             :   // Record any Cast instructions that participate in the induction update
    1008             :   const auto *SymbolicPhi = dyn_cast<SCEVUnknown>(PhiScev);
    1009             :   // If we started from an UnknownSCEV, and managed to build an addRecurrence
    1010             :   // only after enabling Assume with PSCEV, this means we may have encountered
    1011             :   // cast instructions that required adding a runtime check in order to
    1012             :   // guarantee the correctness of the AddRecurence respresentation of the
    1013             :   // induction.
    1014        2523 :   if (PhiScev != AR && SymbolicPhi) {
    1015             :     SmallVector<Instruction *, 2> Casts;
    1016          11 :     if (getCastsForInductionPHI(PSE, SymbolicPhi, AR, Casts))
    1017          11 :       return isInductionPHI(Phi, TheLoop, PSE.getSE(), D, AR, &Casts);
    1018             :   }
    1019             : 
    1020        2512 :   return isInductionPHI(Phi, TheLoop, PSE.getSE(), D, AR);
    1021             : }
    1022             : 
    1023        2557 : bool InductionDescriptor::isInductionPHI(
    1024             :     PHINode *Phi, const Loop *TheLoop, ScalarEvolution *SE,
    1025             :     InductionDescriptor &D, const SCEV *Expr,
    1026             :     SmallVectorImpl<Instruction *> *CastsToIgnore) {
    1027        2557 :   Type *PhiTy = Phi->getType();
    1028             :   // We only handle integer and pointer inductions variables.
    1029        2557 :   if (!PhiTy->isIntegerTy() && !PhiTy->isPointerTy())
    1030             :     return false;
    1031             : 
    1032             :   // Check that the PHI is consecutive.
    1033        2556 :   const SCEV *PhiScev = Expr ? Expr : SE->getSCEV(Phi);
    1034             :   const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(PhiScev);
    1035             : 
    1036             :   if (!AR) {
    1037             :     LLVM_DEBUG(dbgs() << "LV: PHI is not a poly recurrence.\n");
    1038             :     return false;
    1039             :   }
    1040             : 
    1041        2555 :   if (AR->getLoop() != TheLoop) {
    1042             :     // FIXME: We should treat this as a uniform. Unfortunately, we
    1043             :     // don't currently know how to handled uniform PHIs.
    1044             :     LLVM_DEBUG(
    1045             :         dbgs() << "LV: PHI is a recurrence with respect to an outer loop.\n");
    1046             :     return false;
    1047             :   }
    1048             : 
    1049             :   Value *StartValue =
    1050        2555 :       Phi->getIncomingValueForBlock(AR->getLoop()->getLoopPreheader());
    1051        2555 :   const SCEV *Step = AR->getStepRecurrence(*SE);
    1052             :   // Calculate the pointer stride and check if it is consecutive.
    1053             :   // The stride may be a constant or a loop invariant integer value.
    1054             :   const SCEVConstant *ConstStep = dyn_cast<SCEVConstant>(Step);
    1055          34 :   if (!ConstStep && !SE->isLoopInvariant(Step, TheLoop))
    1056             :     return false;
    1057             : 
    1058        2555 :   if (PhiTy->isIntegerTy()) {
    1059        4014 :     D = InductionDescriptor(StartValue, IK_IntInduction, Step, /*BOp=*/nullptr,
    1060        2007 :                             CastsToIgnore);
    1061        2007 :     return true;
    1062             :   }
    1063             : 
    1064             :   assert(PhiTy->isPointerTy() && "The PHI must be a pointer");
    1065             :   // Pointer induction should be a constant.
    1066         548 :   if (!ConstStep)
    1067             :     return false;
    1068             : 
    1069         540 :   ConstantInt *CV = ConstStep->getValue();
    1070         540 :   Type *PointerElementType = PhiTy->getPointerElementType();
    1071             :   // The pointer stride cannot be determined if the pointer element type is not
    1072             :   // sized.
    1073         540 :   if (!PointerElementType->isSized())
    1074             :     return false;
    1075             : 
    1076         538 :   const DataLayout &DL = Phi->getModule()->getDataLayout();
    1077         538 :   int64_t Size = static_cast<int64_t>(DL.getTypeAllocSize(PointerElementType));
    1078         538 :   if (!Size)
    1079             :     return false;
    1080             : 
    1081             :   int64_t CVSize = CV->getSExtValue();
    1082         536 :   if (CVSize % Size)
    1083             :     return false;
    1084             :   auto *StepValue =
    1085        1072 :       SE->getConstant(CV->getType(), CVSize / Size, true /* signed */);
    1086         536 :   D = InductionDescriptor(StartValue, IK_PtrInduction, StepValue);
    1087         536 :   return true;
    1088             : }

Generated by: LCOV version 1.13