[PATCH] D121104: [SCEV] Verify all IR -> SCEV mappings
Nikita Popov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 9 00:37:46 PST 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGba8ee4a43e39: [SCEV] Verify all IR -> SCEV mappings (authored by nikic).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D121104/new/
https://reviews.llvm.org/D121104
Files:
llvm/lib/Analysis/ScalarEvolution.cpp
Index: llvm/lib/Analysis/ScalarEvolution.cpp
===================================================================
--- llvm/lib/Analysis/ScalarEvolution.cpp
+++ llvm/lib/Analysis/ScalarEvolution.cpp
@@ -13355,6 +13355,24 @@
SmallPtrSet<BasicBlock *, 16> ReachableBlocks;
getReachableBlocks(ReachableBlocks, F);
+ auto GetDelta = [&](const SCEV *Old, const SCEV *New) -> const SCEV * {
+ if (containsUndefs(Old) || containsUndefs(New)) {
+ // SCEV treats "undef" as an unknown but consistent value (i.e. it does
+ // not propagate undef aggressively). This means we can (and do) fail
+ // verification in cases where a transform makes a value go from "undef"
+ // to "undef+1" (say). The transform is fine, since in both cases the
+ // result is "undef", but SCEV thinks the value increased by 1.
+ return nullptr;
+ }
+
+ // Unless VerifySCEVStrict is set, we only compare constant deltas.
+ const SCEV *Delta = SE2.getMinusSCEV(Old, New);
+ if (!VerifySCEVStrict && !isa<SCEVConstant>(Delta))
+ return nullptr;
+
+ return Delta;
+ };
+
while (!LoopStack.empty()) {
auto *L = LoopStack.pop_back_val();
llvm::append_range(LoopStack, *L);
@@ -13384,16 +13402,6 @@
continue;
}
- if (containsUndefs(CurBECount) || containsUndefs(NewBECount)) {
- // SCEV treats "undef" as an unknown but consistent value (i.e. it does
- // not propagate undef aggressively). This means we can (and do) fail
- // verification in cases where a transform makes the trip count of a loop
- // go from "undef" to "undef+1" (say). The transform is fine, since in
- // both cases the loop iterates "undef" times, but SCEV thinks we
- // increased the trip count of the loop by 1 incorrectly.
- continue;
- }
-
if (SE.getTypeSizeInBits(CurBECount->getType()) >
SE.getTypeSizeInBits(NewBECount->getType()))
NewBECount = SE2.getZeroExtendExpr(NewBECount, CurBECount->getType());
@@ -13401,10 +13409,8 @@
SE.getTypeSizeInBits(NewBECount->getType()))
CurBECount = SE2.getZeroExtendExpr(CurBECount, NewBECount->getType());
- const SCEV *Delta = SE2.getMinusSCEV(CurBECount, NewBECount);
-
- // Unless VerifySCEVStrict is set, we only compare constant deltas.
- if ((VerifySCEVStrict || isa<SCEVConstant>(Delta)) && !Delta->isZero()) {
+ const SCEV *Delta = GetDelta(CurBECount, NewBECount);
+ if (Delta && !Delta->isZero()) {
dbgs() << "Trip Count for " << *L << " Changed!\n";
dbgs() << "Old: " << *CurBECount << "\n";
dbgs() << "New: " << *NewBECount << "\n";
@@ -13437,6 +13443,21 @@
<< " is in ValueExprMap but not in ExprValueMap\n";
std::abort();
}
+
+ if (auto *I = dyn_cast<Instruction>(&*KV.first)) {
+ if (!ReachableBlocks.contains(I->getParent()))
+ continue;
+ const SCEV *OldSCEV = SCM.visit(KV.second);
+ const SCEV *NewSCEV = SE2.getSCEV(I);
+ const SCEV *Delta = GetDelta(OldSCEV, NewSCEV);
+ if (Delta && !Delta->isZero()) {
+ dbgs() << "SCEV for value " << *I << " changed!\n"
+ << "Old: " << *OldSCEV << "\n"
+ << "New: " << *NewSCEV << "\n"
+ << "Delta: " << *Delta << "\n";
+ std::abort();
+ }
+ }
}
for (const auto &KV : ExprValueMap) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D121104.414026.patch
Type: text/x-patch
Size: 3370 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220309/79126380/attachment.bin>
More information about the llvm-commits
mailing list