mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[MemorySSA] Extend removeMemoryAccess API to optimize MemoryPhis.
Summary: EarlyCSE needs to optimize MemoryPhis after an access is removed and has special handling for it. This should be handled by MemorySSA instead. The default remains that MemoryPhis are *not* optimized after an access is removed. Reviewers: george.burgess.iv Subscribers: sanjoy, jlebar, llvm-commits, Prazek Differential Revision: https://reviews.llvm.org/D57199 llvm-svn: 352787
This commit is contained in:
parent
ec1c381c57
commit
413877fd20
@ -221,14 +221,14 @@ public:
|
||||
/// associated with it is erased from the program. For example, if a store or
|
||||
/// load is simply erased (not replaced), removeMemoryAccess should be called
|
||||
/// on the MemoryAccess for that store/load.
|
||||
void removeMemoryAccess(MemoryAccess *);
|
||||
void removeMemoryAccess(MemoryAccess *, bool OptimizePhis = false);
|
||||
|
||||
/// Remove MemoryAccess for a given instruction, if a MemoryAccess exists.
|
||||
/// This should be called when an instruction (load/store) is deleted from
|
||||
/// the program.
|
||||
void removeMemoryAccess(const Instruction *I) {
|
||||
void removeMemoryAccess(const Instruction *I, bool OptimizePhis = false) {
|
||||
if (MemoryAccess *MA = MSSA->getMemoryAccess(I))
|
||||
removeMemoryAccess(MA);
|
||||
removeMemoryAccess(MA, OptimizePhis);
|
||||
}
|
||||
|
||||
/// Remove all MemoryAcceses in a set of BasicBlocks about to be deleted.
|
||||
|
@ -1051,7 +1051,7 @@ void MemorySSAUpdater::wireOldPredecessorsToNewImmediatePredecessor(
|
||||
}
|
||||
}
|
||||
|
||||
void MemorySSAUpdater::removeMemoryAccess(MemoryAccess *MA) {
|
||||
void MemorySSAUpdater::removeMemoryAccess(MemoryAccess *MA, bool OptimizePhis) {
|
||||
assert(!MSSA->isLiveOnEntryDef(MA) &&
|
||||
"Trying to remove the live on entry def");
|
||||
// We can only delete phi nodes if they have no uses, or we can replace all
|
||||
@ -1070,6 +1070,8 @@ void MemorySSAUpdater::removeMemoryAccess(MemoryAccess *MA) {
|
||||
NewDefTarget = cast<MemoryUseOrDef>(MA)->getDefiningAccess();
|
||||
}
|
||||
|
||||
SmallSetVector<MemoryPhi *, 4> PhisToCheck;
|
||||
|
||||
// Re-point the uses at our defining access
|
||||
if (!isa<MemoryUse>(MA) && !MA->use_empty()) {
|
||||
// Reset optimized on users of this store, and reset the uses.
|
||||
@ -1089,6 +1091,9 @@ void MemorySSAUpdater::removeMemoryAccess(MemoryAccess *MA) {
|
||||
Use &U = *MA->use_begin();
|
||||
if (auto *MUD = dyn_cast<MemoryUseOrDef>(U.getUser()))
|
||||
MUD->resetOptimized();
|
||||
if (OptimizePhis)
|
||||
if (MemoryPhi *MP = dyn_cast<MemoryPhi>(U.getUser()))
|
||||
PhisToCheck.insert(MP);
|
||||
U.set(NewDefTarget);
|
||||
}
|
||||
}
|
||||
@ -1097,6 +1102,21 @@ void MemorySSAUpdater::removeMemoryAccess(MemoryAccess *MA) {
|
||||
// are doing things here
|
||||
MSSA->removeFromLookups(MA);
|
||||
MSSA->removeFromLists(MA);
|
||||
|
||||
// Optionally optimize Phi uses. This will recursively remove trivial phis.
|
||||
if (!PhisToCheck.empty()) {
|
||||
SmallVector<WeakVH, 16> PhisToOptimize{PhisToCheck.begin(),
|
||||
PhisToCheck.end()};
|
||||
PhisToCheck.clear();
|
||||
|
||||
unsigned PhisSize = PhisToOptimize.size();
|
||||
while (PhisSize-- > 0)
|
||||
if (MemoryPhi *MP =
|
||||
cast_or_null<MemoryPhi>(PhisToOptimize.pop_back_val())) {
|
||||
auto OperRange = MP->operands();
|
||||
tryRemoveTrivialPhi(MP, OperRange);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MemorySSAUpdater::removeBlocks(
|
||||
|
Loading…
Reference in New Issue
Block a user