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);
}
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));
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);
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) {
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;
}