[llvm] r340461 - [MemorySSA] Invalidate optimized Defs upon moving them; NFC
George Burgess IV via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 22 15:34:38 PDT 2018
Author: gbiv
Date: Wed Aug 22 15:34:38 2018
New Revision: 340461
URL: http://llvm.org/viewvc/llvm-project?rev=340461&view=rev
Log:
[MemorySSA] Invalidate optimized Defs upon moving them; NFC
We're currently getting this behavior implicitly, since we determine if
a Def's optimization is valid based on the ID of its defining access.
This is incorrect, though I wouldn't be surprised if this was masked in
part by that we're using a WeakVH to track what Defs are optimized to.
(Not to mention that we don't move Defs super often, AFAICT). I'll
submit a patch to fix this shortly.
This also includes a minor refactor to reduce duplication a bit.
No test is included, since like said, this already happens to be our
behavior. I'll add a test for this with my fix to the other bug
mentioned above.
Modified:
llvm/trunk/include/llvm/Analysis/MemorySSA.h
llvm/trunk/lib/Analysis/MemorySSA.cpp
Modified: llvm/trunk/include/llvm/Analysis/MemorySSA.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/MemorySSA.h?rev=340461&r1=340460&r2=340461&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/MemorySSA.h (original)
+++ llvm/trunk/include/llvm/Analysis/MemorySSA.h Wed Aug 22 15:34:38 2018
@@ -811,6 +811,7 @@ private:
void buildMemorySSA();
void optimizeUses();
+ void prepareForMoveTo(MemoryAccess *, BasicBlock *);
void verifyUseInDefs(MemoryAccess *, MemoryAccess *) const;
using AccessMap = DenseMap<const BasicBlock *, std::unique_ptr<AccessList>>;
Modified: llvm/trunk/lib/Analysis/MemorySSA.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemorySSA.cpp?rev=340461&r1=340460&r2=340461&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/MemorySSA.cpp (original)
+++ llvm/trunk/lib/Analysis/MemorySSA.cpp Wed Aug 22 15:34:38 2018
@@ -1472,15 +1472,25 @@ void MemorySSA::insertIntoListsBefore(Me
BlockNumberingValid.erase(BB);
}
+void MemorySSA::prepareForMoveTo(MemoryAccess *What, BasicBlock *BB) {
+ // Keep it in the lookup tables, remove from the lists
+ removeFromLists(What, false);
+
+ // Note that moving should implicitly invalidate the optimized state of a
+ // MemoryUse (and Phis can't be optimized). However, it doesn't do so for a
+ // MemoryDef.
+ if (auto *MD = dyn_cast<MemoryDef>(What))
+ MD->resetOptimized();
+ What->setBlock(BB);
+}
+
// Move What before Where in the IR. The end result is that What will belong to
// the right lists and have the right Block set, but will not otherwise be
// correct. It will not have the right defining access, and if it is a def,
// things below it will not properly be updated.
void MemorySSA::moveTo(MemoryUseOrDef *What, BasicBlock *BB,
AccessList::iterator Where) {
- // Keep it in the lookup tables, remove from the lists
- removeFromLists(What, false);
- What->setBlock(BB);
+ prepareForMoveTo(What, BB);
insertIntoListsBefore(What, BB, Where);
}
@@ -1496,8 +1506,7 @@ void MemorySSA::moveTo(MemoryAccess *Wha
assert(Inserted && "Cannot move a Phi to a block that already has one");
}
- removeFromLists(What, false);
- What->setBlock(BB);
+ prepareForMoveTo(What, BB);
insertIntoListsForBlock(What, BB, Point);
}
More information about the llvm-commits
mailing list