[llvm] [SandboxVectorizer] Register erase callback for seed collection (PR #115951)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 12 14:36:22 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: None (Sterling-Augustine)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/115951.diff
3 Files Affected:
- (modified) llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h (+6-1)
- (modified) llvm/lib/Transforms/Vectorize/SandboxVectorizer/SeedCollector.cpp (+9-4)
- (modified) llvm/unittests/Transforms/Vectorize/SandboxVectorizer/SeedCollectorTest.cpp (+15)
``````````diff
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h
index ed1cb8488c29eb..958ec673b60164 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h
@@ -223,6 +223,11 @@ class SeedContainer {
/// Note that the bundles themselves may have additional ordering, created
/// by the subclasses by insertAt. The bundles themselves may also have used
/// instructions.
+
+ // TODO: Range_size counts fully used-bundles. Further, iterating over
+ // anything other than the Bundles in a SeedContainer includes used seeds,
+ // so for now just check that removing all the seeds from a bundle also
+ // empties the bundle. Rework the iterator logic to clean this up.
iterator(BundleMapT &Map, BundleMapT::iterator MapIt, ValT *Vec, int VecIdx)
: Map(&Map), MapIt(MapIt), Vec(Vec), VecIdx(VecIdx) {}
value_type &operator*() {
@@ -288,7 +293,7 @@ class SeedCollector {
SeedContainer StoreSeeds;
SeedContainer LoadSeeds;
Context &Ctx;
-
+ Context::CallbackID EraseCallbackID;
/// \Returns the number of SeedBundle groups for all seed types.
/// This is to be used for limiting compilation time.
unsigned totalNumSeedGroups() const {
diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SeedCollector.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SeedCollector.cpp
index 1dbdd80117563c..17544afcc185fd 100644
--- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SeedCollector.cpp
+++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SeedCollector.cpp
@@ -159,13 +159,19 @@ template bool isValidMemSeed<StoreInst>(StoreInst *LSI);
SeedCollector::SeedCollector(BasicBlock *BB, ScalarEvolution &SE)
: StoreSeeds(SE), LoadSeeds(SE), Ctx(BB->getContext()) {
- // TODO: Register a callback for updating the Collector data structures upon
- // instr removal
bool CollectStores = CollectSeeds.find(StoreSeedsDef) != std::string::npos;
bool CollectLoads = CollectSeeds.find(LoadSeedsDef) != std::string::npos;
if (!CollectStores && !CollectLoads)
return;
+
+ EraseCallbackID = Ctx.registerEraseInstrCallback([this](Instruction *I) {
+ if (auto SI = dyn_cast<StoreInst>(I))
+ StoreSeeds.erase(SI);
+ else if (auto LI = dyn_cast<LoadInst>(I))
+ LoadSeeds.erase(LI);
+ });
+
// Actually collect the seeds.
for (auto &I : *BB) {
if (StoreInst *SI = dyn_cast<StoreInst>(&I))
@@ -181,8 +187,7 @@ SeedCollector::SeedCollector(BasicBlock *BB, ScalarEvolution &SE)
}
SeedCollector::~SeedCollector() {
- // TODO: Unregister the callback for updating the seed datastructures upon
- // instr removal
+ Ctx.unregisterEraseInstrCallback(EraseCallbackID);
}
#ifndef NDEBUG
diff --git a/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/SeedCollectorTest.cpp b/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/SeedCollectorTest.cpp
index b1b0156a4fe31a..4fc44f9fddc9a8 100644
--- a/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/SeedCollectorTest.cpp
+++ b/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/SeedCollectorTest.cpp
@@ -374,6 +374,21 @@ define void @foo(ptr noalias %ptr, float %val) {
// Expect just one vector of store seeds
EXPECT_EQ(range_size(StoreSeedsRange), 1u);
ExpectThatElementsAre(SB, {St0, St1, St2, St3});
+ // Check that the EraseInstr callback works. TODO: Range_size counts fully
+ // used-bundles even though the iterator skips them. Further, iterating over
+ // anything other than the Bundles in a SeedContainer includes used seeds. So
+ // for now just check that removing all the seeds from a bundle also empties
+ // the bundle.
+ St0->eraseFromParent();
+ St1->eraseFromParent();
+ St2->eraseFromParent();
+ St3->eraseFromParent();
+ size_t nonEmptyBundleCount = 0;
+ for (auto &B : SC.getStoreSeeds()) {
+ (void)B;
+ nonEmptyBundleCount++;
+ }
+ EXPECT_EQ(nonEmptyBundleCount, 0u);
}
TEST_F(SeedBundleTest, VectorStores) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/115951
More information about the llvm-commits
mailing list