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 | 753441e3181eb0a30e70822f220327342dad41d8 (patch) | |
| tree | e131b01b8da5be9f3a2c4a0c57f28b5274ef98d0 /llvm/lib/Analysis/ProfileVerifierPass.cpp | |
| parent | eba6c725d06aef4bf1ad28c88ae7997b45fb395b (diff) | |
| download | bcm5719-llvm-753441e3181eb0a30e70822f220327342dad41d8.tar.gz bcm5719-llvm-753441e3181eb0a30e70822f220327342dad41d8.zip | |
Make ProfileEstimator more robust on general CFGs.
llvm-svn: 81450
Diffstat (limited to 'llvm/lib/Analysis/ProfileVerifierPass.cpp')
| -rw-r--r-- | llvm/lib/Analysis/ProfileVerifierPass.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/ProfileVerifierPass.cpp b/llvm/lib/Analysis/ProfileVerifierPass.cpp index 16925222489..0be4de440fb 100644 --- a/llvm/lib/Analysis/ProfileVerifierPass.cpp +++ b/llvm/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++; |

