about summary refs log tree commit diff homepage
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);
     }