aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-09-23 18:02:10 +0000
committerTed Kremenek <kremenek@apple.com>2008-09-23 18:02:10 +0000
commitfa708259cb518e87a2e7f636671b94a49f823608 (patch)
tree747f6b55c234d10bc653b4c85ac3a01680f57f98
parentb55a42bf9b5310551319c0f752a5cfa90beca048 (diff)
Fix PR 2819: Compute dataflow values for all CFG blocks by not relying on having the "Exit" block being reachable by all (or any) of the blocks in the CFG.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56492 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Analysis/FlowSensitive/DataflowSolver.h13
1 files changed, 4 insertions, 9 deletions
diff --git a/include/clang/Analysis/FlowSensitive/DataflowSolver.h b/include/clang/Analysis/FlowSensitive/DataflowSolver.h
index 169417c3d2..0ed4c8667f 100644
--- a/include/clang/Analysis/FlowSensitive/DataflowSolver.h
+++ b/include/clang/Analysis/FlowSensitive/DataflowSolver.h
@@ -187,7 +187,10 @@ private:
/// 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();
@@ -195,14 +198,6 @@ private:
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,