fixed BVMinisat bug due to not clearing seen properly
authorlianah <lianahady@gmail.com>
Fri, 13 Jun 2014 23:53:03 +0000 (19:53 -0400)
committerlianah <lianahady@gmail.com>
Fri, 13 Jun 2014 23:53:03 +0000 (19:53 -0400)
src/prop/bvminisat/core/Solver.cc
test/regress/regress0/bv/Makefile.am
test/regress/regress0/bv/unsound1-reduced.smt2 [new file with mode: 0644]
test/regress/regress0/bv/unsound1.smt2 [new file with mode: 0644]

index 8833eec78a126c3aefcc81d95b5d711bf334005c..e54c8d17443d9dd3855687e41cf4f74c8c649978 100644 (file)
@@ -489,13 +489,12 @@ void Solver::analyzeFinal2(Lit p, CRef confl_clause, vec<Lit>& out_conflict) {
     Var x = var(trail[i]);
     if (seen[x]) {
       if (reason(x) == CRef_Undef) {
-        // this is the case when p was a unit
-        if (x == var(p))
-          continue;
-        
-        assert (marker[x] == 2);
-        assert (level(x) > 0);
-        out_conflict.push(~trail[i]); 
+        // we skip p if was a learnt unit
+        if (x != var(p)) {
+          assert (marker[x] == 2);
+          assert (level(x) > 0);
+          out_conflict.push(~trail[i]);
+        }
       } else {
         Clause& c = ca[reason(x)];
         for (int j = 1; j < c.size(); j++)
@@ -504,6 +503,7 @@ void Solver::analyzeFinal2(Lit p, CRef confl_clause, vec<Lit>& out_conflict) {
       }
       seen[x] = 0;
     }
+    assert (seen[x] == 0); 
   }
   assert (out_conflict.size()); 
 }
index 4c2b1c7736ce70213fd4a1c4d85f19cf0e35ff5f..fa9ee41a1d37679dc889342e364b0106cc85f1a9 100644 (file)
@@ -91,7 +91,9 @@ SMT_TESTS = \
        fuzz40.smt \
        fuzz41.smt \
        calc2_sec2_shifter_mult_bmc15.atlas.delta01.smt \
-       smtcompbug.smt
+       smtcompbug.smt \
+       unsound1.smt2 \
+       unsound1-reduced.smt2
 
 # Regression tests for SMT2 inputs
 SMT2_TESTS = divtest.smt2
diff --git a/test/regress/regress0/bv/unsound1-reduced.smt2 b/test/regress/regress0/bv/unsound1-reduced.smt2
new file mode 100644 (file)
index 0000000..9485816
--- /dev/null
@@ -0,0 +1,11 @@
+(set-logic QF_BV)
+(set-info :status sat)
+(declare-fun v0 () (_ BitVec 2))
+(assert
+       (xor
+               (bvslt (_ bv0 5)
+                      (bvlshr (bvadd (_ bv5 5) ((_ sign_extend 3) v0)) ((_ sign_extend 3) v0)))
+                (bvult (_ bv5 5)
+                       (bvlshr (bvadd (_ bv5 5) ((_ sign_extend 3) v0)) ((_ sign_extend 3) v0)))))
+(check-sat)
+
diff --git a/test/regress/regress0/bv/unsound1.smt2 b/test/regress/regress0/bv/unsound1.smt2
new file mode 100644 (file)
index 0000000..60e7645
--- /dev/null
@@ -0,0 +1,23 @@
+(set-logic QF_BV)
+(set-info :status sat)
+(declare-fun v0 () (_ BitVec 4))
+(assert (let ((e1(_ bv0 1)))
+(let ((e2(_ bv11134 16)))
+(let ((e3 (bvadd e2 ((_ sign_extend 12) v0))))
+(let ((e4 (ite (= e2 ((_ sign_extend 12) v0)) (_ bv1 1) (_ bv0 1))))
+(let ((e5 (bvlshr e3 ((_ sign_extend 12) v0))))
+(let ((e6 (bvxnor e2 ((_ zero_extend 12) v0))))
+(let ((e7 (ite (bvult ((_ sign_extend 15) e1) e2) (_ bv1 1) (_ bv0 1))))
+(let ((e8 (bvugt e7 e1)))
+(let ((e9 (bvule ((_ sign_extend 3) e7) v0)))
+(let ((e10 (bvsgt e5 ((_ zero_extend 12) v0))))
+(let ((e11 (= e6 e3)))
+(let ((e12 (bvslt ((_ zero_extend 15) e4) e5)))
+(let ((e13 (bvugt e5 e2)))
+(let ((e14 (ite e10 e8 e10)))
+(let ((e15 (xor e13 e11)))
+(let ((e16 (xor e14 e15)))
+(let ((e17 (ite e9 e12 e16)))
+e17
+))))))))))))))))))
+(check-sat)