mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-28 15:33:16 +00:00
Remove code for updating dominance frontiers and some outdated references to
dominance and post-dominance frontiers. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123725 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b1686c32fc
commit
301278719b
@ -69,10 +69,7 @@ namespace {
|
|||||||
bool handleEndBlock(BasicBlock &BB);
|
bool handleEndBlock(BasicBlock &BB);
|
||||||
void RemoveAccessedObjects(const AliasAnalysis::Location &LoadedLoc,
|
void RemoveAccessedObjects(const AliasAnalysis::Location &LoadedLoc,
|
||||||
SmallPtrSet<Value*, 16> &DeadStackObjects);
|
SmallPtrSet<Value*, 16> &DeadStackObjects);
|
||||||
|
|
||||||
|
|
||||||
// getAnalysisUsage - We require post dominance frontiers (aka Control
|
|
||||||
// Dependence Graph)
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTree>();
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
#define DEBUG_TYPE "loop-delete"
|
#define DEBUG_TYPE "loop-delete"
|
||||||
#include "llvm/Transforms/Scalar.h"
|
#include "llvm/Transforms/Scalar.h"
|
||||||
#include "llvm/Analysis/LoopPass.h"
|
#include "llvm/Analysis/LoopPass.h"
|
||||||
#include "llvm/Analysis/DominanceFrontier.h"
|
#include "llvm/Analysis/Dominators.h"
|
||||||
#include "llvm/Analysis/ScalarEvolution.h"
|
#include "llvm/Analysis/ScalarEvolution.h"
|
||||||
#include "llvm/ADT/Statistic.h"
|
#include "llvm/ADT/Statistic.h"
|
||||||
#include "llvm/ADT/SmallVector.h"
|
#include "llvm/ADT/SmallVector.h"
|
||||||
@ -52,7 +52,6 @@ namespace {
|
|||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
AU.addPreservedID(LoopSimplifyID);
|
AU.addPreservedID(LoopSimplifyID);
|
||||||
AU.addPreservedID(LCSSAID);
|
AU.addPreservedID(LCSSAID);
|
||||||
AU.addPreserved<DominanceFrontier>();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -193,7 +192,6 @@ bool LoopDeletion::runOnLoop(Loop* L, LPPassManager& LPM) {
|
|||||||
// Update the dominator tree and remove the instructions and blocks that will
|
// Update the dominator tree and remove the instructions and blocks that will
|
||||||
// be deleted from the reference counting scheme.
|
// be deleted from the reference counting scheme.
|
||||||
DominatorTree& DT = getAnalysis<DominatorTree>();
|
DominatorTree& DT = getAnalysis<DominatorTree>();
|
||||||
DominanceFrontier* DF = getAnalysisIfAvailable<DominanceFrontier>();
|
|
||||||
SmallVector<DomTreeNode*, 8> ChildNodes;
|
SmallVector<DomTreeNode*, 8> ChildNodes;
|
||||||
for (Loop::block_iterator LI = L->block_begin(), LE = L->block_end();
|
for (Loop::block_iterator LI = L->block_begin(), LE = L->block_end();
|
||||||
LI != LE; ++LI) {
|
LI != LE; ++LI) {
|
||||||
@ -203,12 +201,10 @@ bool LoopDeletion::runOnLoop(Loop* L, LPPassManager& LPM) {
|
|||||||
for (SmallVector<DomTreeNode*, 8>::iterator DI = ChildNodes.begin(),
|
for (SmallVector<DomTreeNode*, 8>::iterator DI = ChildNodes.begin(),
|
||||||
DE = ChildNodes.end(); DI != DE; ++DI) {
|
DE = ChildNodes.end(); DI != DE; ++DI) {
|
||||||
DT.changeImmediateDominator(*DI, DT[preheader]);
|
DT.changeImmediateDominator(*DI, DT[preheader]);
|
||||||
if (DF) DF->changeImmediateDominator((*DI)->getBlock(), preheader, &DT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ChildNodes.clear();
|
ChildNodes.clear();
|
||||||
DT.eraseNode(*LI);
|
DT.eraseNode(*LI);
|
||||||
if (DF) DF->removeBlock(*LI);
|
|
||||||
|
|
||||||
// Remove the block from the reference counting scheme, so that we can
|
// Remove the block from the reference counting scheme, so that we can
|
||||||
// delete it freely later.
|
// delete it freely later.
|
||||||
|
@ -3814,7 +3814,6 @@ void LoopStrengthReduce::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
// We split critical edges, so we change the CFG. However, we do update
|
// We split critical edges, so we change the CFG. However, we do update
|
||||||
// many analyses if they are around.
|
// many analyses if they are around.
|
||||||
AU.addPreservedID(LoopSimplifyID);
|
AU.addPreservedID(LoopSimplifyID);
|
||||||
AU.addPreserved("domfrontier");
|
|
||||||
|
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
#include "llvm/Constant.h"
|
#include "llvm/Constant.h"
|
||||||
#include "llvm/Type.h"
|
#include "llvm/Type.h"
|
||||||
#include "llvm/Analysis/AliasAnalysis.h"
|
#include "llvm/Analysis/AliasAnalysis.h"
|
||||||
#include "llvm/Analysis/DominanceFrontier.h"
|
#include "llvm/Analysis/Dominators.h"
|
||||||
#include "llvm/Analysis/LoopInfo.h"
|
#include "llvm/Analysis/LoopInfo.h"
|
||||||
#include "llvm/Analysis/MemoryDependenceAnalysis.h"
|
#include "llvm/Analysis/MemoryDependenceAnalysis.h"
|
||||||
#include "llvm/Target/TargetData.h"
|
#include "llvm/Target/TargetData.h"
|
||||||
@ -311,9 +311,6 @@ BasicBlock *llvm::SplitBlock(BasicBlock *Old, Instruction *SplitPt, Pass *P) {
|
|||||||
DT->changeImmediateDominator(*I, NewNode);
|
DT->changeImmediateDominator(*I, NewNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DominanceFrontier *DF = P->getAnalysisIfAvailable<DominanceFrontier>())
|
|
||||||
DF->splitBlock(Old);
|
|
||||||
|
|
||||||
return New;
|
return New;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,10 +322,9 @@ BasicBlock *llvm::SplitBlock(BasicBlock *Old, Instruction *SplitPt, Pass *P) {
|
|||||||
/// suffix of 'Suffix'.
|
/// suffix of 'Suffix'.
|
||||||
///
|
///
|
||||||
/// This currently updates the LLVM IR, AliasAnalysis, DominatorTree,
|
/// This currently updates the LLVM IR, AliasAnalysis, DominatorTree,
|
||||||
/// DominanceFrontier, LoopInfo, and LCCSA but no other analyses.
|
/// LoopInfo, and LCCSA but no other analyses. In particular, it does not
|
||||||
/// In particular, it does not preserve LoopSimplify (because it's
|
/// preserve LoopSimplify (because it's complicated to handle the case where one
|
||||||
/// complicated to handle the case where one of the edges being split
|
/// of the edges being split is an exit of a loop with other exits).
|
||||||
/// is an exit of a loop with other exits).
|
|
||||||
///
|
///
|
||||||
BasicBlock *llvm::SplitBlockPredecessors(BasicBlock *BB,
|
BasicBlock *llvm::SplitBlockPredecessors(BasicBlock *BB,
|
||||||
BasicBlock *const *Preds,
|
BasicBlock *const *Preds,
|
||||||
@ -378,13 +374,10 @@ BasicBlock *llvm::SplitBlockPredecessors(BasicBlock *BB,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update dominator tree and dominator frontier if available.
|
// Update dominator tree if available.
|
||||||
DominatorTree *DT = P ? P->getAnalysisIfAvailable<DominatorTree>() : 0;
|
DominatorTree *DT = P ? P->getAnalysisIfAvailable<DominatorTree>() : 0;
|
||||||
if (DT)
|
if (DT)
|
||||||
DT->splitBlock(NewBB);
|
DT->splitBlock(NewBB);
|
||||||
if (DominanceFrontier *DF =
|
|
||||||
P ? P->getAnalysisIfAvailable<DominanceFrontier>() : 0)
|
|
||||||
DF->splitBlock(NewBB);
|
|
||||||
|
|
||||||
// Insert a new PHI node into NewBB for every PHI node in BB and that new PHI
|
// Insert a new PHI node into NewBB for every PHI node in BB and that new PHI
|
||||||
// node becomes an incoming value for BB's phi node. However, if the Preds
|
// node becomes an incoming value for BB's phi node. However, if the Preds
|
||||||
|
@ -11,15 +11,14 @@
|
|||||||
// inserting a dummy basic block. This pass may be "required" by passes that
|
// inserting a dummy basic block. This pass may be "required" by passes that
|
||||||
// cannot deal with critical edges. For this usage, the structure type is
|
// cannot deal with critical edges. For this usage, the structure type is
|
||||||
// forward declared. This pass obviously invalidates the CFG, but can update
|
// forward declared. This pass obviously invalidates the CFG, but can update
|
||||||
// forward dominator (set, immediate dominators, tree, and frontier)
|
// dominator trees.
|
||||||
// information.
|
|
||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#define DEBUG_TYPE "break-crit-edges"
|
#define DEBUG_TYPE "break-crit-edges"
|
||||||
#include "llvm/Transforms/Scalar.h"
|
#include "llvm/Transforms/Scalar.h"
|
||||||
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
|
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
|
||||||
#include "llvm/Analysis/DominanceFrontier.h"
|
#include "llvm/Analysis/Dominators.h"
|
||||||
#include "llvm/Analysis/LoopInfo.h"
|
#include "llvm/Analysis/LoopInfo.h"
|
||||||
#include "llvm/Analysis/ProfileInfo.h"
|
#include "llvm/Analysis/ProfileInfo.h"
|
||||||
#include "llvm/Function.h"
|
#include "llvm/Function.h"
|
||||||
@ -44,7 +43,6 @@ namespace {
|
|||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTree>();
|
||||||
AU.addPreserved<DominanceFrontier>();
|
|
||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
AU.addPreserved<ProfileInfo>();
|
AU.addPreserved<ProfileInfo>();
|
||||||
|
|
||||||
@ -152,10 +150,9 @@ static void CreatePHIsForSplitLoopExit(SmallVectorImpl<BasicBlock *> &Preds,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// SplitCriticalEdge - If this edge is a critical edge, insert a new node to
|
/// SplitCriticalEdge - If this edge is a critical edge, insert a new node to
|
||||||
/// split the critical edge. This will update DominatorTree and
|
/// split the critical edge. This will update DominatorTree information if it
|
||||||
/// DominatorFrontier information if it is available, thus calling this pass
|
/// is available, thus calling this pass will not invalidate either of them.
|
||||||
/// will not invalidate either of them. This returns the new block if the edge
|
/// This returns the new block if the edge was split, null otherwise.
|
||||||
/// was split, null otherwise.
|
|
||||||
///
|
///
|
||||||
/// If MergeIdenticalEdges is true (not the default), *all* edges from TI to the
|
/// If MergeIdenticalEdges is true (not the default), *all* edges from TI to the
|
||||||
/// specified successor will be merged into the same critical edge block.
|
/// specified successor will be merged into the same critical edge block.
|
||||||
@ -257,12 +254,11 @@ BasicBlock *llvm::SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum,
|
|||||||
if (P == 0) return NewBB;
|
if (P == 0) return NewBB;
|
||||||
|
|
||||||
DominatorTree *DT = P->getAnalysisIfAvailable<DominatorTree>();
|
DominatorTree *DT = P->getAnalysisIfAvailable<DominatorTree>();
|
||||||
DominanceFrontier *DF = P->getAnalysisIfAvailable<DominanceFrontier>();
|
|
||||||
LoopInfo *LI = P->getAnalysisIfAvailable<LoopInfo>();
|
LoopInfo *LI = P->getAnalysisIfAvailable<LoopInfo>();
|
||||||
ProfileInfo *PI = P->getAnalysisIfAvailable<ProfileInfo>();
|
ProfileInfo *PI = P->getAnalysisIfAvailable<ProfileInfo>();
|
||||||
|
|
||||||
// If we have nothing to update, just return.
|
// If we have nothing to update, just return.
|
||||||
if (DT == 0 && DF == 0 && LI == 0 && PI == 0)
|
if (DT == 0 && LI == 0 && PI == 0)
|
||||||
return NewBB;
|
return NewBB;
|
||||||
|
|
||||||
// Now update analysis information. Since the only predecessor of NewBB is
|
// Now update analysis information. Since the only predecessor of NewBB is
|
||||||
@ -320,40 +316,6 @@ BasicBlock *llvm::SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Should we update DominanceFrontier information?
|
|
||||||
if (DF) {
|
|
||||||
// If NewBBDominatesDestBB hasn't been computed yet, do so with DF.
|
|
||||||
if (!OtherPreds.empty()) {
|
|
||||||
// FIXME: IMPLEMENT THIS!
|
|
||||||
llvm_unreachable("Requiring domfrontiers but not idom/domtree/domset."
|
|
||||||
" not implemented yet!");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Since the new block is dominated by its only predecessor TIBB,
|
|
||||||
// it cannot be in any block's dominance frontier. If NewBB dominates
|
|
||||||
// DestBB, its dominance frontier is the same as DestBB's, otherwise it is
|
|
||||||
// just {DestBB}.
|
|
||||||
DominanceFrontier::DomSetType NewDFSet;
|
|
||||||
if (NewBBDominatesDestBB) {
|
|
||||||
DominanceFrontier::iterator I = DF->find(DestBB);
|
|
||||||
if (I != DF->end()) {
|
|
||||||
DF->addBasicBlock(NewBB, I->second);
|
|
||||||
|
|
||||||
if (I->second.count(DestBB)) {
|
|
||||||
// However NewBB's frontier does not include DestBB.
|
|
||||||
DominanceFrontier::iterator NF = DF->find(NewBB);
|
|
||||||
DF->removeFromFrontier(NF, DestBB);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
DF->addBasicBlock(NewBB, DominanceFrontier::DomSetType());
|
|
||||||
} else {
|
|
||||||
DominanceFrontier::DomSetType NewDFSet;
|
|
||||||
NewDFSet.insert(DestBB);
|
|
||||||
DF->addBasicBlock(NewBB, NewDFSet);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update LoopInfo if it is around.
|
// Update LoopInfo if it is around.
|
||||||
if (LI) {
|
if (LI) {
|
||||||
if (Loop *TIL = LI->getLoopFor(TIBB)) {
|
if (Loop *TIL = LI->getLoopFor(TIBB)) {
|
||||||
|
@ -14,17 +14,16 @@
|
|||||||
#include "llvm/Transforms/Utils/Cloning.h"
|
#include "llvm/Transforms/Utils/Cloning.h"
|
||||||
#include "llvm/BasicBlock.h"
|
#include "llvm/BasicBlock.h"
|
||||||
#include "llvm/Analysis/LoopPass.h"
|
#include "llvm/Analysis/LoopPass.h"
|
||||||
#include "llvm/Analysis/DominanceFrontier.h"
|
#include "llvm/Analysis/Dominators.h"
|
||||||
|
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
/// CloneDominatorInfo - Clone basicblock's dominator tree and, if available,
|
/// CloneDominatorInfo - Clone a basic block's dominator tree. It is expected
|
||||||
/// dominance info. It is expected that basic block is already cloned.
|
/// that the basic block is already cloned.
|
||||||
static void CloneDominatorInfo(BasicBlock *BB,
|
static void CloneDominatorInfo(BasicBlock *BB,
|
||||||
ValueToValueMapTy &VMap,
|
ValueToValueMapTy &VMap,
|
||||||
DominatorTree *DT,
|
DominatorTree *DT) {
|
||||||
DominanceFrontier *DF) {
|
|
||||||
|
|
||||||
assert (DT && "DominatorTree is not available");
|
assert (DT && "DominatorTree is not available");
|
||||||
ValueToValueMapTy::iterator BI = VMap.find(BB);
|
ValueToValueMapTy::iterator BI = VMap.find(BB);
|
||||||
@ -46,28 +45,9 @@ static void CloneDominatorInfo(BasicBlock *BB,
|
|||||||
if (BBDomI != VMap.end()) {
|
if (BBDomI != VMap.end()) {
|
||||||
NewBBDom = cast<BasicBlock>(BBDomI->second);
|
NewBBDom = cast<BasicBlock>(BBDomI->second);
|
||||||
if (!DT->getNode(NewBBDom))
|
if (!DT->getNode(NewBBDom))
|
||||||
CloneDominatorInfo(BBDom, VMap, DT, DF);
|
CloneDominatorInfo(BBDom, VMap, DT);
|
||||||
}
|
}
|
||||||
DT->addNewBlock(NewBB, NewBBDom);
|
DT->addNewBlock(NewBB, NewBBDom);
|
||||||
|
|
||||||
// Copy cloned dominance frontiner set
|
|
||||||
if (DF) {
|
|
||||||
DominanceFrontier::DomSetType NewDFSet;
|
|
||||||
DominanceFrontier::iterator DFI = DF->find(BB);
|
|
||||||
if ( DFI != DF->end()) {
|
|
||||||
DominanceFrontier::DomSetType S = DFI->second;
|
|
||||||
for (DominanceFrontier::DomSetType::iterator I = S.begin(), E = S.end();
|
|
||||||
I != E; ++I) {
|
|
||||||
BasicBlock *DB = *I;
|
|
||||||
ValueToValueMapTy::iterator IDM = VMap.find(DB);
|
|
||||||
if (IDM != VMap.end())
|
|
||||||
NewDFSet.insert(cast<BasicBlock>(IDM->second));
|
|
||||||
else
|
|
||||||
NewDFSet.insert(DB);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DF->addBasicBlock(NewBB, NewDFSet);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// CloneLoop - Clone Loop. Clone dominator info. Populate VMap
|
/// CloneLoop - Clone Loop. Clone dominator info. Populate VMap
|
||||||
@ -76,11 +56,8 @@ Loop *llvm::CloneLoop(Loop *OrigL, LPPassManager *LPM, LoopInfo *LI,
|
|||||||
ValueToValueMapTy &VMap, Pass *P) {
|
ValueToValueMapTy &VMap, Pass *P) {
|
||||||
|
|
||||||
DominatorTree *DT = NULL;
|
DominatorTree *DT = NULL;
|
||||||
DominanceFrontier *DF = NULL;
|
if (P)
|
||||||
if (P) {
|
|
||||||
DT = P->getAnalysisIfAvailable<DominatorTree>();
|
DT = P->getAnalysisIfAvailable<DominatorTree>();
|
||||||
DF = P->getAnalysisIfAvailable<DominanceFrontier>();
|
|
||||||
}
|
|
||||||
|
|
||||||
SmallVector<BasicBlock *, 16> NewBlocks;
|
SmallVector<BasicBlock *, 16> NewBlocks;
|
||||||
|
|
||||||
@ -116,7 +93,7 @@ Loop *llvm::CloneLoop(Loop *OrigL, LPPassManager *LPM, LoopInfo *LI,
|
|||||||
for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
|
for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
|
||||||
I != E; ++I) {
|
I != E; ++I) {
|
||||||
BasicBlock *BB = *I;
|
BasicBlock *BB = *I;
|
||||||
CloneDominatorInfo(BB, VMap, DT, DF);
|
CloneDominatorInfo(BB, VMap, DT);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process sub loops
|
// Process sub loops
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
#include "llvm/LLVMContext.h"
|
#include "llvm/LLVMContext.h"
|
||||||
#include "llvm/Type.h"
|
#include "llvm/Type.h"
|
||||||
#include "llvm/Analysis/AliasAnalysis.h"
|
#include "llvm/Analysis/AliasAnalysis.h"
|
||||||
#include "llvm/Analysis/DominanceFrontier.h"
|
#include "llvm/Analysis/Dominators.h"
|
||||||
#include "llvm/Analysis/InstructionSimplify.h"
|
#include "llvm/Analysis/InstructionSimplify.h"
|
||||||
#include "llvm/Analysis/LoopPass.h"
|
#include "llvm/Analysis/LoopPass.h"
|
||||||
#include "llvm/Analysis/ScalarEvolution.h"
|
#include "llvm/Analysis/ScalarEvolution.h"
|
||||||
@ -90,7 +90,6 @@ namespace {
|
|||||||
AU.addPreserved<AliasAnalysis>();
|
AU.addPreserved<AliasAnalysis>();
|
||||||
AU.addPreserved<ScalarEvolution>();
|
AU.addPreserved<ScalarEvolution>();
|
||||||
AU.addPreservedID(BreakCriticalEdgesID); // No critical edges added.
|
AU.addPreservedID(BreakCriticalEdgesID); // No critical edges added.
|
||||||
AU.addPreserved<DominanceFrontier>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// verifyAnalysis() - Verify LoopSimplifyForm's guarantees.
|
/// verifyAnalysis() - Verify LoopSimplifyForm's guarantees.
|
||||||
@ -322,7 +321,7 @@ ReprocessLoop:
|
|||||||
if (!FoldBranchToCommonDest(BI)) continue;
|
if (!FoldBranchToCommonDest(BI)) continue;
|
||||||
|
|
||||||
// Success. The block is now dead, so remove it from the loop,
|
// Success. The block is now dead, so remove it from the loop,
|
||||||
// update the dominator tree and dominance frontier, and delete it.
|
// update the dominator tree and delete it.
|
||||||
DEBUG(dbgs() << "LoopSimplify: Eliminating exiting block "
|
DEBUG(dbgs() << "LoopSimplify: Eliminating exiting block "
|
||||||
<< ExitingBlock->getName() << "\n");
|
<< ExitingBlock->getName() << "\n");
|
||||||
|
|
||||||
@ -330,19 +329,14 @@ ReprocessLoop:
|
|||||||
Changed = true;
|
Changed = true;
|
||||||
LI->removeBlock(ExitingBlock);
|
LI->removeBlock(ExitingBlock);
|
||||||
|
|
||||||
DominanceFrontier *DF = getAnalysisIfAvailable<DominanceFrontier>();
|
|
||||||
DomTreeNode *Node = DT->getNode(ExitingBlock);
|
DomTreeNode *Node = DT->getNode(ExitingBlock);
|
||||||
const std::vector<DomTreeNodeBase<BasicBlock> *> &Children =
|
const std::vector<DomTreeNodeBase<BasicBlock> *> &Children =
|
||||||
Node->getChildren();
|
Node->getChildren();
|
||||||
while (!Children.empty()) {
|
while (!Children.empty()) {
|
||||||
DomTreeNode *Child = Children.front();
|
DomTreeNode *Child = Children.front();
|
||||||
DT->changeImmediateDominator(Child, Node->getIDom());
|
DT->changeImmediateDominator(Child, Node->getIDom());
|
||||||
if (DF) DF->changeImmediateDominator(Child->getBlock(),
|
|
||||||
Node->getIDom()->getBlock(),
|
|
||||||
DT);
|
|
||||||
}
|
}
|
||||||
DT->eraseNode(ExitingBlock);
|
DT->eraseNode(ExitingBlock);
|
||||||
if (DF) DF->removeBlock(ExitingBlock);
|
|
||||||
|
|
||||||
BI->getSuccessor(0)->removePredecessor(ExitingBlock);
|
BI->getSuccessor(0)->removePredecessor(ExitingBlock);
|
||||||
BI->getSuccessor(1)->removePredecessor(ExitingBlock);
|
BI->getSuccessor(1)->removePredecessor(ExitingBlock);
|
||||||
@ -720,8 +714,6 @@ LoopSimplify::InsertUniqueBackedgeBlock(Loop *L, BasicBlock *Preheader) {
|
|||||||
|
|
||||||
// Update dominator information
|
// Update dominator information
|
||||||
DT->splitBlock(BEBlock);
|
DT->splitBlock(BEBlock);
|
||||||
if (DominanceFrontier *DF = getAnalysisIfAvailable<DominanceFrontier>())
|
|
||||||
DF->splitBlock(BEBlock);
|
|
||||||
|
|
||||||
return BEBlock;
|
return BEBlock;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user