aboutsummaryrefslogtreecommitdiff
path: root/Analysis/ValueState.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Analysis/ValueState.cpp')
-rw-r--r--Analysis/ValueState.cpp34
1 files changed, 16 insertions, 18 deletions
diff --git a/Analysis/ValueState.cpp b/Analysis/ValueState.cpp
index 03b2996b65..ab208ff0fe 100644
--- a/Analysis/ValueState.cpp
+++ b/Analysis/ValueState.cpp
@@ -69,10 +69,14 @@ ValueStateManager::RemoveDeadBindings(ValueState St, Stmt* Loc,
MarkedSymbols.insert(*SI);
}
}
- else
+ else {
+ RVal X = I.getData();
+
+ if (X.isUninit() && cast<UninitializedVal>(X).getData())
+ continue;
+
NewSt.BlockExprBindings = Remove(NewSt, BlkExpr);
-
- continue;
+ }
}
// Iterate over the variable bindings.
@@ -209,7 +213,7 @@ ValueStateManager::AddEQ(ValueState St, SymbolID sym, const llvm::APSInt& V) {
return getPersistentState(NewSt);
}
-RVal ValueStateManager::GetRVal(ValueState St, Expr* E, bool* hasVal) {
+RVal ValueStateManager::GetRVal(ValueState St, Expr* E) {
for (;;) {
@@ -322,21 +326,15 @@ RVal ValueStateManager::GetRVal(ValueState St, Expr* E, bool* hasVal) {
ValueState::ExprBindingsTy::TreeTy* T = St->SubExprBindings.SlimFind(E);
- if (T) {
- if (hasVal) *hasVal = true;
- return T->getValue().second;
- }
-
- T = St->BlockExprBindings.SlimFind(E);
+ return T ? T->getValue().second : GetBlkExprRVal(St, E);
+}
+
+RVal ValueStateManager::GetBlkExprRVal(ValueState St, Expr* E) {
- if (T) {
- if (hasVal) *hasVal = true;
- return T->getValue().second;
- }
- else {
- if (hasVal) *hasVal = false;
- return UnknownVal();
- }
+ assert (!isa<ParenExpr>(E));
+
+ ValueState::ExprBindingsTy::TreeTy* T = St->BlockExprBindings.SlimFind(E);
+ return T ? T->getValue().second : UnknownVal();
}
RVal ValueStateManager::GetLVal(ValueState St, Expr* E) {