[llvm] [DeadStoreElimination] Refactor out `pushMemUses`; drop dead check (NFC) (PR #98530)
Antonio Frighetto via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 11 13:07:19 PDT 2024
https://github.com/antoniofrighetto updated https://github.com/llvm/llvm-project/pull/98530
>From 4462c9a6d005755e9932e180b542776c3b871117 Mon Sep 17 00:00:00 2001
From: Antonio Frighetto <me at antoniofrighetto.com>
Date: Thu, 11 Jul 2024 21:43:04 +0200
Subject: [PATCH 1/2] [DeadStoreElimination] Refactor out `pushMemUses`; drop
dead check (NFC)
---
.../Scalar/DeadStoreElimination.cpp | 54 +++++++++----------
1 file changed, 27 insertions(+), 27 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
index 5457f6c13174d..f112860a683a8 100644
--- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
@@ -902,6 +902,16 @@ struct DSEState {
});
}
+ static void pushMemUses(MemoryAccess *Acc,
+ SmallVectorImpl<MemoryAccess *> &WorkList,
+ SmallPtrSetImpl<MemoryAccess *> &Visited) {
+ for (Use &U : Acc->uses()) {
+ auto *MA = cast<MemoryAccess>(U.getUser());
+ if (Visited.insert(MA).second)
+ WorkList.push_back(MA);
+ }
+ };
+
LocationSize strengthenLocationSize(const Instruction *I,
LocationSize Size) const {
if (auto *CB = dyn_cast<CallBase>(I)) {
@@ -1162,21 +1172,11 @@ struct DSEState {
<< *Def->getMemoryInst()
<< ") is at the end the function \n");
- auto MaybeLoc = getLocForWrite(Def->getMemoryInst());
- if (!MaybeLoc) {
- LLVM_DEBUG(dbgs() << " ... could not get location for write.\n");
- return false;
- }
-
+ MemoryLocation DefLoc = *getLocForWrite(Def->getMemoryInst());
SmallVector<MemoryAccess *, 4> WorkList;
SmallPtrSet<MemoryAccess *, 8> Visited;
- auto PushMemUses = [&WorkList, &Visited](MemoryAccess *Acc) {
- if (!Visited.insert(Acc).second)
- return;
- for (Use &U : Acc->uses())
- WorkList.push_back(cast<MemoryAccess>(U.getUser()));
- };
- PushMemUses(Def);
+
+ pushMemUses(Def, WorkList, Visited);
for (unsigned I = 0; I < WorkList.size(); I++) {
if (WorkList.size() >= MemorySSAScanLimit) {
LLVM_DEBUG(dbgs() << " ... hit exploration limit.\n");
@@ -1188,22 +1188,22 @@ struct DSEState {
// AliasAnalysis does not account for loops. Limit elimination to
// candidates for which we can guarantee they always store to the same
// memory location.
- if (!isGuaranteedLoopInvariant(MaybeLoc->Ptr))
+ if (!isGuaranteedLoopInvariant(DefLoc.Ptr))
return false;
- PushMemUses(cast<MemoryPhi>(UseAccess));
+ pushMemUses(cast<MemoryPhi>(UseAccess), WorkList, Visited);
continue;
}
// TODO: Checking for aliasing is expensive. Consider reducing the amount
// of times this is called and/or caching it.
Instruction *UseInst = cast<MemoryUseOrDef>(UseAccess)->getMemoryInst();
- if (isReadClobber(*MaybeLoc, UseInst)) {
+ if (isReadClobber(DefLoc, UseInst)) {
LLVM_DEBUG(dbgs() << " ... hit read clobber " << *UseInst << ".\n");
return false;
}
if (MemoryDef *UseDef = dyn_cast<MemoryDef>(UseAccess))
- PushMemUses(UseDef);
+ pushMemUses(UseDef, WorkList, Visited);
}
return true;
}
@@ -1505,12 +1505,9 @@ struct DSEState {
LLVM_DEBUG(dbgs() << " Checking for reads of " << *MaybeDeadAccess << " ("
<< *MaybeDeadI << ")\n");
- SmallSetVector<MemoryAccess *, 32> WorkList;
- auto PushMemUses = [&WorkList](MemoryAccess *Acc) {
- for (Use &U : Acc->uses())
- WorkList.insert(cast<MemoryAccess>(U.getUser()));
- };
- PushMemUses(MaybeDeadAccess);
+ SmallVector<MemoryAccess *, 32> WorkList;
+ SmallPtrSet<MemoryAccess *, 32> Visited;
+ pushMemUses(MaybeDeadAccess, WorkList, Visited);
// Check if DeadDef may be read.
for (unsigned I = 0; I < WorkList.size(); I++) {
@@ -1534,7 +1531,7 @@ struct DSEState {
continue;
}
LLVM_DEBUG(dbgs() << "\n ... adding PHI uses\n");
- PushMemUses(UseAccess);
+ pushMemUses(UseAccess, WorkList, Visited);
continue;
}
@@ -1559,7 +1556,7 @@ struct DSEState {
if (isNoopIntrinsic(cast<MemoryUseOrDef>(UseAccess)->getMemoryInst())) {
LLVM_DEBUG(dbgs() << " ... adding uses of intrinsic\n");
- PushMemUses(UseAccess);
+ pushMemUses(UseAccess, WorkList, Visited);
continue;
}
@@ -1618,7 +1615,7 @@ struct DSEState {
return std::nullopt;
}
} else
- PushMemUses(UseDef);
+ pushMemUses(UseDef, WorkList, Visited);
}
}
@@ -1821,8 +1818,11 @@ struct DSEState {
Instruction *DefI = Def->getMemoryInst();
auto DefLoc = getLocForWrite(DefI);
- if (!DefLoc || !isRemovable(DefI))
+ if (!DefLoc || !isRemovable(DefI)) {
+ LLVM_DEBUG(dbgs() << " ... could not get location for write or "
+ "instruction not removable.\n");
continue;
+ }
// NOTE: Currently eliminating writes at the end of a function is
// limited to MemoryDefs with a single underlying object, to save
>From eb65c5998ee47aa0c553b961d87add1b48064276 Mon Sep 17 00:00:00 2001
From: Antonio Frighetto <me at antoniofrighetto.com>
Date: Thu, 11 Jul 2024 22:06:21 +0200
Subject: [PATCH 2/2] !fixup pass in solved std::optional
---
llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
index f112860a683a8..3d67172513473 100644
--- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
@@ -1167,12 +1167,10 @@ struct DSEState {
}
/// Returns true if \p Def is not read before returning from the function.
- bool isWriteAtEndOfFunction(MemoryDef *Def) {
+ bool isWriteAtEndOfFunction(MemoryDef *Def, MemoryLocation DefLoc) {
LLVM_DEBUG(dbgs() << " Check if def " << *Def << " ("
<< *Def->getMemoryInst()
<< ") is at the end the function \n");
-
- MemoryLocation DefLoc = *getLocForWrite(Def->getMemoryInst());
SmallVector<MemoryAccess *, 4> WorkList;
SmallPtrSet<MemoryAccess *, 8> Visited;
@@ -1833,7 +1831,7 @@ struct DSEState {
if (!isInvisibleToCallerAfterRet(UO))
continue;
- if (isWriteAtEndOfFunction(Def)) {
+ if (isWriteAtEndOfFunction(Def, *DefLoc)) {
// See through pointer-to-pointer bitcasts
LLVM_DEBUG(dbgs() << " ... MemoryDef is not accessed until the end "
"of the function\n");
More information about the llvm-commits
mailing list