|
@@ -44,15 +44,15 @@ MemoryAccess *MemorySSAUpdater::getPreviousDefRecursive(
|
|
// First, do a cache lookup. Without this cache, certain CFG structures
|
|
// First, do a cache lookup. Without this cache, certain CFG structures
|
|
// (like a series of if statements) take exponential time to visit.
|
|
// (like a series of if statements) take exponential time to visit.
|
|
auto Cached = CachedPreviousDef.find(BB);
|
|
auto Cached = CachedPreviousDef.find(BB);
|
|
- if (Cached != CachedPreviousDef.end()) {
|
|
|
|
|
|
+ if (Cached != CachedPreviousDef.end())
|
|
return Cached->second;
|
|
return Cached->second;
|
|
- }
|
|
|
|
|
|
|
|
// If this method is called from an unreachable block, return LoE.
|
|
// If this method is called from an unreachable block, return LoE.
|
|
if (!MSSA->DT->isReachableFromEntry(BB))
|
|
if (!MSSA->DT->isReachableFromEntry(BB))
|
|
return MSSA->getLiveOnEntryDef();
|
|
return MSSA->getLiveOnEntryDef();
|
|
|
|
|
|
- if (BasicBlock *Pred = BB->getSinglePredecessor()) {
|
|
|
|
|
|
+ if (BasicBlock *Pred = BB->getUniquePredecessor()) {
|
|
|
|
+ VisitedBlocks.insert(BB);
|
|
// Single predecessor case, just recurse, we can only have one definition.
|
|
// Single predecessor case, just recurse, we can only have one definition.
|
|
MemoryAccess *Result = getPreviousDefFromEnd(Pred, CachedPreviousDef);
|
|
MemoryAccess *Result = getPreviousDefFromEnd(Pred, CachedPreviousDef);
|
|
CachedPreviousDef.insert({BB, Result});
|
|
CachedPreviousDef.insert({BB, Result});
|
|
@@ -96,9 +96,15 @@ MemoryAccess *MemorySSAUpdater::getPreviousDefRecursive(
|
|
// See if we can avoid the phi by simplifying it.
|
|
// See if we can avoid the phi by simplifying it.
|
|
auto *Result = tryRemoveTrivialPhi(Phi, PhiOps);
|
|
auto *Result = tryRemoveTrivialPhi(Phi, PhiOps);
|
|
// If we couldn't simplify, we may have to create a phi
|
|
// If we couldn't simplify, we may have to create a phi
|
|
- if (Result == Phi && UniqueIncomingAccess && SingleAccess)
|
|
|
|
|
|
+ if (Result == Phi && UniqueIncomingAccess && SingleAccess) {
|
|
|
|
+ // A concrete Phi only exists if we created an empty one to break a cycle.
|
|
|
|
+ if (Phi) {
|
|
|
|
+ assert(Phi->operands().empty() && "Expected empty Phi");
|
|
|
|
+ Phi->replaceAllUsesWith(SingleAccess);
|
|
|
|
+ removeMemoryAccess(Phi);
|
|
|
|
+ }
|
|
Result = SingleAccess;
|
|
Result = SingleAccess;
|
|
- else if (Result == Phi && !(UniqueIncomingAccess && SingleAccess)) {
|
|
|
|
|
|
+ } else if (Result == Phi && !(UniqueIncomingAccess && SingleAccess)) {
|
|
if (!Phi)
|
|
if (!Phi)
|
|
Phi = MSSA->createMemoryPhi(BB);
|
|
Phi = MSSA->createMemoryPhi(BB);
|
|
|
|
|
|
@@ -237,6 +243,7 @@ MemoryAccess *MemorySSAUpdater::tryRemoveTrivialPhi(MemoryPhi *Phi,
|
|
void MemorySSAUpdater::insertUse(MemoryUse *MU, bool RenameUses) {
|
|
void MemorySSAUpdater::insertUse(MemoryUse *MU, bool RenameUses) {
|
|
InsertedPHIs.clear();
|
|
InsertedPHIs.clear();
|
|
MU->setDefiningAccess(getPreviousDef(MU));
|
|
MU->setDefiningAccess(getPreviousDef(MU));
|
|
|
|
+
|
|
// In cases without unreachable blocks, because uses do not create new
|
|
// In cases without unreachable blocks, because uses do not create new
|
|
// may-defs, there are only two cases:
|
|
// may-defs, there are only two cases:
|
|
// 1. There was a def already below us, and therefore, we should not have
|
|
// 1. There was a def already below us, and therefore, we should not have
|