For reverse data flow analyses, enqueue the blocks in reverse order.
This more likely matches with the ideal order the blocks should be visited. This shaves another 1% off the -fsyntax-only time for compare.c (403.gcc). llvm-svn: 100030
This commit is contained in:
parent
b32b344c8f
commit
b43e06fa56
|
@ -196,10 +196,7 @@ private:
|
|||
/// SolveDataflowEquations - Perform the actual worklist algorithm
|
||||
/// to compute dataflow values.
|
||||
void SolveDataflowEquations(CFG& cfg, bool recordStmtValues) {
|
||||
// Enqueue all blocks to ensure the dataflow values are computed
|
||||
// for every block. Not all blocks are guaranteed to reach the exit block.
|
||||
for (CFG::iterator I=cfg.begin(), E=cfg.end(); I!=E; ++I)
|
||||
WorkList.enqueue(&**I);
|
||||
EnqueueBlocksOnWorklist(cfg, AnalysisDirTag());
|
||||
|
||||
while (!WorkList.isEmpty()) {
|
||||
const CFGBlock* B = WorkList.dequeue();
|
||||
|
@ -209,6 +206,22 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
void EnqueueBlocksOnWorklist(CFG &cfg, dataflow::forward_analysis_tag) {
|
||||
// Enqueue all blocks to ensure the dataflow values are computed
|
||||
// for every block. Not all blocks are guaranteed to reach the exit block.
|
||||
for (CFG::iterator I=cfg.begin(), E=cfg.end(); I!=E; ++I)
|
||||
WorkList.enqueue(&**I);
|
||||
}
|
||||
|
||||
void EnqueueBlocksOnWorklist(CFG &cfg, dataflow::backward_analysis_tag) {
|
||||
// Enqueue all blocks to ensure the dataflow values are computed
|
||||
// for every block. Not all blocks are guaranteed to reach the exit block.
|
||||
// Enqueue in reverse order since that will more likely match with
|
||||
// the order they should ideally processed by the dataflow algorithm.
|
||||
for (CFG::reverse_iterator I=cfg.rbegin(), E=cfg.rend(); I!=E; ++I)
|
||||
WorkList.enqueue(&**I);
|
||||
}
|
||||
|
||||
void ProcessMerge(CFG& cfg, const CFGBlock* B) {
|
||||
ValTy& V = TF.getVal();
|
||||
TF.SetTopValue(V);
|
||||
|
|
Loading…
Reference in New Issue