[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 12:13:55 PDT 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG58b9666dc1a0: [LSR] Fix bug - check if loop has preheader before calling isInductionPHI (authored by syzaara).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D129297/new/
https://reviews.llvm.org/D129297
Files:
llvm/lib/Transforms/Utils/LoopUtils.cpp
llvm/test/Transforms/LoopStrengthReduce/remove_scev_indvars.ll
Index: llvm/test/Transforms/LoopStrengthReduce/remove_scev_indvars.ll
===================================================================
--- llvm/test/Transforms/LoopStrengthReduce/remove_scev_indvars.ll
+++ llvm/test/Transforms/LoopStrengthReduce/remove_scev_indvars.ll
@@ -91,3 +91,24 @@
dead: ; No predecessors!
br label %for.cond6403
}
+
+
+; Check that this doesn't crash
+define void @kernfs_path_from_node() {
+entry:
+ callbr void asm sideeffect "", "i"(i8* blockaddress(@kernfs_path_from_node, %while.body))
+ to label %asm.fallthrough [label %while.body]
+
+asm.fallthrough: ; preds = %entry
+ br label %while.body
+
+while.body: ; preds = %while.body, %asm.fallthrough, %entry
+ %depth.04 = phi i32 [ %inc, %while.body ], [ 0, %asm.fallthrough ], [ 0, %entry ]
+ %inc = add i32 %depth.04, 1
+ br i1 false, label %while.end, label %while.body
+
+while.end: ; preds = %while.body
+ %inc.lcssa = phi i32 [ %depth.04, %while.body ]
+ store i32 %inc.lcssa, i32* null, align 4
+ ret void
+}
Index: llvm/lib/Transforms/Utils/LoopUtils.cpp
===================================================================
--- llvm/lib/Transforms/Utils/LoopUtils.cpp
+++ llvm/lib/Transforms/Utils/LoopUtils.cpp
@@ -1243,6 +1243,20 @@
return true;
}
+/// Checks if it is safe to call InductionDescriptor::isInductionPHI for \p Phi,
+/// and returns true if this Phi is an induction phi in the loop. When
+/// isInductionPHI returns true, \p ID will be also be set by isInductionPHI.
+static 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;
+ return InductionDescriptor::isInductionPHI(Phi, L, SE, ID);
+}
+
int llvm::rewriteLoopExitValues(Loop *L, LoopInfo *LI, TargetLibraryInfo *TLI,
ScalarEvolution *SE,
const TargetTransformInfo *TTI,
@@ -1303,10 +1317,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.
@@ -1327,12 +1338,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.443027.patch
Type: text/x-patch
Size: 3328 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220707/d25ec988/attachment.bin>
More information about the llvm-commits
mailing list