<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>