<div dir="ltr">Nice test case! This was a latent bug in LICM that was exposed by the change here. I've fixed LICM in r262108 and included a still further reduced test case for this pattern. Thanks again!<div><br></div><div>-Chandler</div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Feb 25, 2016 at 11:26 PM Mikael Holmén <<a href="mailto:mikael.holmen@ericsson.com">mikael.holmen@ericsson.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Chandler,<br>
<br>
The attached test case (originally generated by Csmith, ran through<br>
clang, and then bugpoint-reduced) now makes LICM hit the following assert:<br>
<br>
opt: ../lib/Transforms/Scalar/LICM.cpp:1048: llvm::AliasSetTracker<br>
*(anonymous namespace)::LICM::collectAliasInfoFromSubLoops(llvm::Loop<br>
*): Assertion `InnerAST && "Where is my AST?"' failed.<br>
<br>
when I run opt on it with the following command line:<br>
<br>
build-all/bin/opt -S -simplifycfg -functionattrs -instcombine -lcssa<br>
-loop-rotate -licm -loop-unswitch -loop-idiom -loop-unroll<br>
./bugpoint-reduced-simplified.ll<br>
<br>
<br>
If I revert your commit:<br>
<br>
"[LPM] Factor all of the loop analysis usage updates into a common<br>
helper routine."<br>
<br>
the crash goes away.<br>
<br>
Best regards,<br>
Mikael<br>
<br>
On 02/19/2016 11:45 AM, Chandler Carruth via llvm-commits wrote:<br>
> Author: chandlerc<br>
> Date: Fri Feb 19 04:45:18 2016<br>
> New Revision: 261316<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=261316&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=261316&view=rev</a><br>
> Log:<br>
> [LPM] Factor all of the loop analysis usage updates into a common helper<br>
> routine.<br>
><br>
> We were getting this wrong in small ways and generally being very<br>
> inconsistent about it across loop passes. Instead, let's have a common<br>
> place where we do this. One minor downside is that this will require<br>
> some analyses like SCEV in more places than they are strictly needed.<br>
> However, this seems benign as these analyses are complete no-ops, and<br>
> without this consistency we can in many cases end up with the legacy<br>
> pass manager scheduling deciding to split up a loop pass pipeline in<br>
> order to run the function analysis half-way through. It is very, very<br>
> annoying to fix these without just being very pedantic across the board.<br>
><br>
> The only loop passes I've not updated here are ones that use<br>
> AU.setPreservesAll() such as IVUsers (an analysis) and the pass printer.<br>
> They seemed less relevant.<br>
><br>
> With this patch, almost all of the problems in PR24804 around loop pass<br>
> pipelines are fixed. The one remaining issue is that we run simplify-cfg<br>
> and instcombine in the middle of the loop pass pipeline. We've recently<br>
> added some loop variants of these passes that would seem substantially<br>
> cleaner to use, but this at least gets us much closer to the previous<br>
> state. Notably, the seven loop pass managers is down to three.<br>
><br>
> I've not updated the loop passes using LoopAccessAnalysis because that<br>
> analysis hasn't been fully wired into LoopSimplify/LCSSA, and it isn't<br>
> clear that those transforms want to support those forms anyways. They<br>
> all run late anyways, so this is harmless. Similarly, LSR is left alone<br>
> because it already carefully manages its forms and doesn't need to get<br>
> fused into a single loop pass manager with a bunch of other loop passes.<br>
><br>
> LoopReroll didn't use loop simplified form previously, and I've updated<br>
> the test case to match the trivially different output.<br>
><br>
> Finally, I've also factored all the pass initialization for the passes<br>
> that use this technique as well, so that should be done regularly and<br>
> reliably.<br>
><br>
> Thanks to James for the help reviewing and thinking about this stuff,<br>
> and Ben for help thinking about it as well!<br>
><br>
> Differential Revision: <a href="http://reviews.llvm.org/D17435" rel="noreferrer" target="_blank">http://reviews.llvm.org/D17435</a><br>
><br>
> Modified:<br>
>      llvm/trunk/include/llvm/InitializePasses.h<br>
>      llvm/trunk/include/llvm/Transforms/Utils/LoopUtils.h<br>
>      llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp<br>
>      llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp<br>
>      llvm/trunk/lib/Transforms/Scalar/LICM.cpp<br>
>      llvm/trunk/lib/Transforms/Scalar/LoopDeletion.cpp<br>
>      llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp<br>
>      llvm/trunk/lib/Transforms/Scalar/LoopInstSimplify.cpp<br>
>      llvm/trunk/lib/Transforms/Scalar/LoopRerollPass.cpp<br>
>      llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp<br>
>      llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp<br>
>      llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp<br>
>      llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp<br>
>      llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp<br>
>      llvm/trunk/test/Other/pass-pipelines.ll<br>
>      llvm/trunk/test/Transforms/LoopReroll/nonconst_lb.ll<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=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/include/llvm/InitializePasses.h (original)<br>
> +++ llvm/trunk/include/llvm/InitializePasses.h Fri Feb 19 04:45:18 2016<br>
> @@ -163,6 +163,7 @@ void initializeLiveStacksPass(PassRegist<br>
>   void initializeLiveVariablesPass(PassRegistry&);<br>
>   void initializeLoaderPassPass(PassRegistry&);<br>
>   void initializeLocalStackSlotPassPass(PassRegistry&);<br>
> +void initializeLoopPassPass(PassRegistry&);<br>
>   void initializeLoopDeletionPass(PassRegistry&);<br>
>   void initializeLoopExtractorPass(PassRegistry&);<br>
>   void initializeLoopInfoWrapperPassPass(PassRegistry&);<br>
><br>
> Modified: llvm/trunk/include/llvm/Transforms/Utils/LoopUtils.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/LoopUtils.h?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/LoopUtils.h?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/include/llvm/Transforms/Utils/LoopUtils.h (original)<br>
> +++ llvm/trunk/include/llvm/Transforms/Utils/LoopUtils.h Fri Feb 19 04:45:18 2016<br>
> @@ -385,6 +385,14 @@ bool checkStringMetadataIntoLoop(Loop *T<br>
>   /// \brief Set input string into loop metadata by keeping other values intact.<br>
>   void addStringMetadataToLoop(Loop *TheLoop, const char *MDString,<br>
>                                unsigned V = 0);<br>
> +<br>
> +/// Helper to consistently add the set of standard passes to a loop pass's \c<br>
> +/// AnalysisUsage.<br>
> +///<br>
> +/// All loop passes should call this as part of implementing their \c<br>
> +/// getAnalysisUsage.<br>
> +void getLoopAnalysisUsage(AnalysisUsage &AU);<br>
> +<br>
>   }<br>
><br>
>   #endif<br>
><br>
> Modified: llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp Fri Feb 19 04:45:18 2016<br>
> @@ -107,16 +107,8 @@ public:<br>
>     bool runOnLoop(Loop *L, LPPassManager &LPM) override;<br>
><br>
>     void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
> -    AU.addRequired<DominatorTreeWrapperPass>();<br>
> -    AU.addRequired<LoopInfoWrapperPass>();<br>
> -    AU.addRequired<ScalarEvolutionWrapperPass>();<br>
> -    AU.addRequiredID(LoopSimplifyID);<br>
> -    AU.addRequiredID(LCSSAID);<br>
> -    AU.addPreserved<GlobalsAAWrapperPass>();<br>
> -    AU.addPreserved<ScalarEvolutionWrapperPass>();<br>
> -    AU.addPreservedID(LoopSimplifyID);<br>
> -    AU.addPreservedID(LCSSAID);<br>
>       AU.setPreservesCFG();<br>
> +    getLoopAnalysisUsage(AU);<br>
>     }<br>
><br>
>   private:<br>
> @@ -148,11 +140,7 @@ private:<br>
>   char IndVarSimplify::ID = 0;<br>
>   INITIALIZE_PASS_BEGIN(IndVarSimplify, "indvars",<br>
>                   "Induction Variable Simplification", false, false)<br>
> -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopSimplify)<br>
> -INITIALIZE_PASS_DEPENDENCY(LCSSA)<br>
> +INITIALIZE_PASS_DEPENDENCY(LoopPass)<br>
>   INITIALIZE_PASS_END(IndVarSimplify, "indvars",<br>
>                   "Induction Variable Simplification", false, false)<br>
><br>
><br>
> Modified: llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp Fri Feb 19 04:45:18 2016<br>
> @@ -211,11 +211,8 @@ public:<br>
>     }<br>
><br>
>     void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
> -    AU.addRequired<LoopInfoWrapperPass>();<br>
> -    AU.addRequiredID(LoopSimplifyID);<br>
> -    AU.addRequiredID(LCSSAID);<br>
> -    AU.addRequired<ScalarEvolutionWrapperPass>();<br>
>       AU.addRequired<BranchProbabilityInfoWrapperPass>();<br>
> +    getLoopAnalysisUsage(AU);<br>
>     }<br>
><br>
>     bool runOnLoop(Loop *L, LPPassManager &LPM) override;<br>
> @@ -226,11 +223,8 @@ char InductiveRangeCheckElimination::ID<br>
><br>
>   INITIALIZE_PASS_BEGIN(InductiveRangeCheckElimination, "irce",<br>
>                         "Inductive range check elimination", false, false)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopSimplify)<br>
> -INITIALIZE_PASS_DEPENDENCY(LCSSA)<br>
> -INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)<br>
>   INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfoWrapperPass)<br>
> +INITIALIZE_PASS_DEPENDENCY(LoopPass)<br>
>   INITIALIZE_PASS_END(InductiveRangeCheckElimination, "irce",<br>
>                       "Inductive range check elimination", false, false)<br>
><br>
><br>
> Modified: llvm/trunk/lib/Transforms/Scalar/LICM.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LICM.cpp?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LICM.cpp?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Scalar/LICM.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Scalar/LICM.cpp Fri Feb 19 04:45:18 2016<br>
> @@ -118,19 +118,8 @@ namespace {<br>
>       ///<br>
>       void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
>         AU.setPreservesCFG();<br>
> -      AU.addRequired<DominatorTreeWrapperPass>();<br>
> -      AU.addRequired<LoopInfoWrapperPass>();<br>
> -      AU.addRequiredID(LoopSimplifyID);<br>
> -      AU.addPreservedID(LoopSimplifyID);<br>
> -      AU.addRequiredID(LCSSAID);<br>
> -      AU.addPreservedID(LCSSAID);<br>
> -      AU.addRequired<AAResultsWrapperPass>();<br>
> -      AU.addPreserved<AAResultsWrapperPass>();<br>
> -      AU.addPreserved<BasicAAWrapperPass>();<br>
> -      AU.addPreserved<GlobalsAAWrapperPass>();<br>
> -      AU.addPreserved<ScalarEvolutionWrapperPass>();<br>
> -      AU.addPreserved<SCEVAAWrapperPass>();<br>
>         AU.addRequired<TargetLibraryInfoWrapperPass>();<br>
> +      getLoopAnalysisUsage(AU);<br>
>       }<br>
><br>
>       using llvm::Pass::doFinalization;<br>
> @@ -174,16 +163,8 @@ namespace {<br>
><br>
>   char LICM::ID = 0;<br>
>   INITIALIZE_PASS_BEGIN(LICM, "licm", "Loop Invariant Code Motion", false, false)<br>
> -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopSimplify)<br>
> -INITIALIZE_PASS_DEPENDENCY(LCSSA)<br>
> -INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)<br>
> +INITIALIZE_PASS_DEPENDENCY(LoopPass)<br>
>   INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(BasicAAWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(GlobalsAAWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(SCEVAAWrapperPass)<br>
>   INITIALIZE_PASS_END(LICM, "licm", "Loop Invariant Code Motion", false, false)<br>
><br>
>   Pass *llvm::createLICMPass() { return new LICM(); }<br>
><br>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopDeletion.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopDeletion.cpp?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopDeletion.cpp?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Scalar/LoopDeletion.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Scalar/LoopDeletion.cpp Fri Feb 19 04:45:18 2016<br>
> @@ -21,6 +21,7 @@<br>
>   #include "llvm/Analysis/LoopPass.h"<br>
>   #include "llvm/Analysis/ScalarEvolution.h"<br>
>   #include "llvm/IR/Dominators.h"<br>
> +#include "llvm/Transforms/Utils/LoopUtils.h"<br>
>   using namespace llvm;<br>
><br>
>   #define DEBUG_TYPE "loop-delete"<br>
> @@ -39,18 +40,7 @@ namespace {<br>
>       bool runOnLoop(Loop *L, LPPassManager &) override;<br>
><br>
>       void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
> -      AU.addRequired<DominatorTreeWrapperPass>();<br>
> -      AU.addRequired<LoopInfoWrapperPass>();<br>
> -      AU.addRequired<ScalarEvolutionWrapperPass>();<br>
> -      AU.addRequiredID(LoopSimplifyID);<br>
> -      AU.addRequiredID(LCSSAID);<br>
> -<br>
> -      AU.addPreserved<ScalarEvolutionWrapperPass>();<br>
> -      AU.addPreserved<DominatorTreeWrapperPass>();<br>
> -      AU.addPreserved<LoopInfoWrapperPass>();<br>
> -      AU.addPreserved<GlobalsAAWrapperPass>();<br>
> -      AU.addPreservedID(LoopSimplifyID);<br>
> -      AU.addPreservedID(LCSSAID);<br>
> +      getLoopAnalysisUsage(AU);<br>
>       }<br>
><br>
>     private:<br>
> @@ -64,11 +54,7 @@ namespace {<br>
>   char LoopDeletion::ID = 0;<br>
>   INITIALIZE_PASS_BEGIN(LoopDeletion, "loop-deletion",<br>
>                   "Delete dead loops", false, false)<br>
> -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopSimplify)<br>
> -INITIALIZE_PASS_DEPENDENCY(LCSSA)<br>
> +INITIALIZE_PASS_DEPENDENCY(LoopPass)<br>
>   INITIALIZE_PASS_END(LoopDeletion, "loop-deletion",<br>
>                   "Delete dead loops", false, false)<br>
><br>
><br>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp Fri Feb 19 04:45:18 2016<br>
> @@ -54,6 +54,7 @@<br>
>   #include "llvm/Support/Debug.h"<br>
>   #include "llvm/Support/raw_ostream.h"<br>
>   #include "llvm/Transforms/Utils/Local.h"<br>
> +#include "llvm/Transforms/Utils/LoopUtils.h"<br>
>   using namespace llvm;<br>
><br>
>   #define DEBUG_TYPE "loop-idiom"<br>
> @@ -85,23 +86,9 @@ public:<br>
>     /// loop preheaders be inserted into the CFG.<br>
>     ///<br>
>     void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
> -    AU.addRequired<LoopInfoWrapperPass>();<br>
> -    AU.addPreserved<LoopInfoWrapperPass>();<br>
> -    AU.addRequiredID(LoopSimplifyID);<br>
> -    AU.addPreservedID(LoopSimplifyID);<br>
> -    AU.addRequiredID(LCSSAID);<br>
> -    AU.addPreservedID(LCSSAID);<br>
> -    AU.addRequired<AAResultsWrapperPass>();<br>
> -    AU.addPreserved<AAResultsWrapperPass>();<br>
> -    AU.addRequired<ScalarEvolutionWrapperPass>();<br>
> -    AU.addPreserved<ScalarEvolutionWrapperPass>();<br>
> -    AU.addPreserved<SCEVAAWrapperPass>();<br>
> -    AU.addRequired<DominatorTreeWrapperPass>();<br>
> -    AU.addPreserved<DominatorTreeWrapperPass>();<br>
>       AU.addRequired<TargetLibraryInfoWrapperPass>();<br>
>       AU.addRequired<TargetTransformInfoWrapperPass>();<br>
> -    AU.addPreserved<BasicAAWrapperPass>();<br>
> -    AU.addPreserved<GlobalsAAWrapperPass>();<br>
> +    getLoopAnalysisUsage(AU);<br>
>     }<br>
><br>
>   private:<br>
> @@ -154,16 +141,8 @@ private:<br>
>   char LoopIdiomRecognize::ID = 0;<br>
>   INITIALIZE_PASS_BEGIN(LoopIdiomRecognize, "loop-idiom", "Recognize loop idioms",<br>
>                         false, false)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopSimplify)<br>
> -INITIALIZE_PASS_DEPENDENCY(LCSSA)<br>
> -INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)<br>
> +INITIALIZE_PASS_DEPENDENCY(LoopPass)<br>
>   INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(BasicAAWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(GlobalsAAWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(SCEVAAWrapperPass)<br>
>   INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)<br>
>   INITIALIZE_PASS_END(LoopIdiomRecognize, "loop-idiom", "Recognize loop idioms",<br>
>                       false, false)<br>
><br>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopInstSimplify.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopInstSimplify.cpp?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopInstSimplify.cpp?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Scalar/LoopInstSimplify.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Scalar/LoopInstSimplify.cpp Fri Feb 19 04:45:18 2016<br>
> @@ -25,6 +25,7 @@<br>
>   #include "llvm/Support/Debug.h"<br>
>   #include "llvm/Analysis/TargetLibraryInfo.h"<br>
>   #include "llvm/Transforms/Utils/Local.h"<br>
> +#include "llvm/Transforms/Utils/LoopUtils.h"<br>
>   using namespace llvm;<br>
><br>
>   #define DEBUG_TYPE "loop-instsimplify"<br>
> @@ -42,14 +43,10 @@ namespace {<br>
>       bool runOnLoop(Loop*, LPPassManager&) override;<br>
><br>
>       void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
> -      AU.setPreservesCFG();<br>
>         AU.addRequired<AssumptionCacheTracker>();<br>
> -      AU.addRequired<LoopInfoWrapperPass>();<br>
> -      AU.addRequiredID(LoopSimplifyID);<br>
> -      AU.addPreservedID(LoopSimplifyID);<br>
> -      AU.addPreservedID(LCSSAID);<br>
> -      AU.addPreserved<ScalarEvolutionWrapperPass>();<br>
>         AU.addRequired<TargetLibraryInfoWrapperPass>();<br>
> +      AU.setPreservesCFG();<br>
> +      getLoopAnalysisUsage(AU);<br>
>       }<br>
>     };<br>
>   }<br>
> @@ -58,10 +55,8 @@ char LoopInstSimplify::ID = 0;<br>
>   INITIALIZE_PASS_BEGIN(LoopInstSimplify, "loop-instsimplify",<br>
>                   "Simplify instructions in loops", false, false)<br>
>   INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)<br>
> +INITIALIZE_PASS_DEPENDENCY(LoopPass)<br>
>   INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LCSSA)<br>
>   INITIALIZE_PASS_END(LoopInstSimplify, "loop-instsimplify",<br>
>                   "Simplify instructions in loops", false, false)<br>
><br>
><br>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopRerollPass.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopRerollPass.cpp?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopRerollPass.cpp?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Scalar/LoopRerollPass.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Scalar/LoopRerollPass.cpp Fri Feb 19 04:45:18 2016<br>
> @@ -147,13 +147,8 @@ namespace {<br>
>       bool runOnLoop(Loop *L, LPPassManager &LPM) override;<br>
><br>
>       void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
> -      AU.addRequired<AAResultsWrapperPass>();<br>
> -      AU.addRequired<LoopInfoWrapperPass>();<br>
> -      AU.addPreserved<LoopInfoWrapperPass>();<br>
> -      AU.addRequired<DominatorTreeWrapperPass>();<br>
> -      AU.addPreserved<DominatorTreeWrapperPass>();<br>
> -      AU.addRequired<ScalarEvolutionWrapperPass>();<br>
>         AU.addRequired<TargetLibraryInfoWrapperPass>();<br>
> +      getLoopAnalysisUsage(AU);<br>
>       }<br>
><br>
>     protected:<br>
> @@ -439,10 +434,7 @@ namespace {<br>
><br>
>   char LoopReroll::ID = 0;<br>
>   INITIALIZE_PASS_BEGIN(LoopReroll, "loop-reroll", "Reroll loops", false, false)<br>
> -INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)<br>
> +INITIALIZE_PASS_DEPENDENCY(LoopPass)<br>
>   INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)<br>
>   INITIALIZE_PASS_END(LoopReroll, "loop-reroll", "Reroll loops", false, false)<br>
><br>
><br>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp Fri Feb 19 04:45:18 2016<br>
> @@ -34,6 +34,7 @@<br>
>   #include "llvm/Support/raw_ostream.h"<br>
>   #include "llvm/Transforms/Utils/BasicBlockUtils.h"<br>
>   #include "llvm/Transforms/Utils/Local.h"<br>
> +#include "llvm/Transforms/Utils/LoopUtils.h"<br>
>   #include "llvm/Transforms/Utils/SSAUpdater.h"<br>
>   #include "llvm/Transforms/Utils/ValueMapper.h"<br>
>   using namespace llvm;<br>
> @@ -578,20 +579,9 @@ public:<br>
><br>
>     // LCSSA form makes instruction renaming easier.<br>
>     void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
> -    AU.addPreserved<AAResultsWrapperPass>();<br>
>       AU.addRequired<AssumptionCacheTracker>();<br>
> -    AU.addPreserved<DominatorTreeWrapperPass>();<br>
> -    AU.addRequired<LoopInfoWrapperPass>();<br>
> -    AU.addPreserved<LoopInfoWrapperPass>();<br>
> -    AU.addRequiredID(LoopSimplifyID);<br>
> -    AU.addPreservedID(LoopSimplifyID);<br>
> -    AU.addRequiredID(LCSSAID);<br>
> -    AU.addPreservedID(LCSSAID);<br>
> -    AU.addPreserved<ScalarEvolutionWrapperPass>();<br>
> -    AU.addPreserved<SCEVAAWrapperPass>();<br>
>       AU.addRequired<TargetTransformInfoWrapperPass>();<br>
> -    AU.addPreserved<BasicAAWrapperPass>();<br>
> -    AU.addPreserved<GlobalsAAWrapperPass>();<br>
> +    getLoopAnalysisUsage(AU);<br>
>     }<br>
><br>
>     bool runOnLoop(Loop *L, LPPassManager &LPM) override {<br>
> @@ -614,14 +604,9 @@ public:<br>
><br>
>   char LoopRotate::ID = 0;<br>
>   INITIALIZE_PASS_BEGIN(LoopRotate, "loop-rotate", "Rotate Loops", false, false)<br>
> -INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)<br>
>   INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopSimplify)<br>
> -INITIALIZE_PASS_DEPENDENCY(LCSSA)<br>
> -INITIALIZE_PASS_DEPENDENCY(SCEVAAWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(BasicAAWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(GlobalsAAWrapperPass)<br>
> +INITIALIZE_PASS_DEPENDENCY(LoopPass)<br>
> +INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)<br>
>   INITIALIZE_PASS_END(LoopRotate, "loop-rotate", "Rotate Loops", false, false)<br>
><br>
>   Pass *llvm::createLoopRotatePass(int MaxHeaderSize) {<br>
><br>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp Fri Feb 19 04:45:18 2016<br>
> @@ -29,6 +29,7 @@<br>
>   #include "llvm/Analysis/TargetTransformInfo.h"<br>
>   #include "llvm/IR/Dominators.h"<br>
>   #include "llvm/Transforms/Utils/Local.h"<br>
> +#include "llvm/Transforms/Utils/LoopUtils.h"<br>
>   using namespace llvm;<br>
><br>
>   #define DEBUG_TYPE "loop-simplifycfg"<br>
> @@ -44,19 +45,8 @@ public:<br>
>     bool runOnLoop(Loop *L, LPPassManager &) override;<br>
><br>
>     void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
> -    AU.addRequired<DominatorTreeWrapperPass>();<br>
> -    AU.addRequired<LoopInfoWrapperPass>();<br>
> -<br>
> -    AU.addPreserved<DominatorTreeWrapperPass>();<br>
> -    AU.addPreserved<LoopInfoWrapperPass>();<br>
> -    AU.addPreserved<GlobalsAAWrapperPass>();<br>
> -    AU.addPreserved<BasicAAWrapperPass>();<br>
> -    AU.addPreserved<AAResultsWrapperPass>();<br>
> -    AU.addPreserved<ScalarEvolutionWrapperPass>();<br>
> -    AU.addPreserved<SCEVAAWrapperPass>();<br>
>       AU.addPreserved<DependenceAnalysis>();<br>
> -    AU.addPreservedID(LoopSimplifyID);<br>
> -    AU.addPreservedID(LCSSAID);<br>
> +    getLoopAnalysisUsage(AU);<br>
>     }<br>
>   };<br>
>   }<br>
> @@ -64,8 +54,7 @@ public:<br>
>   char LoopSimplifyCFG::ID = 0;<br>
>   INITIALIZE_PASS_BEGIN(LoopSimplifyCFG, "loop-simplifycfg", "Simplify loop CFG",<br>
>                         false, false)<br>
> -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)<br>
> +INITIALIZE_PASS_DEPENDENCY(LoopPass)<br>
>   INITIALIZE_PASS_END(LoopSimplifyCFG, "loop-simplifycfg", "Simplify loop CFG",<br>
>                       false, false)<br>
><br>
><br>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp Fri Feb 19 04:45:18 2016<br>
> @@ -32,6 +32,7 @@<br>
>   #include "llvm/Support/CommandLine.h"<br>
>   #include "llvm/Support/Debug.h"<br>
>   #include "llvm/Support/raw_ostream.h"<br>
> +#include "llvm/Transforms/Utils/LoopUtils.h"<br>
>   #include "llvm/Transforms/Utils/UnrollLoop.h"<br>
>   #include <climits><br>
><br>
> @@ -744,35 +745,19 @@ public:<br>
>     ///<br>
>     void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
>       AU.addRequired<AssumptionCacheTracker>();<br>
> -    AU.addRequired<DominatorTreeWrapperPass>();<br>
> -    AU.addRequired<LoopInfoWrapperPass>();<br>
> -    AU.addPreserved<LoopInfoWrapperPass>();<br>
> -    AU.addRequiredID(LoopSimplifyID);<br>
> -    AU.addPreservedID(LoopSimplifyID);<br>
> -    AU.addRequiredID(LCSSAID);<br>
> -    AU.addPreservedID(LCSSAID);<br>
> -    AU.addRequired<ScalarEvolutionWrapperPass>();<br>
> -    AU.addPreserved<ScalarEvolutionWrapperPass>();<br>
>       AU.addRequired<TargetTransformInfoWrapperPass>();<br>
> -    // FIXME: Loop unroll requires LCSSA. And LCSSA requires dom info.<br>
> -    // If loop unroll does not preserve dom info then LCSSA pass on next<br>
> -    // loop will receive invalid dom info.<br>
> -    // For now, recreate dom info, if loop is unrolled.<br>
> -    AU.addPreserved<DominatorTreeWrapperPass>();<br>
> -    AU.addPreserved<GlobalsAAWrapperPass>();<br>
> +    // FIXME: Loop passes are required to preserve domtree, and for now we just<br>
> +    // recreate dom info if anything gets unrolled.<br>
> +    getLoopAnalysisUsage(AU);<br>
>     }<br>
>   };<br>
>   }<br>
><br>
>   char LoopUnroll::ID = 0;<br>
>   INITIALIZE_PASS_BEGIN(LoopUnroll, "loop-unroll", "Unroll loops", false, false)<br>
> -INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)<br>
>   INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)<br>
> -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopSimplify)<br>
> -INITIALIZE_PASS_DEPENDENCY(LCSSA)<br>
> -INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)<br>
> +INITIALIZE_PASS_DEPENDENCY(LoopPass)<br>
> +INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)<br>
>   INITIALIZE_PASS_END(LoopUnroll, "loop-unroll", "Unroll loops", false, false)<br>
><br>
>   Pass *llvm::createLoopUnrollPass(int Threshold, int Count, int AllowPartial,<br>
><br>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp Fri Feb 19 04:45:18 2016<br>
> @@ -55,6 +55,7 @@<br>
>   #include "llvm/Transforms/Utils/BasicBlockUtils.h"<br>
>   #include "llvm/Transforms/Utils/Cloning.h"<br>
>   #include "llvm/Transforms/Utils/Local.h"<br>
> +#include "llvm/Transforms/Utils/LoopUtils.h"<br>
>   #include <algorithm><br>
>   #include <map><br>
>   #include <set><br>
> @@ -211,17 +212,8 @@ namespace {<br>
>       ///<br>
>       void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
>         AU.addRequired<AssumptionCacheTracker>();<br>
> -      AU.addRequiredID(LoopSimplifyID);<br>
> -      AU.addPreservedID(LoopSimplifyID);<br>
> -      AU.addRequired<LoopInfoWrapperPass>();<br>
> -      AU.addPreserved<LoopInfoWrapperPass>();<br>
> -      AU.addRequiredID(LCSSAID);<br>
> -      AU.addPreservedID(LCSSAID);<br>
> -      AU.addRequired<DominatorTreeWrapperPass>();<br>
> -      AU.addPreserved<DominatorTreeWrapperPass>();<br>
> -      AU.addPreserved<ScalarEvolutionWrapperPass>();<br>
>         AU.addRequired<TargetTransformInfoWrapperPass>();<br>
> -      AU.addPreserved<GlobalsAAWrapperPass>();<br>
> +      getLoopAnalysisUsage(AU);<br>
>       }<br>
><br>
>     private:<br>
> @@ -382,11 +374,9 @@ void LUAnalysisCache::cloneData(const Lo<br>
>   char LoopUnswitch::ID = 0;<br>
>   INITIALIZE_PASS_BEGIN(LoopUnswitch, "loop-unswitch", "Unswitch loops",<br>
>                         false, false)<br>
> -INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)<br>
>   INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopSimplify)<br>
> -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)<br>
> -INITIALIZE_PASS_DEPENDENCY(LCSSA)<br>
> +INITIALIZE_PASS_DEPENDENCY(LoopPass)<br>
> +INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)<br>
>   INITIALIZE_PASS_END(LoopUnswitch, "loop-unswitch", "Unswitch loops",<br>
>                         false, false)<br>
><br>
><br>
> Modified: llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp Fri Feb 19 04:45:18 2016<br>
> @@ -11,13 +11,19 @@<br>
>   //<br>
>   //===----------------------------------------------------------------------===//<br>
><br>
> +#include "llvm/Analysis/AliasAnalysis.h"<br>
> +#include "llvm/Analysis/BasicAliasAnalysis.h"<br>
>   #include "llvm/Analysis/LoopInfo.h"<br>
> +#include "llvm/Analysis/GlobalsModRef.h"<br>
>   #include "llvm/Analysis/ScalarEvolution.h"<br>
>   #include "llvm/Analysis/ScalarEvolutionExpressions.h"<br>
> +#include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"<br>
> +#include "llvm/IR/Dominators.h"<br>
>   #include "llvm/IR/Instructions.h"<br>
>   #include "llvm/IR/Module.h"<br>
>   #include "llvm/IR/PatternMatch.h"<br>
>   #include "llvm/IR/ValueHandle.h"<br>
> +#include "llvm/Pass.h"<br>
>   #include "llvm/Support/Debug.h"<br>
>   #include "llvm/Transforms/Utils/LoopUtils.h"<br>
><br>
> @@ -727,3 +733,57 @@ SmallVector<Instruction *, 8> llvm::find<br>
><br>
>     return UsedOutside;<br>
>   }<br>
> +<br>
> +void llvm::getLoopAnalysisUsage(AnalysisUsage &AU) {<br>
> +  // By definition, all loop passes need the LoopInfo analysis and the<br>
> +  // Dominator tree it depends on. Because they all participate in the loop<br>
> +  // pass manager, they must also preserve these.<br>
> +  AU.addRequired<DominatorTreeWrapperPass>();<br>
> +  AU.addPreserved<DominatorTreeWrapperPass>();<br>
> +  AU.addRequired<LoopInfoWrapperPass>();<br>
> +  AU.addPreserved<LoopInfoWrapperPass>();<br>
> +<br>
> +  // We must also preserve LoopSimplify and LCSSA. We locally access their IDs<br>
> +  // here because users shouldn't directly get them from this header.<br>
> +  extern char &LoopSimplifyID;<br>
> +  extern char &LCSSAID;<br>
> +  AU.addRequiredID(LoopSimplifyID);<br>
> +  AU.addPreservedID(LoopSimplifyID);<br>
> +  AU.addRequiredID(LCSSAID);<br>
> +  AU.addPreservedID(LCSSAID);<br>
> +<br>
> +  // Loop passes are designed to run inside of a loop pass manager which means<br>
> +  // that any function analyses they require must be required by the first loop<br>
> +  // pass in the manager (so that it is computed before the loop pass manager<br>
> +  // runs) and preserved by all loop pasess in the manager. To make this<br>
> +  // reasonably robust, the set needed for most loop passes is maintained here.<br>
> +  // If your loop pass requires an analysis not listed here, you will need to<br>
> +  // carefully audit the loop pass manager nesting structure that results.<br>
> +  AU.addRequired<AAResultsWrapperPass>();<br>
> +  AU.addPreserved<AAResultsWrapperPass>();<br>
> +  AU.addPreserved<BasicAAWrapperPass>();<br>
> +  AU.addPreserved<GlobalsAAWrapperPass>();<br>
> +  AU.addPreserved<SCEVAAWrapperPass>();<br>
> +  AU.addRequired<ScalarEvolutionWrapperPass>();<br>
> +  AU.addPreserved<ScalarEvolutionWrapperPass>();<br>
> +}<br>
> +<br>
> +/// Manually defined generic "LoopPass" dependency initialization. This is used<br>
> +/// to initialize the exact set of passes from above in \c<br>
> +/// getLoopAnalysisUsage. It can be used within a loop pass's initialization<br>
> +/// with:<br>
> +///<br>
> +///   INITIALIZE_PASS_DEPENDENCY(LoopPass)<br>
> +///<br>
> +/// As-if "LoopPass" were a pass.<br>
> +void llvm::initializeLoopPassPass(PassRegistry &Registry) {<br>
> +  INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)<br>
> +  INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)<br>
> +  INITIALIZE_PASS_DEPENDENCY(LoopSimplify)<br>
> +  INITIALIZE_PASS_DEPENDENCY(LCSSA)<br>
> +  INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)<br>
> +  INITIALIZE_PASS_DEPENDENCY(BasicAAWrapperPass)<br>
> +  INITIALIZE_PASS_DEPENDENCY(GlobalsAAWrapperPass)<br>
> +  INITIALIZE_PASS_DEPENDENCY(SCEVAAWrapperPass)<br>
> +  INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)<br>
> +}<br>
><br>
> Modified: llvm/trunk/test/Other/pass-pipelines.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/pass-pipelines.ll?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/pass-pipelines.ll?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/Other/pass-pipelines.ll (original)<br>
> +++ llvm/trunk/test/Other/pass-pipelines.ll Fri Feb 19 04:45:18 2016<br>
> @@ -38,12 +38,6 @@<br>
>   ; CHECK-O2-NOT: Manager<br>
>   ; CHECK-O2: Loop Pass Manager<br>
>   ; CHECK-O2-NOT: Manager<br>
> -; FIXME: We shouldn't have this extra loop pass manager!<br>
> -; CHECK-O2: Loop Pass Manager<br>
> -; CHECK-O2-NOT: Manager<br>
> -; FIXME: Yet another pointless loop pass manager!<br>
> -; CHECK-O2: Loop Pass Manager<br>
> -; CHECK-O2-NOT: Manager<br>
>   ; FIXME: We shouldn't be pulling out to simplify-cfg and instcombine and<br>
>   ; causing new loop pass managers.<br>
>   ; CHECK-O2: Simplify the CFG<br>
> @@ -52,12 +46,6 @@<br>
>   ; CHECK-O2-NOT: Manager<br>
>   ; CHECK-O2: Loop Pass Manager<br>
>   ; CHECK-O2-NOT: Manager<br>
> -; FIXME: Yet another pointless loop pass manager!<br>
> -; CHECK-O2: Loop Pass Manager<br>
> -; CHECK-O2-NOT: Manager<br>
> -; FIXME: Yet another pointless loop pass manager!<br>
> -; CHECK-O2: Loop Pass Manager<br>
> -; CHECK-O2-NOT: Manager<br>
>   ; FIXME: It isn't clear that we need yet another loop pass pipeline<br>
>   ; and run of LICM here.<br>
>   ; CHECK-O2-NOT: Manager<br>
><br>
> Modified: llvm/trunk/test/Transforms/LoopReroll/nonconst_lb.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopReroll/nonconst_lb.ll?rev=261316&r1=261315&r2=261316&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopReroll/nonconst_lb.ll?rev=261316&r1=261315&r2=261316&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/Transforms/LoopReroll/nonconst_lb.ll (original)<br>
> +++ llvm/trunk/test/Transforms/LoopReroll/nonconst_lb.ll Fri Feb 19 04:45:18 2016<br>
> @@ -58,7 +58,7 @@ for.end:<br>
>   ; CHECK:   br label %for.body<br>
><br>
>   ; CHECK: for.body:                                         ; preds = %for.body, %for.body.preheader<br>
> -; CHECK:   %indvar = phi i32 [ %indvar.next, %for.body ], [ 0, %for.body.preheader ]<br>
> +; CHECK:   %indvar = phi i32 [ 0, %for.body.preheader ], [ %indvar.next, %for.body ]<br>
>   ; CHECK:   %6 = add i32 %m, %indvar<br>
>   ; CHECK:   %arrayidx = getelementptr inbounds i32, i32* %B, i32 %6<br>
>   ; CHECK:   %7 = load i32, i32* %arrayidx, align 4<br>
> @@ -67,7 +67,7 @@ for.end:<br>
>   ; CHECK:   store i32 %mul, i32* %arrayidx2, align 4<br>
>   ; CHECK:   %indvar.next = add i32 %indvar, 1<br>
>   ; CHECK:   %exitcond = icmp eq i32 %6, %5<br>
> -; CHECK:   br i1 %exitcond, label %for.end, label %for.body<br>
> +; CHECK:   br i1 %exitcond, label %for.end.loopexit, label %for.body<br>
><br>
>   ;void daxpy_ur(int n,float da,float *dx,float *dy)<br>
>   ;    {<br>
> @@ -138,7 +138,7 @@ for.end:<br>
>   ; CHECK:   br label %for.body<br>
><br>
>   ; CHECK: for.body:<br>
> -; CHECK:   %indvar = phi i32 [ %indvar.next, %for.body ], [ 0, %for.body.preheader ]<br>
> +; CHECK:   %indvar = phi i32 [ 0, %for.body.preheader ], [ %indvar.next, %for.body ]<br>
>   ; CHECK:   %6 = add i32 %rem, %indvar<br>
>   ; CHECK:   %arrayidx = getelementptr inbounds float, float* %dy, i32 %6<br>
>   ; CHECK:   %7 = load float, float* %arrayidx, align 4<br>
> @@ -149,4 +149,4 @@ for.end:<br>
>   ; CHECK:   store float %add, float* %arrayidx, align 4<br>
>   ; CHECK:   %indvar.next = add i32 %indvar, 1<br>
>   ; CHECK:   %exitcond = icmp eq i32 %6, %5<br>
> -; CHECK:   br i1 %exitcond, label %for.end, label %for.body<br>
> +; CHECK:   br i1 %exitcond, label %for.end.loopexit, label %for.body<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org" target="_blank">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>
><br>
</blockquote></div>