[PATCH] D146811: [LSR] Preserve LCSSA when rewriting instruction with PHI user

Max Kazantsev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 28 01:41:16 PDT 2023


mkazantsev accepted this revision.
mkazantsev added inline comments.
This revision is now accepted and ready to land.


================
Comment at: llvm/test/Transforms/LoopStrengthReduce/depth-limit-overrun.ll:77
 ; LIMIT-NEXT:  entry:
+; LIMIT-NEXT:    [[TMP0:%.*]] = mul i32 [[C:%.*]], -3
 ; LIMIT-NEXT:    br label [[OUTER_LOOP:%.*]]
----------------
dmakogon wrote:
> dmakogon wrote:
> > mkazantsev wrote:
> > > That's weird.
> > I guess it's ok because we get exactly the same IR as with DEFAULT checks above which are generated by running the pass through new pass manager.
> Ok, I found out why this happens. LSR here calculates the exit value of the inner loop IV (%i33) using SCEV, and it is able to do so because its only use is in loop exit block (in LCSSA PHI which is inserted in `outer_tail.loopexit` block because of my changes). Previously we wouldn't create this LCSSA PHI and the IV's use would be in a inner loop exit's successor. 
> LSR checks for LCSSA form of the loop explicitly, and if the check fails, we don't even try this exit value calculation.
> The corresponding code for that:
> ```
> if (L->isRecursivelyLCSSAForm(DT, LI) && L->getExitBlock()) {
>     ...
>     int Rewrites = rewriteLoopExitValues(L, &LI, &TLI, &SE, &TTI, Rewriter, &DT,
>                                              UnusedIndVarInLoop, DeadInsts);
> ```
So it's an improvement then. Allright, let it be.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D146811/new/

https://reviews.llvm.org/D146811



More information about the llvm-commits mailing list