aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib/Expr
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-06-16 02:54:09 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-06-16 02:54:09 +0000
commitae5eb7c65d8770795f33cbb27de1380b885b53d6 (patch)
treec31f0c21598996b201105967786ad55ee9dc9588 /lib/Expr
parent4fa1271fb51c2e5e889e2dc918c40f46886b9b71 (diff)
downloadklee-ae5eb7c65d8770795f33cbb27de1380b885b53d6.tar.gz
Add (very) basic constant folding for Mul.
git-svn-id: https://llvm.org/svn/llvm-project/klee/trunk@73460 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Expr')
-rw-r--r--lib/Expr/ExprBuilder.cpp23
-rw-r--r--lib/Expr/ExprPPrinter.cpp2
2 files changed, 23 insertions, 2 deletions
diff --git a/lib/Expr/ExprBuilder.cpp b/lib/Expr/ExprBuilder.cpp
index 098da6ea..bb6f28ec 100644
--- a/lib/Expr/ExprBuilder.cpp
+++ b/lib/Expr/ExprBuilder.cpp
@@ -829,7 +829,7 @@ namespace {
// X - (C + Y) ==> -C + (X - Y)
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(BE->left))
return Builder->Add(CE->Neg(), Builder->Sub(LHS, BE->right));
- // X - (Y + C) ==> -C + (X + Y);
+ // X - (Y + C) ==> -C + (X + Y)
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(BE->right))
return Builder->Add(CE->Neg(), Builder->Sub(LHS, BE->left));
break;
@@ -849,6 +849,27 @@ namespace {
return Base->Sub(LHS, RHS);
}
+
+ ref<Expr> Mul(const ref<ConstantExpr> &LHS,
+ const ref<NonConstantExpr> &RHS) {
+ if (LHS->isZero())
+ return LHS;
+ if (LHS->isOne())
+ return RHS;
+ // FIXME: Unbalance muls, fold constants through {sub,add}-with-constant,
+ // etc.
+ return Base->Mul(LHS, RHS);
+ }
+
+ ref<Expr> Mul(const ref<NonConstantExpr> &LHS,
+ const ref<ConstantExpr> &RHS) {
+ return Mul(RHS, LHS);
+ }
+
+ ref<Expr> Mul(const ref<NonConstantExpr> &LHS,
+ const ref<NonConstantExpr> &RHS) {
+ return Base->Mul(LHS, RHS);
+ }
};
typedef ConstantSpecializedExprBuilder<ConstantFoldingBuilder>
diff --git a/lib/Expr/ExprPPrinter.cpp b/lib/Expr/ExprPPrinter.cpp
index c78791ef..a2103b99 100644
--- a/lib/Expr/ExprPPrinter.cpp
+++ b/lib/Expr/ExprPPrinter.cpp
@@ -569,7 +569,7 @@ void ExprPPrinter::printQuery(std::ostream &os,
p.printSeparator(PC, q->isFalse(), indent-1);
PC << '[';
for (const ref<Expr> *it = evalExprsBegin; it != evalExprsEnd; ++it) {
- p.print(*it, PC);
+ p.print(*it, PC, /*printConstWidth*/true);
if (it + 1 != evalExprsEnd)
PC.breakLine(indent);
}