[llvm] [SandboxVectorizer] New class to actually collect and manage seeds (PR #112979)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 21 10:57:02 PDT 2024
================
@@ -268,3 +268,171 @@ 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_TRUE(std::next(StoreSeedsRange.begin()) == StoreSeedsRange.end());
+ 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
----------------
vporpo wrote:
So if I understand correctly if there are four stores to addresses A[0],A[1] they will end up in the same bundle. We will eventually need some way to access them separately. This won't be a legality issue though.
https://github.com/llvm/llvm-project/pull/112979
More information about the llvm-commits
mailing list