<div dir="auto">Thanks for the pointers Michael. I'll investigate that and report back with my findings. </div><br><div class="gmail_quote"><div dir="ltr">On Thu, 16 Aug 2018, 21:29 Michael Kruse, <<a href="mailto:llvmdev@meinersbur.de">llvmdev@meinersbur.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This usually happens if an analysis required by LoopInfo is not<br>
preserved. However, LoopDeletion, LoopUnrollAndJam and LoopUnroll's<br>
getAnalysisUsage all call getLoopAnalysisUsage, which add the same<br>
pass preservations.<br>
<br>
I'd debug and step through the loop manager's code to find what makes<br>
the cases different.<br>
<br>
Michael<br>
<br>
Am Do., 9. Aug. 2018 um 04:17 Uhr schrieb Bhatu via llvm-dev<br>
<<a href="mailto:llvm-dev@lists.llvm.org" target="_blank" rel="noreferrer">llvm-dev@lists.llvm.org</a>>:<br>
><br>
> Hi,<br>
><br>
> If we add multiple loop passes to the pass manager in PassManagerBuilder.cpp consecutively without any func/module pass in between, I used to think they would belong to the same loop pass manager. But it does not seem to be the case.<br>
><br>
> For example for this code snippet<br>
>   PM.add(createIndVarSimplifyPass());        // Canonicalize indvars<br>
>   MPM.add(createLoopIdiomPass());             // Recognize idioms like memset.<br>
>   addExtensionsToPM(EP_LateLoopOptimizations, MPM);<br>
>   MPM.add(createLoopDeletionPass());          // Delete dead loops<br>
> ..<br>
>   if (!DisableUnrollLoops)<br>
>     MPM.add(createSimpleLoopUnrollPass(OptLevel));    // Unroll small loops<br>
><br>
> I see -debug-pass=Structure output:<br>
>         Scalar Evolution Analysis<br>
>         Loop Pass Manager<br>
>           Induction Variable Simplification<br>
>           Recognize loop idioms<br>
>           Delete dead loops<br>
>           Unroll loops<br>
>         MergedLoadStoreMotion<br>
><br>
> Which is in line to what I thought. However for this code snippet:<br>
>     if (EnableUnrollAndJam) {<br>
>       // Unroll and Jam. We do this before unroll but need to be in a separate<br>
>       // loop pass manager in order for the outer loop to be processed by<br>
>       // unroll and jam before the inner loop is unrolled.<br>
>       MPM.add(createLoopUnrollAndJamPass(OptLevel));<br>
>     }<br>
><br>
>     MPM.add(createLoopUnrollPass(OptLevel));    // Unroll small loops<br>
><br>
> I see:<br>
>       Loop-Closed SSA Form Pass<br>
>       Loop Pass Manager<br>
>         Unroll and Jam loops<br>
>       Loop Pass Manager<br>
>         Unroll loops<br>
>       Lazy Branch Probability Analysis<br>
><br>
> Here two different loop pass managers were created. What is the difference in between these two cases? How was the loop pass manager split up in the second case?<br>
><br>
><br>
> --<br>
> Regards<br>
> Bhatu<br>
> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank" rel="noreferrer">llvm-dev@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>