summaryrefslogtreecommitdiff
path: root/src/ast
diff options
context:
space:
mode:
authorTuowen Zhao <ztuowen@gmail.com>2016-10-11 00:34:42 -0600
committerTuowen Zhao <ztuowen@gmail.com>2016-10-11 00:34:42 -0600
commit4e22699cb200c413a46f1affc38c89559a20c9e0 (patch)
tree7c8c98ac54f17592094958e496f4e87469dca40c /src/ast
parente142c6b56473fac13527225701ec68d4e47b8951 (diff)
downloadchill-4e22699cb200c413a46f1affc38c89559a20c9e0.tar.gz
chill-4e22699cb200c413a46f1affc38c89559a20c9e0.tar.bz2
chill-4e22699cb200c413a46f1affc38c89559a20c9e0.zip
working if
Diffstat (limited to 'src/ast')
-rw-r--r--src/ast/chillASTs.cc22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/ast/chillASTs.cc b/src/ast/chillASTs.cc
index 1e670a7..60603d2 100644
--- a/src/ast/chillASTs.cc
+++ b/src/ast/chillASTs.cc
@@ -856,10 +856,24 @@ class chillAST_Node *chillAST_BinaryOperator::constantFold() {
}
}
- //else fprintf(stderr, "can't fold op '%s' yet\n", op);
+ } else {// Only one side is constant
+ if ((getLHS()->isIntegerLiteral() && getLHS()->evalAsInt() == 0) ||
+ (getLHS()->isFloatingLiteral() && ((chillAST_FloatingLiteral*)getLHS())->value ==0)) {
+ if (streq(op,"+"))
+ return getRHS();
+ else if (streq(op,"-"))
+ return (new chillAST_UnaryOperator("-",true,getRHS()))->constantFold();
+ else if (streq(op,"*") || streq(op,"/"))
+ return new chillAST_IntegerLiteral(0);
+ } if ((getRHS()->isIntegerLiteral() && getRHS()->evalAsInt() == 0) ||
+ (getRHS()->isFloatingLiteral() && ((chillAST_FloatingLiteral*)getRHS())->value ==0)) {
+ if (streq(op,"+") || streq(op,"-"))
+ return getRHS();
+ else if (streq(op,"*"))
+ return new chillAST_IntegerLiteral(0);
+ }
}
- //fprintf(stderr, "returning "); returnval->print(0,stderr); fprintf(stderr, "\n");
return returnval;
}
@@ -1410,6 +1424,10 @@ chillAST_Node *chillAST_UnaryOperator::constantFold() {
returnval = F;
}
} else CHILL_DEBUG_PRINT("can't fold op '%s' yet\n", op);
+ } if (streq(op, "-") && getSubExpr()->isUnaryOperator()) {
+ chillAST_UnaryOperator *s = (chillAST_UnaryOperator*)getSubExpr();
+ if (streq(s->op,"-"))
+ returnval = s->getSubExpr();
}
return returnval;
}