<div dir="ltr">Was the change to ilist intentional? In the orignal review I was thinking that they were being used somewhere but looking again I don't see any uses in this patch.<div><br></div><div>-- Sean Silva</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jul 16, 2016 at 3:51 PM, Dehao Chen via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dehao<br>
Date: Sat Jul 16 17:51:33 2016<br>
New Revision: 275698<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=275698&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=275698&view=rev</a><br>
Log:<br>
[PM] Convert IVUsers analysis to new pass manager.<br>
<br>
Summary: Convert IVUsers analysis to new pass manager.<br>
<br>
Reviewers: davidxl, silvas<br>
<br>
Subscribers: junbuml, sanjoy, llvm-commits, mzolotukhin<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D22434" rel="noreferrer" target="_blank">https://reviews.llvm.org/D22434</a><br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/ADT/ilist.h<br>
    llvm/trunk/include/llvm/Analysis/IVUsers.h<br>
    llvm/trunk/include/llvm/InitializePasses.h<br>
    llvm/trunk/lib/Analysis/Analysis.cpp<br>
    llvm/trunk/lib/Analysis/IVUsers.cpp<br>
    llvm/trunk/lib/CodeGen/MachineFunctionPass.cpp<br>
    llvm/trunk/lib/Passes/PassBuilder.cpp<br>
    llvm/trunk/lib/Passes/PassRegistry.def<br>
    llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp<br>
    llvm/trunk/test/Transforms/LoopStrengthReduce/quadradic-exit-value.ll<br>
<br>
Modified: llvm/trunk/include/llvm/ADT/ilist.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ilist.h?rev=275698&r1=275697&r2=275698&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ilist.h?rev=275698&r1=275697&r2=275698&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ADT/ilist.h (original)<br>
+++ llvm/trunk/include/llvm/ADT/ilist.h Sat Jul 16 17:51:33 2016<br>
@@ -422,6 +422,10 @@ public:<br>
     return iterator(New);<br>
   }<br>
<br>
+  iterator insert(iterator where, const NodeTy &New) {<br>
+    return this->insert(where, new NodeTy(New));<br>
+  }<br>
+<br>
   iterator insertAfter(iterator where, NodeTy *New) {<br>
     if (empty())<br>
       return insert(begin(), New);<br>
@@ -668,7 +672,7 @@ struct ilist : public iplist<NodeTy> {<br>
   typedef typename iplist<NodeTy>::iterator iterator;<br>
<br>
   ilist() {}<br>
-  ilist(const ilist &right) {<br>
+  ilist(const ilist &right) : iplist<NodeTy>() {<br>
     insert(this->begin(), right.begin(), right.end());<br>
   }<br>
   explicit ilist(size_type count) {<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/IVUsers.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/IVUsers.h?rev=275698&r1=275697&r2=275698&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/IVUsers.h?rev=275698&r1=275697&r2=275698&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/IVUsers.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/IVUsers.h Sat Jul 16 17:51:33 2016<br>
@@ -117,7 +117,7 @@ private:<br>
   mutable ilist_node<IVStrideUse> Sentinel;<br>
 };<br>
<br>
-class IVUsers : public LoopPass {<br>
+class IVUsers {<br>
   friend class IVStrideUse;<br>
   Loop *L;<br>
   AssumptionCache *AC;<br>
@@ -133,15 +133,9 @@ class IVUsers : public LoopPass {<br>
   // Ephemeral values used by @llvm.assume in this function.<br>
   SmallPtrSet<const Value *, 32> EphValues;<br>
<br>
-  void getAnalysisUsage(AnalysisUsage &AU) const override;<br>
-<br>
-  bool runOnLoop(Loop *L, LPPassManager &LPM) override;<br>
-<br>
-  void releaseMemory() override;<br>
-<br>
 public:<br>
-  static char ID; // Pass ID, replacement for typeid<br>
-  IVUsers();<br>
+  IVUsers(Loop *L, AssumptionCache *AC, LoopInfo *LI, DominatorTree *DT,<br>
+          ScalarEvolution *SE);<br>
<br>
   Loop *getLoop() const { return L; }<br>
<br>
@@ -173,16 +167,58 @@ public:<br>
     return Processed.count(Inst);<br>
   }<br>
<br>
-  void print(raw_ostream &OS, const Module* = nullptr) const override;<br>
+  void releaseMemory();<br>
+<br>
+  void print(raw_ostream &OS, const Module * = nullptr) const;<br>
<br>
   /// dump - This method is used for debugging.<br>
   void dump() const;<br>
+<br>
 protected:<br>
   bool AddUsersImpl(Instruction *I, SmallPtrSetImpl<Loop*> &SimpleLoopNests);<br>
 };<br>
<br>
 Pass *createIVUsersPass();<br>
<br>
+class IVUsersWrapperPass : public LoopPass {<br>
+  std::unique_ptr<IVUsers> IU;<br>
+<br>
+public:<br>
+  static char ID;<br>
+<br>
+  IVUsersWrapperPass();<br>
+<br>
+  IVUsers &getIU() { return *IU; }<br>
+  const IVUsers &getIU() const { return *IU; }<br>
+<br>
+  void getAnalysisUsage(AnalysisUsage &AU) const override;<br>
+<br>
+  bool runOnLoop(Loop *L, LPPassManager &LPM) override;<br>
+<br>
+  void releaseMemory() override;<br>
+<br>
+  void print(raw_ostream &OS, const Module * = nullptr) const override;<br>
+};<br>
+<br>
+/// Analysis pass that exposes the \c IVUsers for a loop.<br>
+class IVUsersAnalysis : public AnalysisInfoMixin<IVUsersAnalysis> {<br>
+  friend AnalysisInfoMixin<IVUsersAnalysis>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
+  typedef IVUsers Result;<br>
+<br>
+  IVUsers run(Loop &L, AnalysisManager<Loop> &AM);<br>
+};<br>
+<br>
+/// Printer pass for the \c IVUsers for a loop.<br>
+class IVUsersPrinterPass : public PassInfoMixin<IVUsersPrinterPass> {<br>
+  raw_ostream &OS;<br>
+<br>
+public:<br>
+  explicit IVUsersPrinterPass(raw_ostream &OS) : OS(OS) {}<br>
+  PreservedAnalyses run(Loop &L, AnalysisManager<Loop> &AM);<br>
+};<br>
 }<br>
<br>
 #endif<br>
<br>
Modified: llvm/trunk/include/llvm/InitializePasses.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=275698&r1=275697&r2=275698&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=275698&r1=275697&r2=275698&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/InitializePasses.h (original)<br>
+++ llvm/trunk/include/llvm/InitializePasses.h Sat Jul 16 17:51:33 2016<br>
@@ -143,7 +143,7 @@ void initializeGuardWideningLegacyPassPa<br>
 void initializeIPCPPass(PassRegistry&);<br>
 void initializeIPSCCPLegacyPassPass(PassRegistry &);<br>
 void initializeIRTranslatorPass(PassRegistry &);<br>
-void initializeIVUsersPass(PassRegistry&);<br>
+void initializeIVUsersWrapperPassPass(PassRegistry&);<br>
 void initializeIfConverterPass(PassRegistry&);<br>
 void initializeImplicitNullChecksPass(PassRegistry&);<br>
 void initializeIndVarSimplifyLegacyPassPass(PassRegistry&);<br>
<br>
Modified: llvm/trunk/lib/Analysis/Analysis.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/Analysis.cpp?rev=275698&r1=275697&r2=275698&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/Analysis.cpp?rev=275698&r1=275697&r2=275698&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/Analysis.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/Analysis.cpp Sat Jul 16 17:51:33 2016<br>
@@ -51,7 +51,7 @@ void llvm::initializeAnalysis(PassRegist<br>
   initializePostDomOnlyPrinterPass(Registry);<br>
   initializeAAResultsWrapperPassPass(Registry);<br>
   initializeGlobalsAAWrapperPassPass(Registry);<br>
-  initializeIVUsersPass(Registry);<br>
+  initializeIVUsersWrapperPassPass(Registry);<br>
   initializeInstCountPass(Registry);<br>
   initializeIntervalPartitionPass(Registry);<br>
   initializeLazyBlockFrequencyInfoPassPass(Registry);<br>
<br>
Modified: llvm/trunk/lib/Analysis/IVUsers.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IVUsers.cpp?rev=275698&r1=275697&r2=275698&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IVUsers.cpp?rev=275698&r1=275697&r2=275698&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/IVUsers.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/IVUsers.cpp Sat Jul 16 17:51:33 2016<br>
@@ -12,11 +12,12 @@<br>
 //<br>
 //===----------------------------------------------------------------------===//<br>
<br>
+#include "llvm/Analysis/IVUsers.h"<br>
 #include "llvm/ADT/STLExtras.h"<br>
 #include "llvm/Analysis/AssumptionCache.h"<br>
 #include "llvm/Analysis/CodeMetrics.h"<br>
-#include "llvm/Analysis/IVUsers.h"<br>
 #include "llvm/Analysis/LoopPass.h"<br>
+#include "llvm/Analysis/LoopPassManager.h"<br>
 #include "llvm/Analysis/ScalarEvolutionExpressions.h"<br>
 #include "llvm/Analysis/ValueTracking.h"<br>
 #include "llvm/IR/Constants.h"<br>
@@ -33,19 +34,35 @@ using namespace llvm;<br>
<br>
 #define DEBUG_TYPE "iv-users"<br>
<br>
-char IVUsers::ID = 0;<br>
-INITIALIZE_PASS_BEGIN(IVUsers, "iv-users",<br>
+char IVUsersAnalysis::PassID;<br>
+<br>
+IVUsers IVUsersAnalysis::run(Loop &L, AnalysisManager<Loop> &AM) {<br>
+  const auto &FAM =<br>
+      AM.getResult<FunctionAnalysisManagerLoopProxy>(L).getManager();<br>
+  Function *F = L.getHeader()->getParent();<br>
+<br>
+  return IVUsers(&L, FAM.getCachedResult<AssumptionAnalysis>(*F),<br>
+                 FAM.getCachedResult<LoopAnalysis>(*F),<br>
+                 FAM.getCachedResult<DominatorTreeAnalysis>(*F),<br>
+                 FAM.getCachedResult<ScalarEvolutionAnalysis>(*F));<br>
+}<br>
+<br>
+PreservedAnalyses IVUsersPrinterPass::run(Loop &L, AnalysisManager<Loop> &AM) {<br>
+  AM.getResult<IVUsersAnalysis>(L).print(OS);<br>
+  return PreservedAnalyses::all();<br>
+}<br>
+<br>
+char IVUsersWrapperPass::ID = 0;<br>
+INITIALIZE_PASS_BEGIN(IVUsersWrapperPass, "iv-users",<br>
                       "Induction Variable Users", false, true)<br>
 INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)<br>
 INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)<br>
 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)<br>
 INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)<br>
-INITIALIZE_PASS_END(IVUsers, "iv-users",<br>
-                      "Induction Variable Users", false, true)<br>
+INITIALIZE_PASS_END(IVUsersWrapperPass, "iv-users", "Induction Variable Users",<br>
+                    false, true)<br>
<br>
-Pass *llvm::createIVUsersPass() {<br>
-  return new IVUsers();<br>
-}<br>
+Pass *llvm::createIVUsersPass() { return new IVUsersWrapperPass(); }<br>
<br>
 /// isInteresting - Test whether the given expression is "interesting" when<br>
 /// used by the given expression, within the context of analyzing the<br>
@@ -246,28 +263,9 @@ IVStrideUse &IVUsers::AddUser(Instructio<br>
   return IVUses.back();<br>
 }<br>
<br>
-IVUsers::IVUsers()<br>
-    : LoopPass(ID) {<br>
-  initializeIVUsersPass(*PassRegistry::getPassRegistry());<br>
-}<br>
-<br>
-void IVUsers::getAnalysisUsage(AnalysisUsage &AU) const {<br>
-  AU.addRequired<AssumptionCacheTracker>();<br>
-  AU.addRequired<LoopInfoWrapperPass>();<br>
-  AU.addRequired<DominatorTreeWrapperPass>();<br>
-  AU.addRequired<ScalarEvolutionWrapperPass>();<br>
-  AU.setPreservesAll();<br>
-}<br>
-<br>
-bool IVUsers::runOnLoop(Loop *l, LPPassManager &LPM) {<br>
-<br>
-  L = l;<br>
-  AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(<br>
-      *L->getHeader()->getParent());<br>
-  LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();<br>
-  DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();<br>
-  SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();<br>
-<br>
+IVUsers::IVUsers(Loop *L, AssumptionCache *AC, LoopInfo *LI, DominatorTree *DT,<br>
+                 ScalarEvolution *SE)<br>
+    : L(L), AC(AC), LI(LI), DT(DT), SE(SE), IVUses() {<br>
   // Collect ephemeral values so that AddUsersIfInteresting skips them.<br>
   EphValues.clear();<br>
   CodeMetrics::collectEphemeralValues(L, AC, EphValues);<br>
@@ -277,16 +275,13 @@ bool IVUsers::runOnLoop(Loop *l, LPPassM<br>
   // this loop.  If they are induction variables, inspect their uses.<br>
   for (BasicBlock::iterator I = L->getHeader()->begin(); isa<PHINode>(I); ++I)<br>
     (void)AddUsersIfInteresting(&*I);<br>
-<br>
-  return false;<br>
 }<br>
<br>
 void IVUsers::print(raw_ostream &OS, const Module *M) const {<br>
   OS << "IV Users for loop ";<br>
   L->getHeader()->printAsOperand(OS, false);<br>
   if (SE->hasLoopInvariantBackedgeTakenCount(L)) {<br>
-    OS << " with backedge-taken count "<br>
-       << *SE->getBackedgeTakenCount(L);<br>
+    OS << " with backedge-taken count " << *SE->getBackedgeTakenCount(L);<br>
   }<br>
   OS << ":\n";<br>
<br>
@@ -309,9 +304,7 @@ void IVUsers::print(raw_ostream &OS, con<br>
 }<br>
<br>
 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)<br>
-LLVM_DUMP_METHOD void IVUsers::dump() const {<br>
-  print(dbgs());<br>
-}<br>
+LLVM_DUMP_METHOD void IVUsers::dump() const { print(dbgs()); }<br>
 #endif<br>
<br>
 void IVUsers::releaseMemory() {<br>
@@ -319,6 +312,35 @@ void IVUsers::releaseMemory() {<br>
   IVUses.clear();<br>
 }<br>
<br>
+IVUsersWrapperPass::IVUsersWrapperPass() : LoopPass(ID) {<br>
+  initializeIVUsersWrapperPassPass(*PassRegistry::getPassRegistry());<br>
+}<br>
+<br>
+void IVUsersWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {<br>
+  AU.addRequired<AssumptionCacheTracker>();<br>
+  AU.addRequired<LoopInfoWrapperPass>();<br>
+  AU.addRequired<DominatorTreeWrapperPass>();<br>
+  AU.addRequired<ScalarEvolutionWrapperPass>();<br>
+  AU.setPreservesAll();<br>
+}<br>
+<br>
+bool IVUsersWrapperPass::runOnLoop(Loop *L, LPPassManager &LPM) {<br>
+  auto *AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(<br>
+      *L->getHeader()->getParent());<br>
+  auto *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();<br>
+  auto *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();<br>
+  auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();<br>
+<br>
+  IU.reset(new IVUsers(L, AC, LI, DT, SE));<br>
+  return false;<br>
+}<br>
+<br>
+void IVUsersWrapperPass::print(raw_ostream &OS, const Module *M) const {<br>
+  IU->print(OS, M);<br>
+}<br>
+<br>
+void IVUsersWrapperPass::releaseMemory() { IU->releaseMemory(); }<br>
+<br>
 /// getReplacementExpr - Return a SCEV expression which computes the<br>
 /// value of the OperandValToReplace.<br>
 const SCEV *IVUsers::getReplacementExpr(const IVStrideUse &IU) const {<br>
<br>
Modified: llvm/trunk/lib/CodeGen/MachineFunctionPass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineFunctionPass.cpp?rev=275698&r1=275697&r2=275698&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineFunctionPass.cpp?rev=275698&r1=275697&r2=275698&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/MachineFunctionPass.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/MachineFunctionPass.cpp Sat Jul 16 17:51:33 2016<br>
@@ -78,7 +78,7 @@ void MachineFunctionPass::getAnalysisUsa<br>
   AU.addPreserved<DominatorTreeWrapperPass>();<br>
   AU.addPreserved<AAResultsWrapperPass>();<br>
   AU.addPreserved<GlobalsAAWrapperPass>();<br>
-  AU.addPreserved<IVUsers>();<br>
+  AU.addPreserved<IVUsersWrapperPass>();<br>
   AU.addPreserved<LoopInfoWrapperPass>();<br>
   AU.addPreserved<MemoryDependenceWrapperPass>();<br>
   AU.addPreserved<ScalarEvolutionWrapperPass>();<br>
<br>
Modified: llvm/trunk/lib/Passes/PassBuilder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=275698&r1=275697&r2=275698&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=275698&r1=275697&r2=275698&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Passes/PassBuilder.cpp (original)<br>
+++ llvm/trunk/lib/Passes/PassBuilder.cpp Sat Jul 16 17:51:33 2016<br>
@@ -32,6 +32,7 @@<br>
 #include "llvm/Analysis/DependenceAnalysis.h"<br>
 #include "llvm/Analysis/DominanceFrontier.h"<br>
 #include "llvm/Analysis/GlobalsModRef.h"<br>
+#include "llvm/Analysis/IVUsers.h"<br>
 #include "llvm/Analysis/LazyCallGraph.h"<br>
 #include "llvm/Analysis/LazyValueInfo.h"<br>
 #include "llvm/Analysis/LoopAccessAnalysis.h"<br>
<br>
Modified: llvm/trunk/lib/Passes/PassRegistry.def<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassRegistry.def?rev=275698&r1=275697&r2=275698&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassRegistry.def?rev=275698&r1=275697&r2=275698&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Passes/PassRegistry.def (original)<br>
+++ llvm/trunk/lib/Passes/PassRegistry.def Sat Jul 16 17:51:33 2016<br>
@@ -182,6 +182,7 @@ FUNCTION_PASS("verify<regions>", RegionI<br>
 #endif<br>
 LOOP_ANALYSIS("no-op-loop", NoOpLoopAnalysis())<br>
 LOOP_ANALYSIS("access-info", LoopAccessAnalysis())<br>
+LOOP_ANALYSIS("ivusers", IVUsersAnalysis())<br>
 #undef LOOP_ANALYSIS<br>
<br>
 #ifndef LOOP_PASS<br>
@@ -198,4 +199,5 @@ LOOP_PASS("loop-deletion", LoopDeletionP<br>
 LOOP_PASS("simplify-cfg", LoopSimplifyCFGPass())<br>
 LOOP_PASS("indvars", IndVarSimplifyPass())<br>
 LOOP_PASS("print-access-info", LoopAccessInfoPrinterPass(dbgs()))<br>
+LOOP_PASS("print<ivusers>", IVUsersPrinterPass(dbgs()))<br>
 #undef LOOP_PASS<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=275698&r1=275697&r2=275698&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=275698&r1=275697&r2=275698&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp Sat Jul 16 17:51:33 2016<br>
@@ -4949,7 +4949,7 @@ INITIALIZE_PASS_BEGIN(LoopStrengthReduce<br>
 INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)<br>
 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)<br>
 INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)<br>
-INITIALIZE_PASS_DEPENDENCY(IVUsers)<br>
+INITIALIZE_PASS_DEPENDENCY(IVUsersWrapperPass)<br>
 INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)<br>
 INITIALIZE_PASS_DEPENDENCY(LoopSimplify)<br>
 INITIALIZE_PASS_END(LoopStrengthReduce, "loop-reduce",<br>
@@ -4979,8 +4979,8 @@ void LoopStrengthReduce::getAnalysisUsag<br>
   // Requiring LoopSimplify a second time here prevents IVUsers from running<br>
   // twice, since LoopSimplify was invalidated by running ScalarEvolution.<br>
   AU.addRequiredID(LoopSimplifyID);<br>
-  AU.addRequired<IVUsers>();<br>
-  AU.addPreserved<IVUsers>();<br>
+  AU.addRequired<IVUsersWrapperPass>();<br>
+  AU.addPreserved<IVUsersWrapperPass>();<br>
   AU.addRequired<TargetTransformInfoWrapperPass>();<br>
 }<br>
<br>
@@ -4988,7 +4988,7 @@ bool LoopStrengthReduce::runOnLoop(Loop<br>
   if (skipLoop(L))<br>
     return false;<br>
<br>
-  auto &IU = getAnalysis<IVUsers>();<br>
+  auto &IU = getAnalysis<IVUsersWrapperPass>().getIU();<br>
   auto &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE();<br>
   auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();<br>
   auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();<br>
<br>
Modified: llvm/trunk/test/Transforms/LoopStrengthReduce/quadradic-exit-value.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopStrengthReduce/quadradic-exit-value.ll?rev=275698&r1=275697&r2=275698&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopStrengthReduce/quadradic-exit-value.ll?rev=275698&r1=275697&r2=275698&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/LoopStrengthReduce/quadradic-exit-value.ll (original)<br>
+++ llvm/trunk/test/Transforms/LoopStrengthReduce/quadradic-exit-value.ll Sat Jul 16 17:51:33 2016<br>
@@ -1,4 +1,5 @@<br>
 ; RUN: opt < %s -analyze -iv-users | FileCheck %s<br>
+; RUN: opt -passes='function(require<scalar-evolution>),print<ivusers>' -S < %s 2>&1| FileCheck %s<br>
<br>
 ; Provide legal integer types.<br>
 target datalayout = "n8:16:32:64"<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>