diff options
author | Andreas Neustifter <astifter-llvm@gmx.at> | 2009-09-10 16:30:38 +0000 |
---|---|---|
committer | Andreas Neustifter <astifter-llvm@gmx.at> | 2009-09-10 16:30:38 +0000 |
commit | 0c0de66ea40df4c7ef64d7d5259507b72e8c4d1f (patch) | |
tree | 8b55ba243cc98cdb8dc32b030534d9b5cb59670b /lib/Analysis/ProfileVerifierPass.cpp | |
parent | 478e71df542847eb213b5146555d5b093d52888e (diff) |
Make ProfileEstimator more robust on general CFGs.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81450 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/ProfileVerifierPass.cpp')
-rw-r--r-- | lib/Analysis/ProfileVerifierPass.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/lib/Analysis/ProfileVerifierPass.cpp b/lib/Analysis/ProfileVerifierPass.cpp index 1692522248..0be4de440f 100644 --- a/lib/Analysis/ProfileVerifierPass.cpp +++ b/lib/Analysis/ProfileVerifierPass.cpp @@ -223,17 +223,28 @@ void ProfileVerifierPass::recurseBasicBlock(const BasicBlock *BB) { DI.BB = BB; DI.outCount = DI.inCount = DI.inWeight = DI.outWeight = 0; std::set<const BasicBlock*> ProcessedPreds; - for (pred_const_iterator bbi = pred_begin(BB), bbe = pred_end(BB); - bbi != bbe; ++bbi) { - if (ProcessedPreds.insert(*bbi).second) { - DI.inWeight += ReadOrAssert(PI->getEdge(*bbi,BB)); + pred_const_iterator bpi = pred_begin(BB), bpe = pred_end(BB); + if (bpi == bpe) { + DI.inWeight += ReadOrAssert(PI->getEdge(0,BB)); + DI.inCount++; + } + for (;bpi != bpe; ++bpi) { + if (ProcessedPreds.insert(*bpi).second) { + DI.inWeight += ReadOrAssert(PI->getEdge(*bpi,BB)); DI.inCount++; } } std::set<const BasicBlock*> ProcessedSuccs; - for (succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB); - bbi != bbe; ++bbi) { + succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB); + if (bbi == bbe) { + double w = PI->getEdgeWeight(PI->getEdge(BB,0)); + if (w != ProfileInfo::MissingValue) { + DI.outWeight += w; + DI.outCount++; + } + } + for (;bbi != bbe; ++bbi) { if (ProcessedSuccs.insert(*bbi).second) { DI.outWeight += ReadOrAssert(PI->getEdge(BB,*bbi)); DI.outCount++; |