forked from OSchip/llvm-project
[PM] Replace another Pass argument with specific analyses that are
optionally updated by MergeBlockIntoPredecessors. No functionality changed, just refactoring to clear the way for the new pass manager. llvm-svn: 226392
This commit is contained in:
parent
94209094a5
commit
b5c115357c
|
@ -25,6 +25,7 @@ namespace llvm {
|
|||
class AliasAnalysis;
|
||||
class MemoryDependenceAnalysis;
|
||||
class DominatorTree;
|
||||
class LoopInfo;
|
||||
class Instruction;
|
||||
class MDNode;
|
||||
class Pass;
|
||||
|
@ -52,7 +53,10 @@ bool DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI = nullptr);
|
|||
|
||||
/// MergeBlockIntoPredecessor - Attempts to merge a block into its predecessor,
|
||||
/// if possible. The return value indicates success or failure.
|
||||
bool MergeBlockIntoPredecessor(BasicBlock *BB, Pass *P = nullptr);
|
||||
bool MergeBlockIntoPredecessor(BasicBlock *BB, DominatorTree *DT = nullptr,
|
||||
LoopInfo *LI = nullptr,
|
||||
AliasAnalysis *AA = nullptr,
|
||||
MemoryDependenceAnalysis *MemDep = nullptr);
|
||||
|
||||
// ReplaceInstWithValue - Replace all uses of an instruction (specified by BI)
|
||||
// with a value, then remove and delete the original instruction.
|
||||
|
|
|
@ -2363,7 +2363,8 @@ bool GVN::runOnFunction(Function& F) {
|
|||
for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ) {
|
||||
BasicBlock *BB = FI++;
|
||||
|
||||
bool removedBlock = MergeBlockIntoPredecessor(BB, this);
|
||||
bool removedBlock = MergeBlockIntoPredecessor(
|
||||
BB, DT, /* LoopInfo */ nullptr, VN.getAliasAnalysis(), MD);
|
||||
if (removedBlock) ++NumGVNBlocks;
|
||||
|
||||
Changed |= removedBlock;
|
||||
|
|
|
@ -593,7 +593,7 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
|
|||
// the OrigHeader block into OrigLatch. This will succeed if they are
|
||||
// connected by an unconditional branch. This is just a cleanup so the
|
||||
// emitted code isn't too gross in this common case.
|
||||
MergeBlockIntoPredecessor(OrigHeader, this);
|
||||
MergeBlockIntoPredecessor(OrigHeader, DT, LI);
|
||||
|
||||
DEBUG(dbgs() << "LoopRotation: into "; L->dump());
|
||||
|
||||
|
|
|
@ -107,7 +107,9 @@ bool llvm::DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI) {
|
|||
|
||||
/// MergeBlockIntoPredecessor - Attempts to merge a block into its predecessor,
|
||||
/// if possible. The return value indicates success or failure.
|
||||
bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, Pass *P) {
|
||||
bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DominatorTree *DT,
|
||||
LoopInfo *LI, AliasAnalysis *AA,
|
||||
MemoryDependenceAnalysis *MemDep) {
|
||||
// Don't merge away blocks who have their address taken.
|
||||
if (BB->hasAddressTaken()) return false;
|
||||
|
||||
|
@ -142,11 +144,8 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, Pass *P) {
|
|||
}
|
||||
|
||||
// Begin by getting rid of unneeded PHIs.
|
||||
if (isa<PHINode>(BB->front())) {
|
||||
auto *AA = P ? P->getAnalysisIfAvailable<AliasAnalysis>() : nullptr;
|
||||
auto *MemDep = P ? P->getAnalysisIfAvailable<MemoryDependenceAnalysis>() : nullptr;
|
||||
if (isa<PHINode>(BB->front()))
|
||||
FoldSingleEntryPHINodes(BB, AA, MemDep);
|
||||
}
|
||||
|
||||
// Delete the unconditional branch from the predecessor...
|
||||
PredBB->getInstList().pop_back();
|
||||
|
@ -163,28 +162,23 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, Pass *P) {
|
|||
PredBB->takeName(BB);
|
||||
|
||||
// Finally, erase the old block and update dominator info.
|
||||
if (P) {
|
||||
if (DominatorTreeWrapperPass *DTWP =
|
||||
P->getAnalysisIfAvailable<DominatorTreeWrapperPass>()) {
|
||||
DominatorTree &DT = DTWP->getDomTree();
|
||||
if (DomTreeNode *DTN = DT.getNode(BB)) {
|
||||
DomTreeNode *PredDTN = DT.getNode(PredBB);
|
||||
SmallVector<DomTreeNode*, 8> Children(DTN->begin(), DTN->end());
|
||||
for (SmallVectorImpl<DomTreeNode *>::iterator DI = Children.begin(),
|
||||
DE = Children.end(); DI != DE; ++DI)
|
||||
DT.changeImmediateDominator(*DI, PredDTN);
|
||||
if (DT)
|
||||
if (DomTreeNode *DTN = DT->getNode(BB)) {
|
||||
DomTreeNode *PredDTN = DT->getNode(PredBB);
|
||||
SmallVector<DomTreeNode *, 8> Children(DTN->begin(), DTN->end());
|
||||
for (SmallVectorImpl<DomTreeNode *>::iterator DI = Children.begin(),
|
||||
DE = Children.end();
|
||||
DI != DE; ++DI)
|
||||
DT->changeImmediateDominator(*DI, PredDTN);
|
||||
|
||||
DT.eraseNode(BB);
|
||||
}
|
||||
|
||||
if (auto *LIWP = P->getAnalysisIfAvailable<LoopInfoWrapperPass>())
|
||||
LIWP->getLoopInfo().removeBlock(BB);
|
||||
|
||||
if (MemoryDependenceAnalysis *MD =
|
||||
P->getAnalysisIfAvailable<MemoryDependenceAnalysis>())
|
||||
MD->invalidateCachedPredecessors();
|
||||
DT->eraseNode(BB);
|
||||
}
|
||||
}
|
||||
|
||||
if (LI)
|
||||
LI->removeBlock(BB);
|
||||
|
||||
if (MemDep)
|
||||
MemDep->invalidateCachedPredecessors();
|
||||
|
||||
BB->eraseFromParent();
|
||||
return true;
|
||||
|
|
Loading…
Reference in New Issue