summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClark Barrett <barrett@cs.nyu.edu>2012-06-11 17:31:13 +0000
committerClark Barrett <barrett@cs.nyu.edu>2012-06-11 17:31:13 +0000
commita982d0ab03118e31c40052c9beae6ffaec5318aa (patch)
treea78b60a95353ae1d536ec191bb3bb6533f405564
parent74a3cbc108cda7f33c6d4db03fcec8a6a84fc6f5 (diff)
OK, now the rewrite issues are fixed
-rw-r--r--src/theory/bv/theory_bv_rewrite_rules_normalization.h8
-rw-r--r--src/theory/bv/theory_bv_rewriter.cpp14
-rw-r--r--src/theory/rewriter.cpp4
3 files changed, 18 insertions, 8 deletions
diff --git a/src/theory/bv/theory_bv_rewrite_rules_normalization.h b/src/theory/bv/theory_bv_rewrite_rules_normalization.h
index f5577e2ed..6ac9da7cb 100644
--- a/src/theory/bv/theory_bv_rewrite_rules_normalization.h
+++ b/src/theory/bv/theory_bv_rewrite_rules_normalization.h
@@ -300,10 +300,10 @@ Node RewriteRule<MultSimplify>::apply(TNode node) {
TNode current = node[i];
if (current.getKind() == kind::CONST_BITVECTOR) {
BitVector value = current.getConst<BitVector>();
- if(value == BitVector(size, (unsigned) 0)) {
+ constant = constant * value;
+ if(constant == BitVector(size, (unsigned) 0)) {
return utils::mkConst(size, 0);
}
- constant = constant * current.getConst<BitVector>();
} else {
children.push_back(current);
}
@@ -543,8 +543,8 @@ Node RewriteRule<SolveEq>::apply(TNode node) {
newRight = utils::mkSortedNode(kind::BITVECTOR_PLUS, childrenRight);
}
- Assert(newLeft == Rewriter::rewrite(newLeft));
- Assert(newRight == Rewriter::rewrite(newRight));
+ // Assert(newLeft == Rewriter::rewrite(newLeft));
+ // Assert(newRight == Rewriter::rewrite(newRight));
if (newLeft == newRight) {
Assert (newLeft == utils::mkConst(size, (unsigned)0));
diff --git a/src/theory/bv/theory_bv_rewriter.cpp b/src/theory/bv/theory_bv_rewriter.cpp
index 85ccbc787..25cbae68c 100644
--- a/src/theory/bv/theory_bv_rewriter.cpp
+++ b/src/theory/bv/theory_bv_rewriter.cpp
@@ -525,13 +525,21 @@ RewriteResponse TheoryBVRewriter::RewriteEqual(TNode node, bool preregister) {
Node resultNode = LinearRewriteStrategy
< RewriteRule<FailEq>,
RewriteRule<SimplifyEq>,
- RewriteRule<ReflexivityEq>,
- RewriteRule<SolveEq>
+ RewriteRule<ReflexivityEq>
>::apply(node);
+ if(RewriteRule<SolveEq>::applies(resultNode)) {
+ resultNode = RewriteRule<SolveEq>::run<false>(resultNode);
+ if (resultNode != node) {
+ return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
+ }
+ }
+
if(RewriteRule<BitwiseEq>::applies(resultNode)) {
resultNode = RewriteRule<BitwiseEq>::run<false>(resultNode);
- return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
+ if (resultNode != node) {
+ return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
+ }
}
return RewriteResponse(REWRITE_DONE, resultNode);
diff --git a/src/theory/rewriter.cpp b/src/theory/rewriter.cpp
index 7d5f541c0..0c5cada09 100644
--- a/src/theory/rewriter.cpp
+++ b/src/theory/rewriter.cpp
@@ -163,6 +163,7 @@ Node Rewriter::rewriteTo(theory::TheoryId theoryId, Node node) {
TheoryId newTheoryId = Theory::theoryOf(response.node);
if (newTheoryId != (TheoryId) rewriteStackTop.theoryId || response.status == REWRITE_AGAIN_FULL) {
// In the post rewrite if we've changed theories, we must do a full rewrite
+ Assert(response.node != rewriteStackTop.node);
rewriteStackTop.node = rewriteTo(newTheoryId, response.node);
break;
} else if (response.status == REWRITE_DONE) {
@@ -173,7 +174,8 @@ Node Rewriter::rewriteTo(theory::TheoryId theoryId, Node node) {
rewriteStackTop.node = response.node;
break;
}
- // Check for trivial rewrite loop of size 2
+ // Check for trivial rewrite loops of size 1 or 2
+ Assert(response.node != rewriteStackTop.node);
Assert(Rewriter::callPostRewrite((TheoryId) rewriteStackTop.theoryId, response.node).node != rewriteStackTop.node);
rewriteStackTop.node = response.node;
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback