Remove UdivSelf rewrite, add UdivZero rewrite
authorAndres Noetzli <noetzli@stanford.edu>
Wed, 14 Jun 2017 22:53:51 +0000 (15:53 -0700)
committerAndres Noetzli <noetzli@stanford.edu>
Wed, 14 Jun 2017 22:53:51 +0000 (15:53 -0700)
commit22a646e2322c1c571492bb2a835466c69047ce14
tree807f703fcc626d1af5c7b774ae5ed9d1488841be
parente8c8f864bdde2fbfc6ec7ec63928683cbd57ac0c
Remove UdivSelf rewrite, add UdivZero rewrite

This fixes bug 820. The issue was that (a udiv a) got rewriten to 1, which is
not correct when a is 0 (the result is all ones in that case). Even with the
--bv-div-zero-const flag disabled, the UdivSelf rewrite was incorrect because
it was applied to BITVECTOR_UDIV_TOTAL, which is "defined to be the all-ones
bit pattern, if divisor is 0" according to src/theory/bv/kinds . The commit
adds instead an optimization that returns all ones if the divisor of a
BITVECTOR_UDIV_TOTAL is zero.
src/theory/bv/theory_bv_rewrite_rules.h
src/theory/bv/theory_bv_rewrite_rules_simplification.h
src/theory/bv/theory_bv_rewriter.cpp