summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-19 14:30:18 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-19 14:30:18 +0300
commitce0bfc35c5a5dbf66da347ac016509852a4775bb (patch)
tree579361b555788b804bb28f254e01e3a2ac6a5fcb
parent4bc731cce8c5d87e18e27b4119b12d844fa5f3ec (diff)
downloadparanucker-ce0bfc35c5a5dbf66da347ac016509852a4775bb.tar.gz
paranucker-ce0bfc35c5a5dbf66da347ac016509852a4775bb.tar.bz2
paranucker-ce0bfc35c5a5dbf66da347ac016509852a4775bb.tar.xz
paranucker-ce0bfc35c5a5dbf66da347ac016509852a4775bb.zip
Improve expression analysis.
-rw-r--r--src/analysis/analysis.cpp18
-rw-r--r--src/analysis/analysis.h2
-rw-r--r--src/analysis/expression.cpp27
-rw-r--r--src/analysis/statement.cpp8
4 files changed, 44 insertions, 11 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index 0deb2df..852eeb3 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -150,6 +150,24 @@ void mergeChecked(WalkItem &wi1, WalkItem &wi2)
wi2.checkedNonNullVars.end());
}
+void intersectChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2)
+{
+ FOR_EACH (std::set<std::string>::const_iterator,
+ it,
+ wi1.checkedNullVars)
+ {
+ if (wi2.checkedNullVars.find(*it) != wi2.checkedNullVars.end())
+ wi.checkedNullVars.insert(*it);
+ }
+ FOR_EACH (std::set<std::string>::const_iterator,
+ it,
+ wi2.checkedNonNullVars)
+ {
+ if (wi2.checkedNonNullVars.find(*it) != wi2.checkedNonNullVars.end())
+ wi.checkedNonNullVars.insert(*it);
+ }
+}
+
void analyseNode(Node *node, const WalkItem &wi, WalkItem &wo)
{
if (!node)
diff --git a/src/analysis/analysis.h b/src/analysis/analysis.h
index 7215850..5911b50 100644
--- a/src/analysis/analysis.h
+++ b/src/analysis/analysis.h
@@ -44,6 +44,8 @@ namespace Analysis
Node *skipNop(Node *node);
void mergeChecked(WalkItem &wi1, WalkItem &wi2);
+
+ void intersectChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2);
}
#endif // ANALYSIS_ANALYSIS_H
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 69047aa..69c9f69 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -150,13 +150,13 @@ void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem
if (node->args.size() < 2 || command == FindArgs)
return;
-// Log::dumpWI(node, "wo ", wo);
+ //Log::dumpWI(node, "wo in ", wo);
WalkItem wo1 = wo;
WalkItem wo2 = wo;
walkTree(node->args[0], wi, wo1);
walkTree(node->args[1], wi, wo2);
-// Log::dumpWI(node, "wo1 ", wo1);
-// Log::dumpWI(node, "wo2 ", wo2);
+ //Log::dumpWI(node, "wo1 ", wo1);
+ //Log::dumpWI(node, "wo2 ", wo2);
if (wo1.cleanExpr)
mergeChecked(wo, wo1);
if (wo2.cleanExpr)
@@ -164,6 +164,7 @@ void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem
wo.cleanExpr = false;
wo.stopWalking = true;
wo.uselessExpr = wo1.uselessExpr || wo2.uselessExpr;
+ //Log::dumpWI(node, "wo out ", wo);
}
void analyseTruthAndIfExpr(TruthAndIfExprNode *node, const WalkItem &wi, WalkItem &wo)
@@ -172,23 +173,33 @@ void analyseTruthAndIfExpr(TruthAndIfExprNode *node, const WalkItem &wi, WalkIte
if (node->args.size() < 2 || command == FindArgs)
return;
-// Log::dumpWI(node, "wo ", wo);
+ //Log::dumpWI(node, "wo in ", wo);
WalkItem wo1 = wo;
walkTree(node->args[0], wi, wo1);
WalkItem wo2 = wo1;
walkTree(node->args[1], wo1, wo2);
-// Log::dumpWI(node, "wo1 ", wo1);
-// Log::dumpWI(node, "wo2 ", wo2);
+ //Log::dumpWI(node, "wo1 ", wo1);
+ //Log::dumpWI(node, "wo2 ", wo2);
wo.stopWalking = true;
if (!wo1.uselessExpr && !wo2.uselessExpr)
{ // need combine wo1 and wo2
// for now empty simple merge, but must be compilated!
- mergeChecked(wo, wo1);
- mergeChecked(wo, wo2);
+ if (wo1.checkedNullVars == wo2.checkedNullVars)
+ {
+ wo.checkedNullVars.insert(wo2.checkedNullVars.begin(),
+ wo2.checkedNullVars.end());
+ }
+ if (wo1.checkedNonNullVars == wo2.checkedNonNullVars)
+ {
+ wo.checkedNonNullVars.insert(wo2.checkedNonNullVars.begin(),
+ wo2.checkedNonNullVars.end());
+ }
+ //intersectChecked(wo, wo1, wo2);
}
wo.cleanExpr = false;
wo.uselessExpr = wo1.uselessExpr || wo2.uselessExpr;
+ //Log::dumpWI(node, "wo out ", wo);
}
}
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
index d050a62..d11c57b 100644
--- a/src/analysis/statement.cpp
+++ b/src/analysis/statement.cpp
@@ -52,7 +52,7 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo)
WalkItem wci = wi;
WalkItem wco = wo;
walkTree(condNode, wci, wco);
-// Log::dumpWI(node, "wco ", wco);
+ //Log::dumpWI(node, "wco ", wco);
WalkItem wi2 = wi;
FOR_EACH (std::set<std::string>::const_iterator,
@@ -78,7 +78,8 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo)
wo.removeNullVars.clear();
- if (returned)
+// if (returned && wco.cleanExpr && !wco.uselessExpr)
+ if (returned && !wco.uselessExpr)
{
// add variable for ignore for all parent nodes except special like IF_STMT
FOR_EACH (std::set<std::string>::const_iterator,
@@ -89,7 +90,8 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo)
wo.checkNullVars.erase(*it);
}
}
- if (wo.isReturned)
+// if (wo.isReturned && wco.cleanExpr && !wco.uselessExpr)
+ if (wo.isReturned && !wco.uselessExpr)
{
// add variable for ignore for all parent nodes except special like IF_STMT
FOR_EACH (std::set<std::string>::const_iterator,