diff options
-rw-r--r-- | src/theory/bv/theory_bv_rewriter.cpp | 10 | ||||
-rw-r--r-- | test/regress/CMakeLists.txt | 1 | ||||
-rw-r--r-- | test/regress/regress0/fp/bvcomp-rewrite.smt2 | 5 | ||||
-rw-r--r-- | test/unit/theory/theory_bv_rewriter_white.cpp | 14 |
4 files changed, 27 insertions, 3 deletions
diff --git a/src/theory/bv/theory_bv_rewriter.cpp b/src/theory/bv/theory_bv_rewriter.cpp index d0579703d..476803c59 100644 --- a/src/theory/bv/theory_bv_rewriter.cpp +++ b/src/theory/bv/theory_bv_rewriter.cpp @@ -375,9 +375,13 @@ RewriteResponse TheoryBVRewriter::RewriteNor(TNode node, bool prerewrite) { 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); } diff --git a/test/regress/CMakeLists.txt b/test/regress/CMakeLists.txt index a3244ff4a..817ddc2ba 100644 --- a/test/regress/CMakeLists.txt +++ b/test/regress/CMakeLists.txt @@ -582,6 +582,7 @@ set(regress_0_tests 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 diff --git a/test/regress/regress0/fp/bvcomp-rewrite.smt2 b/test/regress/regress0/fp/bvcomp-rewrite.smt2 new file mode 100644 index 000000000..7c14ee58e --- /dev/null +++ b/test/regress/regress0/fp/bvcomp-rewrite.smt2 @@ -0,0 +1,5 @@ +(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) diff --git a/test/unit/theory/theory_bv_rewriter_white.cpp b/test/unit/theory/theory_bv_rewriter_white.cpp index 5ea8fa4dd..31d9cfac9 100644 --- a/test/unit/theory/theory_bv_rewriter_white.cpp +++ b/test/unit/theory/theory_bv_rewriter_white.cpp @@ -79,5 +79,19 @@ TEST_F(TestTheoryWhiteBvRewriter, rewrite_bv_ite) 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 |