[llvm] [NFC] [DSE] Refactor DSE (PR #100956)
Haopeng Liu via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 19 10:17:15 PDT 2024
================
@@ -806,6 +806,38 @@ bool canSkipDef(MemoryDef *D, bool DefVisibleToCaller) {
return false;
}
+// A memory location wrapper that represents a MemoryLocation, `MemLoc`,
+// defined by `MemDef`.
+class MemoryLocationWrapper {
+public:
+ MemoryLocationWrapper(MemoryLocation MemLoc, MemoryDef *MemDef)
+ : MemLoc(MemLoc), MemDef(MemDef) {
+ assert(MemLoc.Ptr && "MemLoc should be not null");
+ UnderlyingObject = getUnderlyingObject(MemLoc.Ptr);
+ DefInst = MemDef->getMemoryInst();
+ }
+
+ MemoryAccess *GetDefiningAccess() const {
+ return MemDef->getDefiningAccess();
+ }
+
+ MemoryLocation MemLoc;
+ const Value *UnderlyingObject;
+ MemoryDef *MemDef;
+ Instruction *DefInst;
+};
+
+// A memory def wrapper that represents a MemoryDef and the MemoryLocation(s)
+// defined by this MemoryDef.
+class MemoryDefWrapper {
+public:
+ MemoryDefWrapper(MemoryDef *MemDef, std::optional<MemoryLocation> MemLoc) {
+ if (MemLoc.has_value())
+ DefinedLocation = MemoryLocationWrapper(*MemLoc, MemDef);
+ }
+ std::optional<MemoryLocationWrapper> DefinedLocation = std::nullopt;
----------------
haopliu wrote:
Yes, this will become a SmallVector of `MemoryLocationWrapper` and all have the same MemoryDef and DefInst.
Initially, I bundled them in `MemoryDefWrapper` but I realized that most accesses are through `MemoryLocationWrapper` in `getDomMemoryDef`. It seems that we should either bundle in `MemoryLocationWrapper` or keep a `MemoryDefWrapper` reference in each `MemoryLocationWrapper`. What do you think?
https://github.com/llvm/llvm-project/pull/100956
More information about the llvm-commits
mailing list