diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-06-16 02:54:09 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-06-16 02:54:09 +0000 |
commit | ae5eb7c65d8770795f33cbb27de1380b885b53d6 (patch) | |
tree | c31f0c21598996b201105967786ad55ee9dc9588 /lib/Expr/ExprBuilder.cpp | |
parent | 4fa1271fb51c2e5e889e2dc918c40f46886b9b71 (diff) | |
download | klee-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/ExprBuilder.cpp')
-rw-r--r-- | lib/Expr/ExprBuilder.cpp | 23 |
1 files changed, 22 insertions, 1 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> |