This commit fixes an assertion failure in the rewriter on some of the
SMT-LIB QF_ABVFP benchmarks (the regression in this commit is the
minified version of
`non_incremental/QF_ABVFP/
20170428-Liew-KLEE/imperial_gsl_benchmarks_statistics_klee.x86_64/query.14.smt2`).
The problem was that after applying the `BvComp` rewrite, the bit-vector
rewriter was returning `REWRITE_DONE` instead of `REWRITE_AGAIN`. The
rewrite simplifies expressions of the form `bvcomp(t, c)` where `c` is a
constant of bit-width 1. If `c` is zero, then the rewrite returns
`bvnot(t)`. This node can potentially be rewritten further, e.g., if `t`
is `bvnot(x)`. This commit fixes the response and adds the corresponding
tests.
RewriteResponse TheoryBVRewriter::RewriteComp(TNode node, bool prerewrite)
{
- Node resultNode =
- LinearRewriteStrategy<RewriteRule<EvalComp>, RewriteRule<BvComp> >::apply(
- node);
+ Node resultNode = LinearRewriteStrategy<RewriteRule<EvalComp>>::apply(node);
+
+ if (node == resultNode && RewriteRule<BvComp>::applies(node))
+ {
+ resultNode = RewriteRule<BvComp>::run<false>(node);
+ return RewriteResponse(REWRITE_AGAIN, resultNode);
+ }
return RewriteResponse(REWRITE_DONE, resultNode);
}
regress0/fmf/tail_rec.smt2
regress0/fp/abs-unsound.smt2
regress0/fp/abs-unsound2.smt2
+ regress0/fp/bvcomp-rewrite.smt2
regress0/fp/down-cast-RNA.smt2
regress0/fp/ext-rew-test.smt2
regress0/fp/from_ubv.smt2
--- /dev/null
+(set-logic QF_FP)
+(declare-const x Float64)
+(assert (fp.isNaN (fp.sub roundNearestTiesToEven (fp.mul roundNearestTiesToEven x (fp (_ bv0 1) (_ bv2047 11) (_ bv1 52))) (fp.mul roundNearestTiesToEven x x))))
+(set-info :status sat)
+(check-sat)
Node nr = Rewriter::rewrite(n);
ASSERT_EQ(nr, Rewriter::rewrite(nr));
}
+
+TEST_F(TestTheoryWhiteBvRewriter, rewrite_bv_comp)
+{
+ TypeNode bvType = d_nodeManager->mkBitVectorType(1);
+ Node zero = d_nodeManager->mkConst(BitVector(1, 0u));
+ Node x = d_nodeManager->mkVar("x", bvType);
+ Node lhs = d_nodeManager->mkNode(BITVECTOR_NOT, x);
+ Node rhs = d_nodeManager->mkNode(BITVECTOR_AND, zero, zero);
+ Node n = d_nodeManager->mkNode(BITVECTOR_COMP, lhs, rhs);
+ Node nr = Rewriter::rewrite(n);
+ // bvcomp(bvnot(x), bvand(0, 0)) ---> x
+ ASSERT_EQ(nr, x);
+}
+
} // namespace test
} // namespace cvc5