From 44e3d58b59099f5fd0e6f88893ce431171b3fef6 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Thu, 4 Jun 2009 08:08:21 +0000 Subject: Start removing uses of Expr::isConstant. - These should use cast<>, isa<>, or dyn_cast<> as appropriate (or better yet, changed to use ref when the type is known). git-svn-id: https://llvm.org/svn/llvm-project/klee/trunk@72857 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Expr/Expr.cpp | 167 +++++++++++++++++++++++----------------------- lib/Expr/ExprPPrinter.cpp | 16 ++--- lib/Expr/ExprUtil.cpp | 12 ++-- lib/Expr/ExprVisitor.cpp | 6 +- lib/Expr/Parser.cpp | 4 +- 5 files changed, 101 insertions(+), 104 deletions(-) (limited to 'lib/Expr') diff --git a/lib/Expr/Expr.cpp b/lib/Expr/Expr.cpp index 6cd15be7..0a174179 100644 --- a/lib/Expr/Expr.cpp +++ b/lib/Expr/Expr.cpp @@ -551,13 +551,12 @@ ref SExtExpr::create(const ref &e, Width w) { static ref AndExpr_create(Expr *l, Expr *r); static ref XorExpr_create(Expr *l, Expr *r); -static ref EqExpr_createPartial(Expr *l, const ref &cr); -static ref AndExpr_createPartialR(const ref &cl, Expr *r); -static ref SubExpr_createPartialR(const ref &cl, Expr *r); -static ref XorExpr_createPartialR(const ref &cl, Expr *r); +static ref EqExpr_createPartial(Expr *l, const ref &cr); +static ref AndExpr_createPartialR(const ref &cl, Expr *r); +static ref SubExpr_createPartialR(const ref &cl, Expr *r); +static ref XorExpr_createPartialR(const ref &cl, Expr *r); -static ref AddExpr_createPartialR(const ref &cl, Expr *r) { - assert(cl->isConstant() && "non-constant passed in place of constant"); +static ref AddExpr_createPartialR(const ref &cl, Expr *r) { uint64_t value = cl->getConstantValue(); Expr::Width type = cl->getWidth(); @@ -567,10 +566,10 @@ static ref AddExpr_createPartialR(const ref &cl, Expr *r) { return r; } else { Expr::Kind rk = r->getKind(); - if (rk==Expr::Add && r->getKid(0)->isConstant()) { // A + (B+c) == (A+B) + c + if (rk==Expr::Add && isa(r->getKid(0))) { // A + (B+c) == (A+B) + c return AddExpr::create(AddExpr::create(cl, r->getKid(0)), r->getKid(1)); - } else if (rk==Expr::Sub && r->getKid(0)->isConstant()) { // A + (B-c) == (A+B) - c + } else if (rk==Expr::Sub && isa(r->getKid(0))) { // A + (B-c) == (A+B) - c return SubExpr::create(AddExpr::create(cl, r->getKid(0)), r->getKid(1)); } else { @@ -578,7 +577,7 @@ static ref AddExpr_createPartialR(const ref &cl, Expr *r) { } } } -static ref AddExpr_createPartial(Expr *l, const ref &cr) { +static ref AddExpr_createPartial(Expr *l, const ref &cr) { return AddExpr_createPartialR(cr, l); } static ref AddExpr_create(Expr *l, Expr *r) { @@ -588,16 +587,16 @@ static ref AddExpr_create(Expr *l, Expr *r) { return XorExpr_create(l, r); } else { Expr::Kind lk = l->getKind(), rk = r->getKind(); - if (lk==Expr::Add && l->getKid(0)->isConstant()) { // (k+a)+b = k+(a+b) + if (lk==Expr::Add && isa(l->getKid(0))) { // (k+a)+b = k+(a+b) return AddExpr::create(l->getKid(0), AddExpr::create(l->getKid(1), r)); - } else if (lk==Expr::Sub && l->getKid(0)->isConstant()) { // (k-a)+b = k+(b-a) + } else if (lk==Expr::Sub && isa(l->getKid(0))) { // (k-a)+b = k+(b-a) return AddExpr::create(l->getKid(0), SubExpr::create(r, l->getKid(1))); - } else if (rk==Expr::Add && r->getKid(0)->isConstant()) { // a + (k+b) = k+(a+b) + } else if (rk==Expr::Add && isa(r->getKid(0))) { // a + (k+b) = k+(a+b) return AddExpr::create(r->getKid(0), AddExpr::create(l, r->getKid(1))); - } else if (rk==Expr::Sub && r->getKid(0)->isConstant()) { // a + (k-b) = k+(a-b) + } else if (rk==Expr::Sub && isa(r->getKid(0))) { // a + (k-b) = k+(a-b) return AddExpr::create(r->getKid(0), SubExpr::create(l, r->getKid(1))); } else { @@ -606,8 +605,7 @@ static ref AddExpr_create(Expr *l, Expr *r) { } } -static ref SubExpr_createPartialR(const ref &cl, Expr *r) { - assert(cl->isConstant() && "non-constant passed in place of constant"); +static ref SubExpr_createPartialR(const ref &cl, Expr *r) { Expr::Width type = cl->getWidth(); if (type==Expr::Bool) { @@ -625,7 +623,7 @@ static ref SubExpr_createPartialR(const ref &cl, Expr *r) { } } } -static ref SubExpr_createPartial(Expr *l, const ref &cr) { +static ref SubExpr_createPartial(Expr *l, const ref &cr) { assert(cr->isConstant() && "non-constant passed in place of constant"); uint64_t value = cr->getConstantValue(); Expr::Width width = cr->getWidth(); @@ -642,16 +640,16 @@ static ref SubExpr_create(Expr *l, Expr *r) { return ConstantExpr::alloc(0, type); } else { Expr::Kind lk = l->getKind(), rk = r->getKind(); - if (lk==Expr::Add && l->getKid(0)->isConstant()) { // (k+a)-b = k+(a-b) + if (lk==Expr::Add && isa(l->getKid(0))) { // (k+a)-b = k+(a-b) return AddExpr::create(l->getKid(0), SubExpr::create(l->getKid(1), r)); - } else if (lk==Expr::Sub && l->getKid(0)->isConstant()) { // (k-a)-b = k-(a+b) + } else if (lk==Expr::Sub && isa(l->getKid(0))) { // (k-a)-b = k-(a+b) return SubExpr::create(l->getKid(0), AddExpr::create(l->getKid(1), r)); - } else if (rk==Expr::Add && r->getKid(0)->isConstant()) { // a - (k+b) = (a-c) - k + } else if (rk==Expr::Add && isa(r->getKid(0))) { // a - (k+b) = (a-c) - k return SubExpr::create(SubExpr::create(l, r->getKid(1)), r->getKid(0)); - } else if (rk==Expr::Sub && r->getKid(0)->isConstant()) { // a - (k-b) = (a+b) - k + } else if (rk==Expr::Sub && isa(r->getKid(0))) { // a - (k-b) = (a+b) - k return SubExpr::create(AddExpr::create(l, r->getKid(1)), r->getKid(0)); } else { @@ -660,7 +658,7 @@ static ref SubExpr_create(Expr *l, Expr *r) { } } -static ref MulExpr_createPartialR(const ref &cl, Expr *r) { +static ref MulExpr_createPartialR(const ref &cl, Expr *r) { assert(cl->isConstant() && "non-constant passed in place of constant"); uint64_t value = cl->getConstantValue(); Expr::Width type = cl->getWidth(); @@ -675,7 +673,7 @@ static ref MulExpr_createPartialR(const ref &cl, Expr *r) { return MulExpr::alloc(cl, r); } } -static ref MulExpr_createPartial(Expr *l, const ref &cr) { +static ref MulExpr_createPartial(Expr *l, const ref &cr) { return MulExpr_createPartialR(cr, l); } static ref MulExpr_create(Expr *l, Expr *r) { @@ -688,8 +686,7 @@ static ref MulExpr_create(Expr *l, Expr *r) { } } -static ref AndExpr_createPartial(Expr *l, const ref &cr) { - assert(cr->isConstant() && "non-constant passed in place of constant"); +static ref AndExpr_createPartial(Expr *l, const ref &cr) { uint64_t value = cr->getConstantValue(); Expr::Width width = cr->getWidth(); @@ -701,15 +698,14 @@ static ref AndExpr_createPartial(Expr *l, const ref &cr) { return AndExpr::alloc(l, cr); } } -static ref AndExpr_createPartialR(const ref &cl, Expr *r) { +static ref AndExpr_createPartialR(const ref &cl, Expr *r) { return AndExpr_createPartial(r, cl); } static ref AndExpr_create(Expr *l, Expr *r) { return AndExpr::alloc(l, r); } -static ref OrExpr_createPartial(Expr *l, const ref &cr) { - assert(cr->isConstant() && "non-constant passed in place of constant"); +static ref OrExpr_createPartial(Expr *l, const ref &cr) { uint64_t value = cr->getConstantValue(); Expr::Width width = cr->getWidth(); @@ -721,15 +717,14 @@ static ref OrExpr_createPartial(Expr *l, const ref &cr) { return OrExpr::alloc(l, cr); } } -static ref OrExpr_createPartialR(const ref &cl, Expr *r) { +static ref OrExpr_createPartialR(const ref &cl, Expr *r) { return OrExpr_createPartial(r, cl); } static ref OrExpr_create(Expr *l, Expr *r) { return OrExpr::alloc(l, r); } -static ref XorExpr_createPartialR(const ref &cl, Expr *r) { - assert(cl->isConstant() && "non-constant passed in place of constant"); +static ref XorExpr_createPartialR(const ref &cl, Expr *r) { uint64_t value = cl->getConstantValue(); Expr::Width type = cl->getWidth(); @@ -746,7 +741,7 @@ static ref XorExpr_createPartialR(const ref &cl, Expr *r) { } } -static ref XorExpr_createPartial(Expr *l, const ref &cr) { +static ref XorExpr_createPartial(Expr *l, const ref &cr) { return XorExpr_createPartialR(cr, l); } static ref XorExpr_create(Expr *l, Expr *r) { @@ -811,34 +806,34 @@ static ref AShrExpr_create(const ref &l, const ref &r) { #define BCREATE_R(_e_op, _op, partialL, partialR) \ ref _e_op ::create(const ref &l, const ref &r) { \ - assert(l->getWidth()==r->getWidth() && "type mismatch"); \ - if (l->isConstant()) { \ - if (r->isConstant()) { \ - Expr::Width width = l->getWidth(); \ - uint64_t val = ints::_op(l->getConstantValue(), \ - r->getConstantValue(), width); \ - return ConstantExpr::create(val, width); \ - } else { \ - return _e_op ## _createPartialR(l, r.get()); \ - } \ - } else if (r->isConstant()) { \ - return _e_op ## _createPartial(l.get(), r); \ - } \ - return _e_op ## _create(l.get(), r.get()); \ + assert(l->getWidth()==r->getWidth() && "type mismatch"); \ + if (ConstantExpr *cl = dyn_cast(l)) { \ + if (ConstantExpr *cr = dyn_cast(r)) { \ + Expr::Width width = l->getWidth(); \ + uint64_t val = ints::_op(cl->getConstantValue(), \ + cr->getConstantValue(), width); \ + return ConstantExpr::create(val, width); \ + } else { \ + return _e_op ## _createPartialR(cl, r.get()); \ + } \ + } else if (ConstantExpr *cr = dyn_cast(r)) { \ + return _e_op ## _createPartial(l.get(), cr); \ + } \ + return _e_op ## _create(l.get(), r.get()); \ } #define BCREATE(_e_op, _op) \ ref _e_op ::create(const ref &l, const ref &r) { \ - assert(l->getWidth()==r->getWidth() && "type mismatch"); \ - if (l->isConstant()) { \ - if (r->isConstant()) { \ - Expr::Width width = l->getWidth(); \ - uint64_t val = ints::_op(l->getConstantValue(), \ - r->getConstantValue(), width); \ - return ConstantExpr::create(val, width); \ - } \ - } \ - return _e_op ## _create(l, r); \ + assert(l->getWidth()==r->getWidth() && "type mismatch"); \ + if (ConstantExpr *cl = dyn_cast(l)) { \ + if (ConstantExpr *cr = dyn_cast(r)) { \ + Expr::Width width = l->getWidth(); \ + uint64_t val = ints::_op(cl->getConstantValue(), \ + cr->getConstantValue(), width); \ + return ConstantExpr::create(val, width); \ + } \ + } \ + return _e_op ## _create(l, r); \ } BCREATE_R(AddExpr, add, AddExpr_createPartial, AddExpr_createPartialR) @@ -857,35 +852,35 @@ BCREATE(AShrExpr, ashr) #define CMPCREATE(_e_op, _op) \ ref _e_op ::create(const ref &l, const ref &r) { \ - assert(l->getWidth()==r->getWidth() && "type mismatch"); \ - if (l->isConstant()) { \ - if (r->isConstant()) { \ - Expr::Width width = l->getWidth(); \ - uint64_t val = ints::_op(l->getConstantValue(), \ - r->getConstantValue(), width); \ - return ConstantExpr::create(val, Expr::Bool); \ - } \ - } \ - return _e_op ## _create(l, r); \ + assert(l->getWidth()==r->getWidth() && "type mismatch"); \ + if (ConstantExpr *cl = dyn_cast(l)) { \ + if (ConstantExpr *cr = dyn_cast(r)) { \ + Expr::Width width = cl->getWidth(); \ + uint64_t val = ints::_op(cl->getConstantValue(), \ + cr->getConstantValue(), width); \ + return ConstantExpr::create(val, Expr::Bool); \ + } \ + } \ + return _e_op ## _create(l, r); \ } #define CMPCREATE_T(_e_op, _op, _reflexive_e_op, partialL, partialR) \ -ref _e_op ::create(const ref &l, const ref &r) { \ - assert(l->getWidth()==r->getWidth() && "type mismatch"); \ - if (l->isConstant()) { \ - if (r->isConstant()) { \ - Expr::Width width = l->getWidth(); \ - uint64_t val = ints::_op(l->getConstantValue(), \ - r->getConstantValue(), width); \ - return ConstantExpr::create(val, Expr::Bool); \ - } else { \ - return partialR(l, r.get()); \ - } \ - } else if (r->isConstant()) { \ - return partialL(l.get(), r); \ - } else { \ - return _e_op ## _create(l.get(), r.get()); \ - } \ +ref _e_op ::create(const ref &l, const ref &r) { \ + assert(l->getWidth()==r->getWidth() && "type mismatch"); \ + if (ConstantExpr *cl = dyn_cast(l)) { \ + if (ConstantExpr *cr = dyn_cast(r)) { \ + Expr::Width width = cl->getWidth(); \ + uint64_t val = ints::_op(cl->getConstantValue(), \ + cr->getConstantValue(), width); \ + return ConstantExpr::create(val, Expr::Bool); \ + } else { \ + return partialR(cl, r.get()); \ + } \ + } else if (ConstantExpr *cr = dyn_cast(r)) { \ + return partialL(l.get(), cr); \ + } else { \ + return _e_op ## _create(l.get(), r.get()); \ + } \ } @@ -972,7 +967,7 @@ static ref TryConstArrayOpt(const ref &cl, } -static ref EqExpr_createPartialR(const ref &cl, Expr *r) { +static ref EqExpr_createPartialR(const ref &cl, Expr *r) { assert(cl->isConstant() && "non-constant passed in place of constant"); uint64_t value = cl->getConstantValue(); Expr::Width width = cl->getWidth(); @@ -1031,14 +1026,16 @@ static ref EqExpr_createPartialR(const ref &cl, Expr *r) { const AddExpr *ae = cast(r); if (ae->left->isConstant()) { // c0 = c1 + b => c0 - c1 = b - return EqExpr_createPartialR(SubExpr::create(cl, ae->left), + return EqExpr_createPartialR(cast(SubExpr::create(cl, + ae->left)), ae->right.get()); } } else if (rk==Expr::Sub) { const SubExpr *se = cast(r); if (se->left->isConstant()) { // c0 = c1 - b => c1 - c0 = b - return EqExpr_createPartialR(SubExpr::create(se->left, cl), + return EqExpr_createPartialR(cast(SubExpr::create(se->left, + cl)), se->right.get()); } } else if (rk == Expr::Read && ConstArrayOpt) { @@ -1048,7 +1045,7 @@ static ref EqExpr_createPartialR(const ref &cl, Expr *r) { return EqExpr_create(cl, r); } -static ref EqExpr_createPartial(Expr *l, const ref &cr) { +static ref EqExpr_createPartial(Expr *l, const ref &cr) { return EqExpr_createPartialR(cr, l); } diff --git a/lib/Expr/ExprPPrinter.cpp b/lib/Expr/ExprPPrinter.cpp index e26568d9..94c0ac17 100644 --- a/lib/Expr/ExprPPrinter.cpp +++ b/lib/Expr/ExprPPrinter.cpp @@ -100,7 +100,7 @@ class PPrinter : public ExprPPrinter { } bool isVerySimple(const ref &e) { - return e->isConstant() || bindings.find(e)!=bindings.end(); + return isa(e) || bindings.find(e)!=bindings.end(); } bool isVerySimpleUpdate(const UpdateNode *un) { @@ -143,7 +143,7 @@ class PPrinter : public ExprPPrinter { } void scan1(const ref &e) { - if (!e->isConstant()) { + if (!isa(e)) { if (couldPrint.insert(e).second) { Expr *ep = e.get(); for (unsigned i=0; igetNumKids(); i++) @@ -208,7 +208,8 @@ class PPrinter : public ExprPPrinter { print(un->value, PC); //PC << ')'; - nextShouldBreak = !(un->index->isConstant() && un->value->isConstant()); + nextShouldBreak = !(isa(un->index) && + isa(un->value)); } if (openedList) @@ -367,9 +368,8 @@ public: print(e, PC); } - void printConst(const ref &e, PrintContext &PC, bool printWidth) { - assert(e->isConstant()); - + void printConst(const ref &e, PrintContext &PC, + bool printWidth) { if (e->getWidth() == Expr::Bool) PC << (e->getConstantValue() ? "true" : "false"); else { @@ -387,8 +387,8 @@ public: } void print(const ref &e, PrintContext &PC, bool printConstWidth=false) { - if (e->isConstant()) - printConst(e, PC, printConstWidth); + if (ConstantExpr *CE = dyn_cast(e)) + printConst(CE, PC, printConstWidth); else { std::map, unsigned>::iterator it = bindings.find(e); if (it!=bindings.end()) { diff --git a/lib/Expr/ExprUtil.cpp b/lib/Expr/ExprUtil.cpp index 780398f0..0c150a51 100644 --- a/lib/Expr/ExprUtil.cpp +++ b/lib/Expr/ExprUtil.cpp @@ -26,7 +26,7 @@ void klee::findReads(ref e, ExprHashSet visited; std::set updates; - if (!e->isConstant()) { + if (!isa(e)) { visited.insert(e); stack.push_back(e); } @@ -40,7 +40,7 @@ void klee::findReads(ref e, // repeats. results.push_back(re); - if (!re->index->isConstant() && + if (!isa(re->index) && visited.insert(re->index).second) stack.push_back(re->index); @@ -53,20 +53,20 @@ void klee::findReads(ref e, // head, which often will be shared among multiple nodes. if (updates.insert(re->updates.head).second) { for (const UpdateNode *un=re->updates.head; un; un=un->next) { - if (!un->index->isConstant() && + if (!isa(un->index) && visited.insert(un->index).second) stack.push_back(un->index); - if (!un->value->isConstant() && + if (!isa(un->value) && visited.insert(un->value).second) stack.push_back(un->value); } } } - } else if (!top->isConstant()) { + } else if (!isa(top)) { Expr *e = top.get(); for (unsigned i=0; igetNumKids(); i++) { ref k = e->getKid(i); - if (!k->isConstant() && + if (!isa(k) && visited.insert(k).second) stack.push_back(k); } diff --git a/lib/Expr/ExprVisitor.cpp b/lib/Expr/ExprVisitor.cpp index 5e9d0a81..c81199d7 100644 --- a/lib/Expr/ExprVisitor.cpp +++ b/lib/Expr/ExprVisitor.cpp @@ -22,7 +22,7 @@ namespace { using namespace klee; ref ExprVisitor::visit(const ref &e) { - if (!UseVisitorHash || e->isConstant()) { + if (!UseVisitorHash || isa(e)) { return visitActual(e); } else { visited_ty::iterator it = visited.find(e); @@ -38,7 +38,7 @@ ref ExprVisitor::visit(const ref &e) { } ref ExprVisitor::visitActual(const ref &e) { - if (e->isConstant()) { + if (isa(e)) { return e; } else { Expr &ep = *e.get(); @@ -106,7 +106,7 @@ ref ExprVisitor::visitActual(const ref &e) { if (recursive) e = visit(e); } - if (!e->isConstant()) { + if (!isa(e)) { res = visitExprPost(*e.get()); if (res.kind==Action::ChangeTo) e = res.argument; diff --git a/lib/Expr/Parser.cpp b/lib/Expr/Parser.cpp index 1808ca7b..c0cc05d5 100644 --- a/lib/Expr/Parser.cpp +++ b/lib/Expr/Parser.cpp @@ -947,8 +947,8 @@ ExprResult ParserImpl::ParseExtractParenExpr(const Token &Name, if (!OffsetExpr.isValid() || !Child.isValid()) return ConstantExpr::alloc(0, ResTy); - assert(OffsetExpr.get()->isConstant() && "ParseNumber returned non-constant."); - unsigned Offset = (unsigned) OffsetExpr.get()->getConstantValue(); + unsigned Offset = + (unsigned) cast(OffsetExpr.get())->getConstantValue(); if (Offset + ResTy > Child.get()->getWidth()) { Error("extract out-of-range of child expression.", Name); -- cgit 1.4.1