[llvm] [SandboxVectorizer] revert New class to actually collect and manage s… (PR #113231)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 21 15:54:42 PDT 2024
https://github.com/Sterling-Augustine created https://github.com/llvm/llvm-project/pull/113231
…eeds (#112979)
This reverts commit d91318b643188bb855f115b02af9532f87c787b7.
>From 19899863127a16e2d169a40e5769102ac37b9a53 Mon Sep 17 00:00:00 2001
From: Sterling Augustine <saugustine at google.com>
Date: Mon, 21 Oct 2024 15:48:46 -0700
Subject: [PATCH] [SandboxVectorizer] revert New class to actually collect and
manage seeds (#112979)
This reverts commit d91318b643188bb855f115b02af9532f87c787b7.
---
.../SandboxVectorizer/SeedCollector.h | 27 ---
.../Vectorize/SandboxVectorizer/VecUtils.h | 30 ----
.../SandboxVectorizer/SeedCollector.cpp | 67 -------
.../SandboxVectorizer/SeedCollectorTest.cpp | 168 ------------------
4 files changed, 292 deletions(-)
delete mode 100644 llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/VecUtils.h
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h
index ed1cb8488c29eb..a4512862136a8b 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h
@@ -284,33 +284,6 @@ class SeedContainer {
#endif // NDEBUG
};
-class SeedCollector {
- SeedContainer StoreSeeds;
- SeedContainer LoadSeeds;
- Context &Ctx;
-
- /// \Returns the number of SeedBundle groups for all seed types.
- /// This is to be used for limiting compilation time.
- unsigned totalNumSeedGroups() const {
- return StoreSeeds.size() + LoadSeeds.size();
- }
-
-public:
- SeedCollector(BasicBlock *BB, ScalarEvolution &SE);
- ~SeedCollector();
-
- iterator_range<SeedContainer::iterator> getStoreSeeds() {
- return {StoreSeeds.begin(), StoreSeeds.end()};
- }
- iterator_range<SeedContainer::iterator> getLoadSeeds() {
- return {LoadSeeds.begin(), LoadSeeds.end()};
- }
-#ifndef NDEBUG
- void print(raw_ostream &OS) const;
- LLVM_DUMP_METHOD void dump() const;
-#endif
-};
-
} // namespace llvm::sandboxir
#endif // LLVM_TRANSFORMS_VECTORIZE_SANDBOXVECTORIZER_SEEDCOLLECTOR_H
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/VecUtils.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/VecUtils.h
deleted file mode 100644
index 64f57edb38484e..00000000000000
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/VecUtils.h
+++ /dev/null
@@ -1,30 +0,0 @@
-//===- VecUtils.h -----------------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// Collector for SandboxVectorizer related convenience functions that don't
-// belong in other classes.
-
-#ifndef LLVM_TRANSFORMS_VECTORIZE_SANDBOXVECTORIZER_VECUTILS_H
-#define LLVM_TRANSFORMS_VECTORIZE_SANDBOXVECTORIZER_VECUTILS_H
-
-class Utils {
-public:
- /// \Returns the number of elements in \p Ty. That is the number of lanes if a
- /// fixed vector or 1 if scalar. ScalableVectors have unknown size and
- /// therefore are unsupported.
- static int getNumElements(Type *Ty) {
- assert(!isa<ScalableVectorType>(Ty));
- return Ty->isVectorTy() ? cast<FixedVectorType>(Ty)->getNumElements() : 1;
- }
- /// Returns \p Ty if scalar or its element type if vector.
- static Type *getElementType(Type *Ty) {
- return Ty->isVectorTy() ? cast<FixedVectorType>(Ty)->getElementType() : Ty;
- }
-}
-
-#endif LLVM_TRANSFORMS_VECTORIZE_SANDBOXVECTORIZER_VECUTILS_H
diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SeedCollector.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SeedCollector.cpp
index 0d928af1902073..66fac080a7b7cc 100644
--- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SeedCollector.cpp
+++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SeedCollector.cpp
@@ -22,16 +22,6 @@ namespace llvm::sandboxir {
cl::opt<unsigned> SeedBundleSizeLimit(
"sbvec-seed-bundle-size-limit", cl::init(32), cl::Hidden,
cl::desc("Limit the size of the seed bundle to cap compilation time."));
-#define LoadSeedsDef "loads"
-#define StoreSeedsDef "stores"
-cl::opt<std::string> CollectSeeds(
- "sbvec-collect-seeds", cl::init(LoadSeedsDef "," StoreSeedsDef), cl::Hidden,
- cl::desc("Collect these seeds. Use empty for none or a comma-separated "
- "list of '" LoadSeedsDef "' and '" StoreSeedsDef "'."));
-cl::opt<unsigned> SeedGroupsLimit(
- "sbvec-seed-groups-limit", cl::init(256), cl::Hidden,
- cl::desc("Limit the number of collected seeds groups in a BB to "
- "cap compilation time."));
MutableArrayRef<Instruction *> SeedBundle::getSlice(unsigned StartIdx,
unsigned MaxVecRegBits,
@@ -141,61 +131,4 @@ void SeedContainer::print(raw_ostream &OS) const {
LLVM_DUMP_METHOD void SeedContainer::dump() const { print(dbgs()); }
#endif // NDEBUG
-template <typename LoadOrStoreT> static bool isValidMemSeed(LoadOrStoreT *LSI) {
- if (LSI->isSimple())
- return true;
- auto *Ty = Utils::getExpectedType(LSI);
- // Omit types that are architecturally unvectorizable
- if (Ty->isX86_FP80Ty() || Ty->isPPC_FP128Ty())
- return false;
- // Omit vector types without compile-time-known lane counts
- if (isa<ScalableVectorType>(Ty))
- return false;
- if (auto *VTy = dyn_cast<FixedVectorType>(Ty))
- return VectorType::isValidElementType(VTy->getElementType());
- return VectorType::isValidElementType(Ty);
-}
-
-template bool isValidMemSeed<LoadInst>(LoadInst *LSI);
-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;
- // Actually collect the seeds.
- for (auto &I : *BB) {
- if (StoreInst *SI = dyn_cast<StoreInst>(&I))
- if (CollectStores && isValidMemSeed(SI))
- StoreSeeds.insert(SI);
- if (LoadInst *LI = dyn_cast<LoadInst>(&I))
- if (CollectLoads && isValidMemSeed(LI))
- LoadSeeds.insert(LI);
- // Cap compilation time.
- if (totalNumSeedGroups() > SeedGroupsLimit)
- break;
- }
-}
-
-SeedCollector::~SeedCollector() {
- // TODO: Unregister the callback for updating the seed datastructures upon
- // instr removal
-}
-
-#ifndef NDEBUG
-void SeedCollector::print(raw_ostream &OS) const {
- OS << "=== StoreSeeds ===\n";
- StoreSeeds.print(OS);
- OS << "=== LoadSeeds ===\n";
- LoadSeeds.print(OS);
-}
-
-void SeedCollector::dump() const { print(dbgs()); }
-#endif
-
} // namespace llvm::sandboxir
diff --git a/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/SeedCollectorTest.cpp b/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/SeedCollectorTest.cpp
index 4e28413a931a61..82b230d50c4ec9 100644
--- a/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/SeedCollectorTest.cpp
+++ b/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/SeedCollectorTest.cpp
@@ -268,171 +268,3 @@ define void @foo(ptr %ptrA, float %val, ptr %ptrB) {
}
EXPECT_EQ(Cnt, 0u);
}
-
-TEST_F(SeedBundleTest, ConsecutiveStores) {
- // Where "Consecutive" means the stores address consecutive locations in
- // memory, but not in program order. Check to see that the collector puts them
- // in the proper order for vectorization.
- parseIR(C, R"IR(
-define void @foo(ptr noalias %ptr, float %val) {
-bb:
- %ptr0 = getelementptr float, ptr %ptr, i32 0
- %ptr1 = getelementptr float, ptr %ptr, i32 1
- %ptr2 = getelementptr float, ptr %ptr, i32 2
- %ptr3 = getelementptr float, ptr %ptr, i32 3
- store float %val, ptr %ptr0
- store float %val, ptr %ptr2
- store float %val, ptr %ptr1
- store float %val, ptr %ptr3
- ret void
-}
-)IR");
- Function &LLVMF = *M->getFunction("foo");
- DominatorTree DT(LLVMF);
- TargetLibraryInfoImpl TLII;
- TargetLibraryInfo TLI(TLII);
- DataLayout DL(M->getDataLayout());
- LoopInfo LI(DT);
- AssumptionCache AC(LLVMF);
- ScalarEvolution SE(LLVMF, TLI, AC, DT, LI);
-
- sandboxir::Context Ctx(C);
- auto &F = *Ctx.createFunction(&LLVMF);
- auto BB = F.begin();
- sandboxir::SeedCollector SC(&*BB, SE);
-
- // Find the stores
- auto It = std::next(BB->begin(), 4);
- // StX with X as the order by offset in memory
- auto *St0 = &*It++;
- auto *St2 = &*It++;
- auto *St1 = &*It++;
- auto *St3 = &*It++;
-
- auto StoreSeedsRange = SC.getStoreSeeds();
- auto &SB = *StoreSeedsRange.begin();
- // Expect just one vector of store seeds
- EXPECT_EQ(range_size(StoreSeedsRange), 1u);
- EXPECT_THAT(SB, testing::ElementsAre(St0, St1, St2, St3));
-}
-
-TEST_F(SeedBundleTest, StoresWithGaps) {
- parseIR(C, R"IR(
-define void @foo(ptr noalias %ptr, float %val) {
-bb:
- %ptr0 = getelementptr float, ptr %ptr, i32 0
- %ptr1 = getelementptr float, ptr %ptr, i32 3
- %ptr2 = getelementptr float, ptr %ptr, i32 5
- %ptr3 = getelementptr float, ptr %ptr, i32 7
- store float %val, ptr %ptr0
- store float %val, ptr %ptr2
- store float %val, ptr %ptr1
- store float %val, ptr %ptr3
- ret void
-}
-)IR");
- Function &LLVMF = *M->getFunction("foo");
- DominatorTree DT(LLVMF);
- TargetLibraryInfoImpl TLII;
- TargetLibraryInfo TLI(TLII);
- DataLayout DL(M->getDataLayout());
- LoopInfo LI(DT);
- AssumptionCache AC(LLVMF);
- ScalarEvolution SE(LLVMF, TLI, AC, DT, LI);
-
- sandboxir::Context Ctx(C);
- auto &F = *Ctx.createFunction(&LLVMF);
- auto BB = F.begin();
- sandboxir::SeedCollector SC(&*BB, SE);
-
- // Find the stores
- auto It = std::next(BB->begin(), 4);
- // StX with X as the order by offset in memory
- auto *St0 = &*It++;
- auto *St2 = &*It++;
- auto *St1 = &*It++;
- auto *St3 = &*It++;
-
- auto StoreSeedsRange = SC.getStoreSeeds();
- auto &SB = *StoreSeedsRange.begin();
- // Expect just one vector of store seeds
- EXPECT_EQ(range_size(StoreSeedsRange), 1u);
- EXPECT_THAT(SB, testing::ElementsAre(St0, St1, St2, St3));
-}
-
-TEST_F(SeedBundleTest, VectorStores) {
- parseIR(C, R"IR(
-define void @foo(ptr noalias %ptr, <2 x float> %val) {
-bb:
- %ptr0 = getelementptr float, ptr %ptr, i32 0
- %ptr1 = getelementptr float, ptr %ptr, i32 1
- store <2 x float> %val, ptr %ptr1
- store <2 x float> %val, ptr %ptr0
- ret void
-}
-)IR");
- Function &LLVMF = *M->getFunction("foo");
- DominatorTree DT(LLVMF);
- TargetLibraryInfoImpl TLII;
- TargetLibraryInfo TLI(TLII);
- DataLayout DL(M->getDataLayout());
- LoopInfo LI(DT);
- AssumptionCache AC(LLVMF);
- ScalarEvolution SE(LLVMF, TLI, AC, DT, LI);
-
- sandboxir::Context Ctx(C);
- auto &F = *Ctx.createFunction(&LLVMF);
- auto BB = F.begin();
- sandboxir::SeedCollector SC(&*BB, SE);
-
- // Find the stores
- auto It = std::next(BB->begin(), 2);
- // StX with X as the order by offset in memory
- auto *St1 = &*It++;
- auto *St0 = &*It++;
-
- auto StoreSeedsRange = SC.getStoreSeeds();
- EXPECT_EQ(range_size(StoreSeedsRange), 1u);
- auto &SB = *StoreSeedsRange.begin();
- EXPECT_THAT(SB, testing::ElementsAre(St0, St1));
-}
-
-TEST_F(SeedBundleTest, MixedScalarVectors) {
- parseIR(C, R"IR(
-define void @foo(ptr noalias %ptr, float %v, <2 x float> %val) {
-bb:
- %ptr0 = getelementptr float, ptr %ptr, i32 0
- %ptr1 = getelementptr float, ptr %ptr, i32 1
- %ptr3 = getelementptr float, ptr %ptr, i32 3
- store float %v, ptr %ptr0
- store float %v, ptr %ptr3
- store <2 x float> %val, ptr %ptr1
- ret void
-}
-)IR");
- Function &LLVMF = *M->getFunction("foo");
- DominatorTree DT(LLVMF);
- TargetLibraryInfoImpl TLII;
- TargetLibraryInfo TLI(TLII);
- DataLayout DL(M->getDataLayout());
- LoopInfo LI(DT);
- AssumptionCache AC(LLVMF);
- ScalarEvolution SE(LLVMF, TLI, AC, DT, LI);
-
- sandboxir::Context Ctx(C);
- auto &F = *Ctx.createFunction(&LLVMF);
- auto BB = F.begin();
- sandboxir::SeedCollector SC(&*BB, SE);
-
- // Find the stores
- auto It = std::next(BB->begin(), 3);
- // StX with X as the order by offset in memory
- auto *St0 = &*It++;
- auto *St3 = &*It++;
- auto *St1 = &*It++;
-
- auto StoreSeedsRange = SC.getStoreSeeds();
- EXPECT_EQ(range_size(StoreSeedsRange), 1u);
- auto &SB = *StoreSeedsRange.begin();
- EXPECT_THAT(SB, testing::ElementsAre(St0, St1, St3));
-}
More information about the llvm-commits
mailing list