forked from OSchip/llvm-project
- Change a few operator[] to lookup which is cheaper.
- Add some constantness. llvm-svn: 147090
This commit is contained in:
parent
e49fbd0755
commit
df5133455f
|
@ -116,7 +116,7 @@ public:
|
||||||
/// a contiguous sequence of basic blocks, updating the edge list, and
|
/// a contiguous sequence of basic blocks, updating the edge list, and
|
||||||
/// updating the block -> chain mapping. It does not free or tear down the
|
/// updating the block -> chain mapping. It does not free or tear down the
|
||||||
/// old chain, but the old chain's block list is no longer valid.
|
/// old chain, but the old chain's block list is no longer valid.
|
||||||
void merge(MachineBasicBlock *BB, BlockChain *Chain) {
|
void merge(MachineBasicBlock *BB, const BlockChain *Chain) {
|
||||||
assert(BB);
|
assert(BB);
|
||||||
assert(!Blocks.empty());
|
assert(!Blocks.empty());
|
||||||
|
|
||||||
|
@ -185,28 +185,27 @@ class MachineBlockPlacement : public MachineFunctionPass {
|
||||||
/// between basic blocks.
|
/// between basic blocks.
|
||||||
DenseMap<MachineBasicBlock *, BlockChain *> BlockToChain;
|
DenseMap<MachineBasicBlock *, BlockChain *> BlockToChain;
|
||||||
|
|
||||||
void markChainSuccessors(BlockChain &Chain,
|
void markChainSuccessors(const BlockChain &Chain,
|
||||||
MachineBasicBlock *LoopHeaderBB,
|
const MachineBasicBlock *LoopHeaderBB,
|
||||||
SmallVectorImpl<MachineBasicBlock *> &BlockWorkList,
|
SmallVectorImpl<MachineBasicBlock *> &BlockWorkList,
|
||||||
const BlockFilterSet *BlockFilter = 0);
|
const BlockFilterSet *BlockFilter = 0) const;
|
||||||
MachineBasicBlock *selectBestSuccessor(MachineBasicBlock *BB,
|
MachineBasicBlock *selectBestSuccessor(const MachineBasicBlock *BB,
|
||||||
BlockChain &Chain,
|
const BlockChain &Chain, const BlockFilterSet *BlockFilter) const;
|
||||||
const BlockFilterSet *BlockFilter);
|
|
||||||
MachineBasicBlock *selectBestCandidateBlock(
|
MachineBasicBlock *selectBestCandidateBlock(
|
||||||
BlockChain &Chain, SmallVectorImpl<MachineBasicBlock *> &WorkList,
|
const BlockChain &Chain, SmallVectorImpl<MachineBasicBlock *> &WorkList,
|
||||||
const BlockFilterSet *BlockFilter);
|
const BlockFilterSet *BlockFilter) const;
|
||||||
MachineBasicBlock *getFirstUnplacedBlock(
|
MachineBasicBlock *getFirstUnplacedBlock(
|
||||||
MachineFunction &F,
|
MachineFunction &F,
|
||||||
const BlockChain &PlacedChain,
|
const BlockChain &PlacedChain,
|
||||||
MachineFunction::iterator &PrevUnplacedBlockIt,
|
MachineFunction::iterator &PrevUnplacedBlockIt,
|
||||||
const BlockFilterSet *BlockFilter);
|
const BlockFilterSet *BlockFilter) const;
|
||||||
void buildChain(MachineBasicBlock *BB, BlockChain &Chain,
|
void buildChain(MachineBasicBlock *BB, BlockChain &Chain,
|
||||||
SmallVectorImpl<MachineBasicBlock *> &BlockWorkList,
|
SmallVectorImpl<MachineBasicBlock *> &BlockWorkList,
|
||||||
const BlockFilterSet *BlockFilter = 0);
|
const BlockFilterSet *BlockFilter = 0) const;
|
||||||
MachineBasicBlock *findBestLoopTop(MachineFunction &F,
|
MachineBasicBlock *findBestLoopTop(MachineFunction &F,
|
||||||
MachineLoop &L,
|
MachineLoop &L,
|
||||||
const BlockFilterSet &LoopBlockSet);
|
const BlockFilterSet &LoopBlockSet) const;
|
||||||
void buildLoopChains(MachineFunction &F, MachineLoop &L);
|
void buildLoopChains(MachineFunction &F, MachineLoop &L) const;
|
||||||
void buildCFGChains(MachineFunction &F);
|
void buildCFGChains(MachineFunction &F);
|
||||||
void AlignLoops(MachineFunction &F);
|
void AlignLoops(MachineFunction &F);
|
||||||
|
|
||||||
|
@ -246,7 +245,7 @@ FunctionPass *llvm::createMachineBlockPlacementPass() {
|
||||||
/// \brief Helper to print the name of a MBB.
|
/// \brief Helper to print the name of a MBB.
|
||||||
///
|
///
|
||||||
/// Only used by debug logging.
|
/// Only used by debug logging.
|
||||||
static std::string getBlockName(MachineBasicBlock *BB) {
|
static std::string getBlockName(const MachineBasicBlock *BB) {
|
||||||
std::string Result;
|
std::string Result;
|
||||||
raw_string_ostream OS(Result);
|
raw_string_ostream OS(Result);
|
||||||
OS << "BB#" << BB->getNumber()
|
OS << "BB#" << BB->getNumber()
|
||||||
|
@ -258,7 +257,7 @@ static std::string getBlockName(MachineBasicBlock *BB) {
|
||||||
/// \brief Helper to print the number of a MBB.
|
/// \brief Helper to print the number of a MBB.
|
||||||
///
|
///
|
||||||
/// Only used by debug logging.
|
/// Only used by debug logging.
|
||||||
static std::string getBlockNum(MachineBasicBlock *BB) {
|
static std::string getBlockNum(const MachineBasicBlock *BB) {
|
||||||
std::string Result;
|
std::string Result;
|
||||||
raw_string_ostream OS(Result);
|
raw_string_ostream OS(Result);
|
||||||
OS << "BB#" << BB->getNumber();
|
OS << "BB#" << BB->getNumber();
|
||||||
|
@ -274,10 +273,10 @@ static std::string getBlockNum(MachineBasicBlock *BB) {
|
||||||
/// having one fewer active predecessor. It also adds any successors of this
|
/// having one fewer active predecessor. It also adds any successors of this
|
||||||
/// chain which reach the zero-predecessor state to the worklist passed in.
|
/// chain which reach the zero-predecessor state to the worklist passed in.
|
||||||
void MachineBlockPlacement::markChainSuccessors(
|
void MachineBlockPlacement::markChainSuccessors(
|
||||||
BlockChain &Chain,
|
const BlockChain &Chain,
|
||||||
MachineBasicBlock *LoopHeaderBB,
|
const MachineBasicBlock *LoopHeaderBB,
|
||||||
SmallVectorImpl<MachineBasicBlock *> &BlockWorkList,
|
SmallVectorImpl<MachineBasicBlock *> &BlockWorkList,
|
||||||
const BlockFilterSet *BlockFilter) {
|
const BlockFilterSet *BlockFilter) const {
|
||||||
// Walk all the blocks in this chain, marking their successors as having
|
// Walk all the blocks in this chain, marking their successors as having
|
||||||
// a predecessor placed.
|
// a predecessor placed.
|
||||||
for (BlockChain::iterator CBI = Chain.begin(), CBE = Chain.end();
|
for (BlockChain::iterator CBI = Chain.begin(), CBE = Chain.end();
|
||||||
|
@ -291,7 +290,7 @@ void MachineBlockPlacement::markChainSuccessors(
|
||||||
SI != SE; ++SI) {
|
SI != SE; ++SI) {
|
||||||
if (BlockFilter && !BlockFilter->count(*SI))
|
if (BlockFilter && !BlockFilter->count(*SI))
|
||||||
continue;
|
continue;
|
||||||
BlockChain &SuccChain = *BlockToChain[*SI];
|
BlockChain &SuccChain = *BlockToChain.lookup(*SI);
|
||||||
// Disregard edges within a fixed chain, or edges to the loop header.
|
// Disregard edges within a fixed chain, or edges to the loop header.
|
||||||
if (&Chain == &SuccChain || *SI == LoopHeaderBB)
|
if (&Chain == &SuccChain || *SI == LoopHeaderBB)
|
||||||
continue;
|
continue;
|
||||||
|
@ -314,8 +313,8 @@ void MachineBlockPlacement::markChainSuccessors(
|
||||||
///
|
///
|
||||||
/// \returns The best successor block found, or null if none are viable.
|
/// \returns The best successor block found, or null if none are viable.
|
||||||
MachineBasicBlock *MachineBlockPlacement::selectBestSuccessor(
|
MachineBasicBlock *MachineBlockPlacement::selectBestSuccessor(
|
||||||
MachineBasicBlock *BB, BlockChain &Chain,
|
const MachineBasicBlock *BB, const BlockChain &Chain,
|
||||||
const BlockFilterSet *BlockFilter) {
|
const BlockFilterSet *BlockFilter) const {
|
||||||
const BranchProbability HotProb(4, 5); // 80%
|
const BranchProbability HotProb(4, 5); // 80%
|
||||||
|
|
||||||
MachineBasicBlock *BestSucc = 0;
|
MachineBasicBlock *BestSucc = 0;
|
||||||
|
@ -329,12 +328,11 @@ MachineBasicBlock *MachineBlockPlacement::selectBestSuccessor(
|
||||||
uint32_t WeightScale = 0;
|
uint32_t WeightScale = 0;
|
||||||
uint32_t SumWeight = MBPI->getSumForBlock(BB, WeightScale);
|
uint32_t SumWeight = MBPI->getSumForBlock(BB, WeightScale);
|
||||||
DEBUG(dbgs() << "Attempting merge from: " << getBlockName(BB) << "\n");
|
DEBUG(dbgs() << "Attempting merge from: " << getBlockName(BB) << "\n");
|
||||||
for (MachineBasicBlock::succ_iterator SI = BB->succ_begin(),
|
for (MachineBasicBlock::const_succ_iterator SI = BB->succ_begin(),
|
||||||
SE = BB->succ_end();
|
SE = BB->succ_end(); SI != SE; ++SI) {
|
||||||
SI != SE; ++SI) {
|
|
||||||
if (BlockFilter && !BlockFilter->count(*SI))
|
if (BlockFilter && !BlockFilter->count(*SI))
|
||||||
continue;
|
continue;
|
||||||
BlockChain &SuccChain = *BlockToChain[*SI];
|
const BlockChain &SuccChain = *BlockToChain.lookup(*SI);
|
||||||
if (&SuccChain == &Chain) {
|
if (&SuccChain == &Chain) {
|
||||||
DEBUG(dbgs() << " " << getBlockName(*SI) << " -> Already merged!\n");
|
DEBUG(dbgs() << " " << getBlockName(*SI) << " -> Already merged!\n");
|
||||||
continue;
|
continue;
|
||||||
|
@ -364,7 +362,7 @@ MachineBasicBlock *MachineBlockPlacement::selectBestSuccessor(
|
||||||
PE = (*SI)->pred_end();
|
PE = (*SI)->pred_end();
|
||||||
PI != PE; ++PI) {
|
PI != PE; ++PI) {
|
||||||
if (*PI == *SI || (BlockFilter && !BlockFilter->count(*PI)) ||
|
if (*PI == *SI || (BlockFilter && !BlockFilter->count(*PI)) ||
|
||||||
BlockToChain[*PI] == &Chain)
|
BlockToChain.lookup(*PI) == &Chain)
|
||||||
continue;
|
continue;
|
||||||
BlockFrequency PredEdgeFreq
|
BlockFrequency PredEdgeFreq
|
||||||
= MBFI->getBlockFreq(*PI) * MBPI->getEdgeProbability(*PI, *SI);
|
= MBFI->getBlockFreq(*PI) * MBPI->getEdgeProbability(*PI, *SI);
|
||||||
|
@ -420,8 +418,8 @@ public:
|
||||||
///
|
///
|
||||||
/// \returns The best block found, or null if none are viable.
|
/// \returns The best block found, or null if none are viable.
|
||||||
MachineBasicBlock *MachineBlockPlacement::selectBestCandidateBlock(
|
MachineBasicBlock *MachineBlockPlacement::selectBestCandidateBlock(
|
||||||
BlockChain &Chain, SmallVectorImpl<MachineBasicBlock *> &WorkList,
|
const BlockChain &Chain, SmallVectorImpl<MachineBasicBlock *> &WorkList,
|
||||||
const BlockFilterSet *BlockFilter) {
|
const BlockFilterSet *BlockFilter) const {
|
||||||
// Once we need to walk the worklist looking for a candidate, cleanup the
|
// Once we need to walk the worklist looking for a candidate, cleanup the
|
||||||
// worklist of already placed entries.
|
// worklist of already placed entries.
|
||||||
// FIXME: If this shows up on profiles, it could be folded (at the cost of
|
// FIXME: If this shows up on profiles, it could be folded (at the cost of
|
||||||
|
@ -436,7 +434,7 @@ MachineBasicBlock *MachineBlockPlacement::selectBestCandidateBlock(
|
||||||
WBE = WorkList.end();
|
WBE = WorkList.end();
|
||||||
WBI != WBE; ++WBI) {
|
WBI != WBE; ++WBI) {
|
||||||
assert(!BlockFilter || BlockFilter->count(*WBI));
|
assert(!BlockFilter || BlockFilter->count(*WBI));
|
||||||
BlockChain &SuccChain = *BlockToChain[*WBI];
|
const BlockChain &SuccChain = *BlockToChain.lookup(*WBI);
|
||||||
if (&SuccChain == &Chain) {
|
if (&SuccChain == &Chain) {
|
||||||
DEBUG(dbgs() << " " << getBlockName(*WBI)
|
DEBUG(dbgs() << " " << getBlockName(*WBI)
|
||||||
<< " -> Already merged!\n");
|
<< " -> Already merged!\n");
|
||||||
|
@ -465,17 +463,17 @@ MachineBasicBlock *MachineBlockPlacement::selectBestCandidateBlock(
|
||||||
MachineBasicBlock *MachineBlockPlacement::getFirstUnplacedBlock(
|
MachineBasicBlock *MachineBlockPlacement::getFirstUnplacedBlock(
|
||||||
MachineFunction &F, const BlockChain &PlacedChain,
|
MachineFunction &F, const BlockChain &PlacedChain,
|
||||||
MachineFunction::iterator &PrevUnplacedBlockIt,
|
MachineFunction::iterator &PrevUnplacedBlockIt,
|
||||||
const BlockFilterSet *BlockFilter) {
|
const BlockFilterSet *BlockFilter) const {
|
||||||
for (MachineFunction::iterator I = PrevUnplacedBlockIt, E = F.end(); I != E;
|
for (MachineFunction::iterator I = PrevUnplacedBlockIt, E = F.end(); I != E;
|
||||||
++I) {
|
++I) {
|
||||||
if (BlockFilter && !BlockFilter->count(I))
|
if (BlockFilter && !BlockFilter->count(I))
|
||||||
continue;
|
continue;
|
||||||
if (BlockToChain[I] != &PlacedChain) {
|
if (BlockToChain.lookup(I) != &PlacedChain) {
|
||||||
PrevUnplacedBlockIt = I;
|
PrevUnplacedBlockIt = I;
|
||||||
// Now select the head of the chain to which the unplaced block belongs
|
// Now select the head of the chain to which the unplaced block belongs
|
||||||
// as the block to place. This will force the entire chain to be placed,
|
// as the block to place. This will force the entire chain to be placed,
|
||||||
// and satisfies the requirements of merging chains.
|
// and satisfies the requirements of merging chains.
|
||||||
return *BlockToChain[I]->begin();
|
return *BlockToChain.lookup(I)->begin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -485,9 +483,9 @@ void MachineBlockPlacement::buildChain(
|
||||||
MachineBasicBlock *BB,
|
MachineBasicBlock *BB,
|
||||||
BlockChain &Chain,
|
BlockChain &Chain,
|
||||||
SmallVectorImpl<MachineBasicBlock *> &BlockWorkList,
|
SmallVectorImpl<MachineBasicBlock *> &BlockWorkList,
|
||||||
const BlockFilterSet *BlockFilter) {
|
const BlockFilterSet *BlockFilter) const {
|
||||||
assert(BB);
|
assert(BB);
|
||||||
assert(BlockToChain[BB] == &Chain);
|
assert(BlockToChain.lookup(BB) == &Chain);
|
||||||
MachineFunction &F = *BB->getParent();
|
MachineFunction &F = *BB->getParent();
|
||||||
MachineFunction::iterator PrevUnplacedBlockIt = F.begin();
|
MachineFunction::iterator PrevUnplacedBlockIt = F.begin();
|
||||||
|
|
||||||
|
@ -496,7 +494,7 @@ void MachineBlockPlacement::buildChain(
|
||||||
BB = *llvm::prior(Chain.end());
|
BB = *llvm::prior(Chain.end());
|
||||||
for (;;) {
|
for (;;) {
|
||||||
assert(BB);
|
assert(BB);
|
||||||
assert(BlockToChain[BB] == &Chain);
|
assert(BlockToChain.lookup(BB) == &Chain);
|
||||||
assert(*llvm::prior(Chain.end()) == BB);
|
assert(*llvm::prior(Chain.end()) == BB);
|
||||||
MachineBasicBlock *BestSucc = 0;
|
MachineBasicBlock *BestSucc = 0;
|
||||||
|
|
||||||
|
@ -521,7 +519,7 @@ void MachineBlockPlacement::buildChain(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Place this block, updating the datastructures to reflect its placement.
|
// Place this block, updating the datastructures to reflect its placement.
|
||||||
BlockChain &SuccChain = *BlockToChain[BestSucc];
|
BlockChain &SuccChain = *BlockToChain.lookup(BestSucc);
|
||||||
// Zero out LoopPredecessors for the successor we're about to merge in case
|
// Zero out LoopPredecessors for the successor we're about to merge in case
|
||||||
// we selected a successor that didn't fit naturally into the CFG.
|
// we selected a successor that didn't fit naturally into the CFG.
|
||||||
SuccChain.LoopPredecessors = 0;
|
SuccChain.LoopPredecessors = 0;
|
||||||
|
@ -544,7 +542,7 @@ void MachineBlockPlacement::buildChain(
|
||||||
MachineBasicBlock *
|
MachineBasicBlock *
|
||||||
MachineBlockPlacement::findBestLoopTop(MachineFunction &F,
|
MachineBlockPlacement::findBestLoopTop(MachineFunction &F,
|
||||||
MachineLoop &L,
|
MachineLoop &L,
|
||||||
const BlockFilterSet &LoopBlockSet) {
|
const BlockFilterSet &LoopBlockSet) const {
|
||||||
BlockFrequency BestExitEdgeFreq;
|
BlockFrequency BestExitEdgeFreq;
|
||||||
MachineBasicBlock *ExitingBB = 0;
|
MachineBasicBlock *ExitingBB = 0;
|
||||||
MachineBasicBlock *LoopingBB = 0;
|
MachineBasicBlock *LoopingBB = 0;
|
||||||
|
@ -558,7 +556,7 @@ MachineBlockPlacement::findBestLoopTop(MachineFunction &F,
|
||||||
for (MachineLoop::block_iterator I = L.block_begin(),
|
for (MachineLoop::block_iterator I = L.block_begin(),
|
||||||
E = L.block_end();
|
E = L.block_end();
|
||||||
I != E; ++I) {
|
I != E; ++I) {
|
||||||
BlockChain &Chain = *BlockToChain[*I];
|
const BlockChain &Chain = *BlockToChain.lookup(*I);
|
||||||
// Ensure that this block is at the end of a chain; otherwise it could be
|
// Ensure that this block is at the end of a chain; otherwise it could be
|
||||||
// mid-way through an inner loop or a successor of an analyzable branch.
|
// mid-way through an inner loop or a successor of an analyzable branch.
|
||||||
if (*I != *llvm::prior(Chain.end()))
|
if (*I != *llvm::prior(Chain.end()))
|
||||||
|
@ -588,7 +586,7 @@ MachineBlockPlacement::findBestLoopTop(MachineFunction &F,
|
||||||
continue;
|
continue;
|
||||||
if (*SI == *I)
|
if (*SI == *I)
|
||||||
continue;
|
continue;
|
||||||
BlockChain &SuccChain = *BlockToChain[*SI];
|
const BlockChain &SuccChain = *BlockToChain.lookup(*SI);
|
||||||
// Don't split chains, either this chain or the successor's chain.
|
// Don't split chains, either this chain or the successor's chain.
|
||||||
if (&Chain == &SuccChain || *SI != *SuccChain.begin()) {
|
if (&Chain == &SuccChain || *SI != *SuccChain.begin()) {
|
||||||
DEBUG(dbgs() << " " << (LoopBlockSet.count(*SI) ? "looping: "
|
DEBUG(dbgs() << " " << (LoopBlockSet.count(*SI) ? "looping: "
|
||||||
|
@ -665,7 +663,7 @@ MachineBlockPlacement::findBestLoopTop(MachineFunction &F,
|
||||||
/// both preserves the topological structure and minimizes taken conditional
|
/// both preserves the topological structure and minimizes taken conditional
|
||||||
/// branches.
|
/// branches.
|
||||||
void MachineBlockPlacement::buildLoopChains(MachineFunction &F,
|
void MachineBlockPlacement::buildLoopChains(MachineFunction &F,
|
||||||
MachineLoop &L) {
|
MachineLoop &L) const {
|
||||||
// First recurse through any nested loops, building chains for those inner
|
// First recurse through any nested loops, building chains for those inner
|
||||||
// loops.
|
// loops.
|
||||||
for (MachineLoop::iterator LI = L.begin(), LE = L.end(); LI != LE; ++LI)
|
for (MachineLoop::iterator LI = L.begin(), LE = L.end(); LI != LE; ++LI)
|
||||||
|
@ -675,29 +673,29 @@ void MachineBlockPlacement::buildLoopChains(MachineFunction &F,
|
||||||
BlockFilterSet LoopBlockSet(L.block_begin(), L.block_end());
|
BlockFilterSet LoopBlockSet(L.block_begin(), L.block_end());
|
||||||
|
|
||||||
MachineBasicBlock *LayoutTop = findBestLoopTop(F, L, LoopBlockSet);
|
MachineBasicBlock *LayoutTop = findBestLoopTop(F, L, LoopBlockSet);
|
||||||
BlockChain &LoopChain = *BlockToChain[LayoutTop];
|
BlockChain &LoopChain = *BlockToChain.lookup(LayoutTop);
|
||||||
|
|
||||||
// FIXME: This is a really lame way of walking the chains in the loop: we
|
// FIXME: This is a really lame way of walking the chains in the loop: we
|
||||||
// walk the blocks, and use a set to prevent visiting a particular chain
|
// walk the blocks, and use a set to prevent visiting a particular chain
|
||||||
// twice.
|
// twice.
|
||||||
SmallPtrSet<BlockChain *, 4> UpdatedPreds;
|
SmallPtrSet<const BlockChain *, 4> UpdatedPreds;
|
||||||
assert(LoopChain.LoopPredecessors == 0);
|
assert(LoopChain.LoopPredecessors == 0);
|
||||||
UpdatedPreds.insert(&LoopChain);
|
UpdatedPreds.insert(&LoopChain);
|
||||||
for (MachineLoop::block_iterator BI = L.block_begin(),
|
for (MachineLoop::block_iterator BI = L.block_begin(),
|
||||||
BE = L.block_end();
|
BE = L.block_end();
|
||||||
BI != BE; ++BI) {
|
BI != BE; ++BI) {
|
||||||
BlockChain &Chain = *BlockToChain[*BI];
|
BlockChain &Chain = *BlockToChain.lookup(*BI);
|
||||||
if (!UpdatedPreds.insert(&Chain))
|
if (!UpdatedPreds.insert(&Chain))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
assert(Chain.LoopPredecessors == 0);
|
assert(Chain.LoopPredecessors == 0);
|
||||||
for (BlockChain::iterator BCI = Chain.begin(), BCE = Chain.end();
|
for (BlockChain::iterator BCI = Chain.begin(), BCE = Chain.end();
|
||||||
BCI != BCE; ++BCI) {
|
BCI != BCE; ++BCI) {
|
||||||
assert(BlockToChain[*BCI] == &Chain);
|
assert(BlockToChain.lookup(*BCI) == &Chain);
|
||||||
for (MachineBasicBlock::pred_iterator PI = (*BCI)->pred_begin(),
|
for (MachineBasicBlock::pred_iterator PI = (*BCI)->pred_begin(),
|
||||||
PE = (*BCI)->pred_end();
|
PE = (*BCI)->pred_end();
|
||||||
PI != PE; ++PI) {
|
PI != PE; ++PI) {
|
||||||
if (BlockToChain[*PI] == &Chain || !LoopBlockSet.count(*PI))
|
if (BlockToChain.lookup(*PI) == &Chain || !LoopBlockSet.count(*PI))
|
||||||
continue;
|
continue;
|
||||||
++Chain.LoopPredecessors;
|
++Chain.LoopPredecessors;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue