/// SolveDataflowEquations - Perform the actual worklist algorithm
/// to compute dataflow values.
void SolveDataflowEquations(CFG& cfg, bool recordStmtValues) {
- EnqueueFirstBlock(cfg,AnalysisDirTag());
+ // 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);
while (!WorkList.isEmpty()) {
const CFGBlock* B = WorkList.dequeue();
ProcessBlock(B, recordStmtValues, AnalysisDirTag());
UpdateEdges(cfg,B,TF.getVal());
}
- }
-
- void EnqueueFirstBlock(const CFG& cfg, dataflow::forward_analysis_tag) {
- WorkList.enqueue(&cfg.getEntry());
- }
-
- void EnqueueFirstBlock(const CFG& cfg, dataflow::backward_analysis_tag) {
- WorkList.enqueue(&cfg.getExit());
}
void ResetValues(CFG& cfg, ValTy& V, const CFGBlock* B,