[PATCH] D129297: [LSR] Fix bug - check if loop has preheader before calling isInductionPHI
Zaara Syeda via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 7 08:37:58 PDT 2022
syzaara created this revision.
syzaara added reviewers: Meinersbur, LoopOptWG.
Herald added a subscriber: hiraditya.
Herald added a project: All.
syzaara requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Fix bug exposed by https://reviews.llvm.org/D125990, rewriteLoopExitValues calls InductionDescriptor::isInductionPHI which requires the PHI node to have an incoming edge from the loop preheader. This adds checks before calling InductionDescriptor::isInductionPHI to see that the loop has a preheader. Also did some refactoring.
https://reviews.llvm.org/D129297
Files:
llvm/lib/Transforms/Utils/LoopUtils.cpp
Index: llvm/lib/Transforms/Utils/LoopUtils.cpp
===================================================================
--- llvm/lib/Transforms/Utils/LoopUtils.cpp
+++ llvm/lib/Transforms/Utils/LoopUtils.cpp
@@ -1246,6 +1246,19 @@
return true;
}
+bool checkIsIndPhi(PHINode *Phi, Loop *L, ScalarEvolution *SE,
+ InductionDescriptor &ID) {
+ if (!Phi)
+ return false;
+ if (!L->getLoopPreheader())
+ return false;
+ if (Phi->getParent() != L->getHeader())
+ return false;
+ if (!InductionDescriptor::isInductionPHI(Phi, L, SE, ID))
+ return false;
+ return true;
+}
+
int llvm::rewriteLoopExitValues(Loop *L, LoopInfo *LI, TargetLibraryInfo *TLI,
ScalarEvolution *SE,
const TargetTransformInfo *TTI,
@@ -1306,10 +1319,7 @@
InductionDescriptor ID;
PHINode *IndPhi = dyn_cast<PHINode>(Inst);
if (IndPhi) {
- if (IndPhi->getParent() != L->getHeader())
- continue;
- // Do not consider non induction phis.
- if (!InductionDescriptor::isInductionPHI(IndPhi, L, SE, ID))
+ if (!checkIsIndPhi(IndPhi, L, SE, ID))
continue;
// This is an induction PHI. Check that the only users are PHI
// nodes, and induction variable update binary operators.
@@ -1330,12 +1340,8 @@
continue;
if (llvm::any_of(Inst->users(), [&](User *U) {
PHINode *Phi = dyn_cast<PHINode>(U);
- if (!Phi)
+ if (Phi != PN && !checkIsIndPhi(Phi, L, SE, ID))
return true;
- if (Phi->getParent() == L->getHeader()) {
- if (!InductionDescriptor::isInductionPHI(Phi, L, SE, ID))
- return true;
- }
return false;
}))
continue;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D129297.442933.patch
Type: text/x-patch
Size: 1941 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220707/819f63db/attachment.bin>
More information about the llvm-commits
mailing list