diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-02-08 19:17:19 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-02-08 19:17:19 +0000 |
commit | b87d9096d0bbce83fd5f79f2346dc49d1046e092 (patch) | |
tree | a634115cc92bb0fa631dbd07b7840ac11e481a97 /Analysis/GRConstants.cpp | |
parent | 071679dcace879f3ec861b7b2fb1ce44f4717538 (diff) |
Moved implementation of "RemoveDeadBindings" from the main
GRConstants logic to ValueStateManager.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46888 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Analysis/GRConstants.cpp')
-rw-r--r-- | Analysis/GRConstants.cpp | 76 |
1 files changed, 4 insertions, 72 deletions
diff --git a/Analysis/GRConstants.cpp b/Analysis/GRConstants.cpp index 75edb911e6..8a06b725b9 100644 --- a/Analysis/GRConstants.cpp +++ b/Analysis/GRConstants.cpp @@ -192,11 +192,13 @@ public: /// nodes by processing the 'effects' of a branch condition. void ProcessBranch(Expr* Condition, Stmt* Term, BranchNodeBuilder& builder); - /// RemoveDeadBindings - Return a new state that is the same as 'M' except + /// RemoveDeadBindings - Return a new state that is the same as 'St' except /// that all subexpression mappings are removed and that any /// block-level expressions that are not live at 'S' also have their /// mappings removed. - StateTy RemoveDeadBindings(Stmt* S, StateTy M); + inline StateTy RemoveDeadBindings(Stmt* S, StateTy St) { + return StateMgr.RemoveDeadBindings(St, S, Liveness); + } StateTy SetValue(StateTy St, Stmt* S, const RValue& V); @@ -509,76 +511,6 @@ void GRConstants::ProcessStmt(Stmt* S, StmtNodeBuilder& builder) { Builder = NULL; } -GRConstants::StateTy GRConstants::RemoveDeadBindings(Stmt* Loc, StateTy M) { - - // This code essentially performs a "mark-and-sweep" of the VariableBindings. - // The roots are any Block-level exprs and Decls that our liveness algorithm - // tells us are live. We then see what Decls they may reference, and keep - // those around. This code more than likely can be made faster, and the - // frequency of which this method is called should be experimented with - // for optimum performance. - - llvm::SmallVector<ValueDecl*, 10> WList; - - for (StateTy::vb_iterator I = M.begin(), E = M.end(); I!=E ; ++I) { - - // Remove old bindings for subexpressions. - if (I.getKey().isSubExpr()) { - M = StateMgr.Remove(M, I.getKey()); - continue; - } - - if (I.getKey().isBlkExpr()) { - if (Liveness.isLive(Loc, cast<Stmt>(I.getKey()))) { - if (isa<lval::DeclVal>(I.getData())) { - lval::DeclVal LV = cast<lval::DeclVal>(I.getData()); - WList.push_back(LV.getDecl()); - } - } - else - M = StateMgr.Remove(M, I.getKey()); - - continue; - } - - assert (I.getKey().isDecl()); - - if (VarDecl* V = dyn_cast<VarDecl>(cast<ValueDecl>(I.getKey()))) - if (Liveness.isLive(Loc, V)) - WList.push_back(V); - } - - llvm::SmallPtrSet<ValueDecl*, 10> Marked; - - while (!WList.empty()) { - ValueDecl* V = WList.back(); - WList.pop_back(); - - if (Marked.count(V)) - continue; - - Marked.insert(V); - - if (V->getType()->isPointerType()) { - const LValue& LV = cast<LValue>(GetValue(M, lval::DeclVal(V))); - - if (!isa<lval::DeclVal>(LV)) - continue; - - const lval::DeclVal& LVD = cast<lval::DeclVal>(LV); - WList.push_back(LVD.getDecl()); - } - } - - for (StateTy::vb_iterator I = M.begin(), E = M.end(); I!=E ; ++I) - if (I.getKey().isDecl()) - if (VarDecl* V = dyn_cast<VarDecl>(cast<ValueDecl>(I.getKey()))) - if (!Marked.count(V)) - M = StateMgr.Remove(M, V); - - return M; -} - GRConstants::NodeTy* GRConstants::Nodify(NodeSet& Dst, Stmt* S, NodeTy* Pred, StateTy St) { |