summaryrefslogtreecommitdiff
path: root/src/analysis/expression.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-01 15:10:56 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-01 15:10:56 +0300
commit568b3f98e65737169a14eb18fde95ecd22e607d8 (patch)
treef5bad51b38d16e31c0bfe4094aaa5ff902ee451c /src/analysis/expression.cpp
parentd1a21baa5abad68ac83cad2206976628cce4d570 (diff)
downloadparanucker-568b3f98e65737169a14eb18fde95ecd22e607d8.tar.gz
paranucker-568b3f98e65737169a14eb18fde95ecd22e607d8.tar.bz2
paranucker-568b3f98e65737169a14eb18fde95ecd22e607d8.tar.xz
paranucker-568b3f98e65737169a14eb18fde95ecd22e607d8.zip
Fix different issues in useless variables checks.
Diffstat (limited to 'src/analysis/expression.cpp')
-rw-r--r--src/analysis/expression.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 8a9bf6d..87ee12f 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -211,6 +211,7 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo)
if (wi.needCheckNullVars.find(var) != wi.needCheckNullVars.end())
{
wo.checkedNonNullVars.insert(var);
+ wo.knownNonNullVars.insert(var);
wo.cleanExpr = true;
wo.uselessExpr = false;
return;
@@ -320,6 +321,7 @@ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo)
if (wi.needCheckNullVars.find(var) != wi.needCheckNullVars.end())
{
wo.checkedNullVars.insert(var);
+ wo.knownNullVars.insert(var);
wo.cleanExpr = true;
wo.uselessExpr = false;
if (wi.knownNullVars.find(var) != wi.knownNullVars.end())
@@ -347,9 +349,9 @@ void analyseOrCondition(Node *node, Node *node1, Node *node2, const WalkItem &wi
removeNeedCheckNullVarsSetAll(wi2, wo1.checkedNullVars);
wi2.needCheckNullVars.insert(wo1.checkedNonNullVars.begin(),
wo1.checkedNonNullVars.end());
- wi2.knownNonNullVars.insert(wo1.checkedNonNullVars.begin(),
+ wi2.knownVars.insert(wo1.checkedNonNullVars.begin(),
wo1.checkedNonNullVars.end());
- wi2.knownNullVars.insert(wo1.checkedNullVars.begin(),
+ wi2.knownVars.insert(wo1.checkedNullVars.begin(),
wo1.checkedNullVars.end());
Log::dumpWI(node, "wi2 ", wi2);
walkTree(node2, wi2, wo2);
@@ -360,9 +362,10 @@ void analyseOrCondition(Node *node, Node *node1, Node *node2, const WalkItem &wi
// probably condition wrong
if (wo2.cleanExpr)
mergeNullChecked(wo, wo2);
- // need check for cleanExpr?
intersectNonNullChecked(wo, wo1, wo2);
+ // need intersect knownNull/knownNonNull
+
wo.cleanExpr = true;
wo.stopWalking = true;
wo.uselessExpr = false;
@@ -400,6 +403,14 @@ void analyseAndCondition(Node *node, Node *node1, Node *node2, const WalkItem &w
{
mergeNonNullChecked(wo, wo2);
}
+ wo.knownNullVars.insert(wo1.knownNullVars.begin(),
+ wo1.knownNullVars.end());
+ wo.knownNullVars.insert(wo2.knownNullVars.begin(),
+ wo2.knownNullVars.end());
+ wo.knownNonNullVars.insert(wo1.knownNonNullVars.begin(),
+ wo1.knownNonNullVars.end());
+ wo.knownNonNullVars.insert(wo2.knownNonNullVars.begin(),
+ wo2.knownNonNullVars.end());
wo.cleanExpr = wo1.cleanExpr && wo2.cleanExpr;
wo.uselessExpr = wo1.uselessExpr && wo2.uselessExpr;
}