14b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick//===-- SimplifyIndVar.cpp - Induction variable simplification ------------===//
24b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick//
34b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick//                     The LLVM Compiler Infrastructure
44b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick//
54b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick// This file is distributed under the University of Illinois Open Source
64b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick// License. See LICENSE.TXT for details.
74b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick//
84b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick//===----------------------------------------------------------------------===//
94b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick//
104b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick// This file implements induction variable simplification. It does
114b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick// not define any actual pass or policy, but provides a single function to
124b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick// simplify a loop's induction variables based on ScalarEvolution.
134b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick//
144b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick//===----------------------------------------------------------------------===//
154b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Transforms/Utils/SimplifyIndVar.h"
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/STLExtras.h"
18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SmallVector.h"
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/Statistic.h"
204b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick#include "llvm/Analysis/IVUsers.h"
214b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick#include "llvm/Analysis/LoopInfo.h"
224b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick#include "llvm/Analysis/LoopPass.h"
234b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick#include "llvm/Analysis/ScalarEvolutionExpressions.h"
240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Dominators.h"
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IRBuilder.h"
270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IntrinsicInst.h"
294b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick#include "llvm/Support/CommandLine.h"
304b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick#include "llvm/Support/Debug.h"
314b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick#include "llvm/Support/raw_ostream.h"
324b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
334b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trickusing namespace llvm;
344b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "indvars"
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
374b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew TrickSTATISTIC(NumElimIdentity, "Number of IV identities eliminated");
384b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew TrickSTATISTIC(NumElimOperand,  "Number of IV operands folded into a use");
394b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew TrickSTATISTIC(NumElimRem     , "Number of IV remainder operations eliminated");
404b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew TrickSTATISTIC(NumElimCmp     , "Number of IV comparisons eliminated");
414b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
424b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Tricknamespace {
434b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  /// SimplifyIndvar - This is a utility for simplifying induction variables
444b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  /// based on ScalarEvolution. It is the primary instrument of the
454b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  /// IndvarSimplify pass, but it may also be directly invoked to cleanup after
464b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  /// other loop passes that preserve SCEV.
474b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  class SimplifyIndvar {
484b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    Loop             *L;
494b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    LoopInfo         *LI;
504b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    ScalarEvolution  *SE;
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const DataLayout *DL; // May be NULL
524b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
534b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    SmallVectorImpl<WeakVH> &DeadInsts;
544b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
554b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    bool Changed;
564b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
574b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  public:
58bddb7f82103deb226baa6793f41c5961661167e7Andrew Trick    SimplifyIndvar(Loop *Loop, ScalarEvolution *SE, LPPassManager *LPM,
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                   SmallVectorImpl<WeakVH> &Dead, IVUsers *IVU = nullptr) :
604b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      L(Loop),
614b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      LI(LPM->getAnalysisIfAvailable<LoopInfo>()),
62bddb7f82103deb226baa6793f41c5961661167e7Andrew Trick      SE(SE),
634b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      DeadInsts(Dead),
644b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      Changed(false) {
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DataLayoutPass *DLP = LPM->getAnalysisIfAvailable<DataLayoutPass>();
66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      DL = DLP ? &DLP->getDataLayout() : nullptr;
67bddb7f82103deb226baa6793f41c5961661167e7Andrew Trick      assert(LI && "IV simplification requires LoopInfo");
684b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    }
694b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
704b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    bool hasChanged() const { return Changed; }
714b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
724b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    /// Iteratively perform simplification on a worklist of users of the
734b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    /// specified induction variable. This is the top-level driver that applies
744b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    /// all simplicitions to users of an IV.
75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    void simplifyUsers(PHINode *CurrIV, IVVisitor *V = nullptr);
764b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
77ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick    Value *foldIVUser(Instruction *UseInst, Instruction *IVOperand);
784b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
794b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    bool eliminateIVUser(Instruction *UseInst, Instruction *IVOperand);
804b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    void eliminateIVComparison(ICmpInst *ICmp, Value *IVOperand);
814b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    void eliminateIVRemainder(BinaryOperator *Rem, Value *IVOperand,
824b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick                              bool IsSigned);
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Instruction *splitOverflowIntrinsic(Instruction *IVUser,
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                        const DominatorTree *DT);
864b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  };
874b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick}
884b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
894b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// foldIVUser - Fold an IV operand into its use.  This removes increments of an
904b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// aligned IV when used by a instruction that ignores the low bits.
91ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick///
9224f48ece526d81e7a3138f4cff57171b7de9e02fAndrew Trick/// IVOperand is guaranteed SCEVable, but UseInst may not be.
9324f48ece526d81e7a3138f4cff57171b7de9e02fAndrew Trick///
94ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick/// Return the operand of IVOperand for this induction variable if IVOperand can
957cb3dcb927a8f8a872cdf309f78cd80e197d2f14Andrew Trick/// be folded (in case more folding opportunities have been exposed).
96ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick/// Otherwise return null.
97ea23daa4461de489abbfd54a9641091862945f3eAndrew TrickValue *SimplifyIndvar::foldIVUser(Instruction *UseInst, Instruction *IVOperand) {
98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Value *IVSrc = nullptr;
994b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  unsigned OperIdx = 0;
100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const SCEV *FoldedExpr = nullptr;
1014b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  switch (UseInst->getOpcode()) {
1024b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  default:
103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
1044b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  case Instruction::UDiv:
1054b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  case Instruction::LShr:
1064b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    // We're only interested in the case where we know something about
1074b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    // the numerator and have a constant denominator.
1084b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    if (IVOperand != UseInst->getOperand(OperIdx) ||
1094b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick        !isa<ConstantInt>(UseInst->getOperand(1)))
110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
1114b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
1124b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    // Attempt to fold a binary operator with constant operand.
1134b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    // e.g. ((I + 1) >> 2) => I >> 2
1144f3052403ca5ea9542a118c2e54ff9c82038f41cAndrew Trick    if (!isa<BinaryOperator>(IVOperand)
1154f3052403ca5ea9542a118c2e54ff9c82038f41cAndrew Trick        || !isa<ConstantInt>(IVOperand->getOperand(1)))
116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
1174b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
1184b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    IVSrc = IVOperand->getOperand(0);
1194b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    // IVSrc must be the (SCEVable) IV, since the other operand is const.
1204b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    assert(SE->isSCEVable(IVSrc->getType()) && "Expect SCEVable IV operand");
1214b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
1224b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    ConstantInt *D = cast<ConstantInt>(UseInst->getOperand(1));
1234b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    if (UseInst->getOpcode() == Instruction::LShr) {
1244b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      // Get a constant for the divisor. See createSCEV.
1254b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      uint32_t BitWidth = cast<IntegerType>(UseInst->getType())->getBitWidth();
1264b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      if (D->getValue().uge(BitWidth))
127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
1284b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
1294b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      D = ConstantInt::get(UseInst->getContext(),
1300a230e0d985625a3909cb78fd867a3abaf434565Benjamin Kramer                           APInt::getOneBitSet(BitWidth, D->getZExtValue()));
1314b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    }
1324b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    FoldedExpr = SE->getUDivExpr(SE->getSCEV(IVSrc), SE->getSCEV(D));
1334b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  }
1344b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // We have something that might fold it's operand. Compare SCEVs.
1354b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  if (!SE->isSCEVable(UseInst->getType()))
136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
1374b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
1384b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // Bypass the operand if SCEV can prove it has no effect.
1394b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  if (SE->getSCEV(UseInst) != FoldedExpr)
140dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
1414b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
1424b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  DEBUG(dbgs() << "INDVARS: Eliminated IV operand: " << *IVOperand
1434b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick        << " -> " << *UseInst << '\n');
1444b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
1454b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  UseInst->setOperand(OperIdx, IVSrc);
1464b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  assert(SE->getSCEV(UseInst) == FoldedExpr && "bad SCEV with folded oper");
1474b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
1484b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  ++NumElimOperand;
1494b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  Changed = true;
1504b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  if (IVOperand->use_empty())
1514b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    DeadInsts.push_back(IVOperand);
152ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick  return IVSrc;
1534b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick}
1544b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
1554b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// eliminateIVComparison - SimplifyIVUsers helper for eliminating useless
1564b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// comparisons against an induction variable.
1574b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trickvoid SimplifyIndvar::eliminateIVComparison(ICmpInst *ICmp, Value *IVOperand) {
1584b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  unsigned IVOperIdx = 0;
1594b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  ICmpInst::Predicate Pred = ICmp->getPredicate();
1604b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  if (IVOperand != ICmp->getOperand(0)) {
1614b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    // Swapped
1624b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    assert(IVOperand == ICmp->getOperand(1) && "Can't find IVOperand");
1634b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    IVOperIdx = 1;
1644b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    Pred = ICmpInst::getSwappedPredicate(Pred);
1654b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  }
1664b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
1674b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // Get the SCEVs for the ICmp operands.
1684b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  const SCEV *S = SE->getSCEV(ICmp->getOperand(IVOperIdx));
1694b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  const SCEV *X = SE->getSCEV(ICmp->getOperand(1 - IVOperIdx));
1704b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
1714b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // Simplify unnecessary loops away.
1724b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  const Loop *ICmpLoop = LI->getLoopFor(ICmp->getParent());
1734b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  S = SE->getSCEVAtScope(S, ICmpLoop);
1744b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  X = SE->getSCEVAtScope(X, ICmpLoop);
1754b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
1764b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // If the condition is always true or always false, replace it with
1774b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // a constant value.
1784b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  if (SE->isKnownPredicate(Pred, S, X))
1794b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    ICmp->replaceAllUsesWith(ConstantInt::getTrue(ICmp->getContext()));
1804b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  else if (SE->isKnownPredicate(ICmpInst::getInversePredicate(Pred), S, X))
1814b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    ICmp->replaceAllUsesWith(ConstantInt::getFalse(ICmp->getContext()));
1824b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  else
1834b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    return;
1844b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
1854b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  DEBUG(dbgs() << "INDVARS: Eliminated comparison: " << *ICmp << '\n');
1864b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  ++NumElimCmp;
1874b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  Changed = true;
1884b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  DeadInsts.push_back(ICmp);
1894b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick}
1904b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
1914b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// eliminateIVRemainder - SimplifyIVUsers helper for eliminating useless
1924b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// remainder operations operating on an induction variable.
1934b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trickvoid SimplifyIndvar::eliminateIVRemainder(BinaryOperator *Rem,
1944b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick                                      Value *IVOperand,
1954b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick                                      bool IsSigned) {
1964b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // We're only interested in the case where we know something about
1974b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // the numerator.
1984b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  if (IVOperand != Rem->getOperand(0))
1994b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    return;
2004b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
2014b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // Get the SCEVs for the ICmp operands.
2024b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  const SCEV *S = SE->getSCEV(Rem->getOperand(0));
2034b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  const SCEV *X = SE->getSCEV(Rem->getOperand(1));
2044b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
2054b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // Simplify unnecessary loops away.
2064b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  const Loop *ICmpLoop = LI->getLoopFor(Rem->getParent());
2074b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  S = SE->getSCEVAtScope(S, ICmpLoop);
2084b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  X = SE->getSCEVAtScope(X, ICmpLoop);
2094b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
2104b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // i % n  -->  i  if i is in [0,n).
2114b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  if ((!IsSigned || SE->isKnownNonNegative(S)) &&
2124b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      SE->isKnownPredicate(IsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2134b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick                           S, X))
2144b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    Rem->replaceAllUsesWith(Rem->getOperand(0));
2154b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  else {
2164b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    // (i+1) % n  -->  (i+1)==n?0:(i+1)  if i is in [0,n).
2174b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    const SCEV *LessOne =
2184b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      SE->getMinusSCEV(S, SE->getConstant(S->getType(), 1));
2194b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    if (IsSigned && !SE->isKnownNonNegative(LessOne))
2204b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      return;
2214b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
2224b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    if (!SE->isKnownPredicate(IsSigned ?
2234b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick                              ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2244b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick                              LessOne, X))
2254b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      return;
2264b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
2274b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    ICmpInst *ICmp = new ICmpInst(Rem, ICmpInst::ICMP_EQ,
228a9390a4d5f5d568059a80970d22194b165d097a7Benjamin Kramer                                  Rem->getOperand(0), Rem->getOperand(1));
2294b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    SelectInst *Sel =
2304b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      SelectInst::Create(ICmp,
2314b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick                         ConstantInt::get(Rem->getType(), 0),
2324b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick                         Rem->getOperand(0), "tmp", Rem);
2334b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    Rem->replaceAllUsesWith(Sel);
2344b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  }
2354b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
2364b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  DEBUG(dbgs() << "INDVARS: Simplified rem: " << *Rem << '\n');
2374b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  ++NumElimRem;
2384b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  Changed = true;
2394b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  DeadInsts.push_back(Rem);
2404b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick}
2414b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
2424b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// eliminateIVUser - Eliminate an operation that consumes a simple IV and has
2434b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// no observable side-effect given the range of IV values.
24424f48ece526d81e7a3138f4cff57171b7de9e02fAndrew Trick/// IVOperand is guaranteed SCEVable, but UseInst may not be.
2454b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trickbool SimplifyIndvar::eliminateIVUser(Instruction *UseInst,
2464b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick                                     Instruction *IVOperand) {
2474b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  if (ICmpInst *ICmp = dyn_cast<ICmpInst>(UseInst)) {
2484b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    eliminateIVComparison(ICmp, IVOperand);
2494b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    return true;
2504b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  }
2514b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  if (BinaryOperator *Rem = dyn_cast<BinaryOperator>(UseInst)) {
2524b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    bool IsSigned = Rem->getOpcode() == Instruction::SRem;
2534b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    if (IsSigned || Rem->getOpcode() == Instruction::URem) {
2544b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      eliminateIVRemainder(Rem, IVOperand, IsSigned);
2554b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      return true;
2564b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    }
2574b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  }
2584b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
2594b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // Eliminate any operation that SCEV can prove is an identity function.
2604b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  if (!SE->isSCEVable(UseInst->getType()) ||
2614b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      (UseInst->getType() != IVOperand->getType()) ||
2624b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      (SE->getSCEV(UseInst) != SE->getSCEV(IVOperand)))
2634b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    return false;
2644b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
2654b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  DEBUG(dbgs() << "INDVARS: Eliminated identity: " << *UseInst << '\n');
2664b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
2674b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  UseInst->replaceAllUsesWith(IVOperand);
2684b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  ++NumElimIdentity;
2694b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  Changed = true;
2704b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  DeadInsts.push_back(UseInst);
2714b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  return true;
2724b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick}
2734b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
27436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// \brief Split sadd.with.overflow into add + sadd.with.overflow to allow
27536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// analysis and optimization.
27636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines///
27736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// \return A new value representing the non-overflowing add if possible,
27836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// otherwise return the original value.
27936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesInstruction *SimplifyIndvar::splitOverflowIntrinsic(Instruction *IVUser,
28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                    const DominatorTree *DT) {
28136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  IntrinsicInst *II = dyn_cast<IntrinsicInst>(IVUser);
28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (!II || II->getIntrinsicID() != Intrinsic::sadd_with_overflow)
28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return IVUser;
28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Find a branch guarded by the overflow check.
286dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  BranchInst *Branch = nullptr;
287dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Instruction *AddVal = nullptr;
28836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (User *U : II->users()) {
28936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (ExtractValueInst *ExtractInst = dyn_cast<ExtractValueInst>(U)) {
29036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if (ExtractInst->getNumIndices() != 1)
29136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        continue;
29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if (ExtractInst->getIndices()[0] == 0)
29336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        AddVal = ExtractInst;
29436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      else if (ExtractInst->getIndices()[0] == 1 && ExtractInst->hasOneUse())
29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        Branch = dyn_cast<BranchInst>(ExtractInst->user_back());
29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
29836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (!AddVal || !Branch)
29936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return IVUser;
30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  BasicBlock *ContinueBB = Branch->getSuccessor(1);
30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (std::next(pred_begin(ContinueBB)) != pred_end(ContinueBB))
30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return IVUser;
30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Check if all users of the add are provably NSW.
30636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool AllNSW = true;
30736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (Use &U : AddVal->uses()) {
30836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (Instruction *UseInst = dyn_cast<Instruction>(U.getUser())) {
30936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      BasicBlock *UseBB = UseInst->getParent();
31036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if (PHINode *PHI = dyn_cast<PHINode>(UseInst))
31136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        UseBB = PHI->getIncomingBlock(U);
31236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if (!DT->dominates(ContinueBB, UseBB)) {
31336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        AllNSW = false;
31436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        break;
31536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      }
31636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
31736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
31836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (!AllNSW)
31936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return IVUser;
32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Go for it...
32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  IRBuilder<> Builder(IVUser);
32336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Instruction *AddInst = dyn_cast<Instruction>(
32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Builder.CreateNSWAdd(II->getOperand(0), II->getOperand(1)));
32536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // The caller expects the new add to have the same form as the intrinsic. The
32736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // IV operand position must be the same.
32836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  assert((AddInst->getOpcode() == Instruction::Add &&
32936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          AddInst->getOperand(0) == II->getOperand(0)) &&
33036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines         "Bad add instruction created from overflow intrinsic.");
33136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
33236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  AddVal->replaceAllUsesWith(AddInst);
33336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DeadInsts.push_back(AddVal);
33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return AddInst;
33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
33636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3374b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// pushIVUsers - Add all uses of Def to the current IV's worklist.
3384b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick///
3394b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trickstatic void pushIVUsers(
3404b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  Instruction *Def,
3414b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  SmallPtrSet<Instruction*,16> &Simplified,
3424b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  SmallVectorImpl< std::pair<Instruction*,Instruction*> > &SimpleIVUsers) {
3434b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
34436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (User *U : Def->users()) {
34536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Instruction *UI = cast<Instruction>(U);
3464b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
3474b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    // Avoid infinite or exponential worklist processing.
3484b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    // Also ensure unique worklist users.
3494b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    // If Def is a LoopPhi, it may not be in the Simplified set, so check for
3504b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    // self edges first.
35136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (UI != Def && Simplified.insert(UI))
35236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      SimpleIVUsers.push_back(std::make_pair(UI, Def));
3534b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  }
3544b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick}
3554b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
3564b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// isSimpleIVUser - Return true if this instruction generates a simple SCEV
3574b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// expression in terms of that IV.
3584b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick///
3597cb3dcb927a8f8a872cdf309f78cd80e197d2f14Andrew Trick/// This is similar to IVUsers' isInteresting() but processes each instruction
3604b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// non-recursively when the operand is already known to be a simpleIVUser.
3614b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick///
3624b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trickstatic bool isSimpleIVUser(Instruction *I, const Loop *L, ScalarEvolution *SE) {
3634b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  if (!SE->isSCEVable(I->getType()))
3644b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    return false;
3654b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
3664b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // Get the symbolic expression for this instruction.
3674b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  const SCEV *S = SE->getSCEV(I);
3684b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
3694b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // Only consider affine recurrences.
3704b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S);
3714b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  if (AR && AR->getLoop() == L)
3724b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    return true;
3734b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
3744b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  return false;
3754b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick}
3764b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
3774b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// simplifyUsers - Iteratively perform simplification on a worklist of users
3784b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// of the specified induction variable. Each successive simplification may push
3794b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// more users which may themselves be candidates for simplification.
3804b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick///
3814b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// This algorithm does not require IVUsers analysis. Instead, it simplifies
3824b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// instructions in-place during analysis. Rather than rewriting induction
3834b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// variables bottom-up from their users, it transforms a chain of IVUsers
3844b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// top-down, updating the IR only when it encouters a clear optimization
3854b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// opportunitiy.
3864b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick///
3874b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// Once DisableIVRewrite is default, LSR will be the only client of IVUsers.
3884b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick///
3894b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trickvoid SimplifyIndvar::simplifyUsers(PHINode *CurrIV, IVVisitor *V) {
39024f48ece526d81e7a3138f4cff57171b7de9e02fAndrew Trick  if (!SE->isSCEVable(CurrIV->getType()))
39124f48ece526d81e7a3138f4cff57171b7de9e02fAndrew Trick    return;
39224f48ece526d81e7a3138f4cff57171b7de9e02fAndrew Trick
3934b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // Instructions processed by SimplifyIndvar for CurrIV.
3944b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  SmallPtrSet<Instruction*,16> Simplified;
3954b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
3964b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // Use-def pairs if IV users waiting to be processed for CurrIV.
3974b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  SmallVector<std::pair<Instruction*, Instruction*>, 8> SimpleIVUsers;
3984b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
3994b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // Push users of the current LoopPhi. In rare cases, pushIVUsers may be
4004b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // called multiple times for the same LoopPhi. This is the proper thing to
4014b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  // do for loop header phis that use each other.
4024b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  pushIVUsers(CurrIV, Simplified, SimpleIVUsers);
4034b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
4044b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  while (!SimpleIVUsers.empty()) {
4054b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    std::pair<Instruction*, Instruction*> UseOper =
4064b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      SimpleIVUsers.pop_back_val();
40736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Instruction *UseInst = UseOper.first;
40836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4094b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    // Bypass back edges to avoid extra work.
41036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (UseInst == CurrIV) continue;
41136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
41236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (V && V->shouldSplitOverflowInstrinsics()) {
41336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      UseInst = splitOverflowIntrinsic(UseInst, V->getDomTree());
41436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if (!UseInst)
41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        continue;
41636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
4174b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
418ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick    Instruction *IVOperand = UseOper.second;
419ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick    for (unsigned N = 0; IVOperand; ++N) {
420ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick      assert(N <= Simplified.size() && "runaway iteration");
421ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick
422ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick      Value *NewOper = foldIVUser(UseOper.first, IVOperand);
423ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick      if (!NewOper)
424ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick        break; // done folding
425ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick      IVOperand = dyn_cast<Instruction>(NewOper);
426ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick    }
427ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick    if (!IVOperand)
428ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick      continue;
4294b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
430ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick    if (eliminateIVUser(UseOper.first, IVOperand)) {
431ea23daa4461de489abbfd54a9641091862945f3eAndrew Trick      pushIVUsers(IVOperand, Simplified, SimpleIVUsers);
4324b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      continue;
4334b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    }
4344b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    CastInst *Cast = dyn_cast<CastInst>(UseOper.first);
4354b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    if (V && Cast) {
4364b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      V->visitCast(Cast);
4374b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      continue;
4384b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    }
4394b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    if (isSimpleIVUser(UseOper.first, L, SE)) {
4404b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick      pushIVUsers(UseOper.first, Simplified, SimpleIVUsers);
4414b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick    }
4424b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  }
4434b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick}
4444b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
4454b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Tricknamespace llvm {
4464b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
4472d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid IVVisitor::anchor() { }
4482d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
4494b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// simplifyUsersOfIV - Simplify instructions that use this induction variable
4504b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// by using ScalarEvolution to analyze the IV's recurrence.
451bddb7f82103deb226baa6793f41c5961661167e7Andrew Trickbool simplifyUsersOfIV(PHINode *CurrIV, ScalarEvolution *SE, LPPassManager *LPM,
4524b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick                       SmallVectorImpl<WeakVH> &Dead, IVVisitor *V)
4534b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick{
4544b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  LoopInfo *LI = &LPM->getAnalysis<LoopInfo>();
455bddb7f82103deb226baa6793f41c5961661167e7Andrew Trick  SimplifyIndvar SIV(LI->getLoopFor(CurrIV->getParent()), SE, LPM, Dead);
4564b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  SIV.simplifyUsers(CurrIV, V);
4574b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  return SIV.hasChanged();
4584b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick}
4594b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
4604b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// simplifyLoopIVs - Simplify users of induction variables within this
4614b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick/// loop. This does not actually change or add IVs.
462bddb7f82103deb226baa6793f41c5961661167e7Andrew Trickbool simplifyLoopIVs(Loop *L, ScalarEvolution *SE, LPPassManager *LPM,
4634b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick                     SmallVectorImpl<WeakVH> &Dead) {
4644b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  bool Changed = false;
4654b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  for (BasicBlock::iterator I = L->getHeader()->begin(); isa<PHINode>(I); ++I) {
466bddb7f82103deb226baa6793f41c5961661167e7Andrew Trick    Changed |= simplifyUsersOfIV(cast<PHINode>(I), SE, LPM, Dead);
4674b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  }
4684b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick  return Changed;
4694b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick}
4704b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick
4714b4bb71bcdfd8c17cd4acb6116fc9a56c5fecd47Andrew Trick} // namespace llvm
472