diff options
author | Florian Hahn <flo@fhahn.com> | 2024-02-28 16:27:56 +0000 |
---|---|---|
committer | Florian Hahn <flo@fhahn.com> | 2024-02-28 16:31:49 +0000 |
commit | 3fac0562f8bdf193f039945eb40c51a5e6c24de1 (patch) | |
tree | 9f85292aca13801e65e9994ca5ddf7dadc4523d2 | |
parent | 4623c114fb51e48b5cbb352adecb60d76077cb0a (diff) | |
download | llvm-3fac0562f8bdf193f039945eb40c51a5e6c24de1.zip llvm-3fac0562f8bdf193f039945eb40c51a5e6c24de1.tar.gz llvm-3fac0562f8bdf193f039945eb40c51a5e6c24de1.tar.bz2 |
[VPlan] Reset trip count when replacing ExpandSCEV recipe.
Otherwise accessing the trip count may accesses freed memory.
Fixes https://lab.llvm.org/buildbot/#/builders/74/builds/26239 and
others.
-rw-r--r-- | llvm/lib/Transforms/Vectorize/LoopVectorize.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Transforms/Vectorize/VPlan.h | 8 |
2 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index 6b169232..ea77b60 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -10093,6 +10093,8 @@ bool LoopVectorizePass::processLoop(Loop *L) { auto *ExpandedVal = BestEpiPlan.getVPValueOrAddLiveIn( ExpandedSCEVs.find(ExpandR->getSCEV())->second); ExpandR->replaceAllUsesWith(ExpandedVal); + if (BestEpiPlan.getTripCount() == ExpandR) + BestEpiPlan.resetTripCount(ExpandedVal); ExpandR->eraseFromParent(); } diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h index 47cebec..16c09a8 100644 --- a/llvm/lib/Transforms/Vectorize/VPlan.h +++ b/llvm/lib/Transforms/Vectorize/VPlan.h @@ -2931,6 +2931,14 @@ public: return TripCount; } + /// Resets the trip count for the VPlan. The caller must make sure all uses of + /// the original trip count have been replaced. + void resetTripCount(VPValue *NewTripCount) { + assert(TripCount && NewTripCount && TripCount->getNumUsers() == 0 && + "TripCount always must be set"); + TripCount = NewTripCount; + } + /// The backedge taken count of the original loop. VPValue *getOrCreateBackedgeTakenCount() { if (!BackedgeTakenCount) |