Ensure valueLower <= valueUpper
authorMarco Costalba <mcostalba@gmail.com>
Sun, 9 Dec 2012 12:43:04 +0000 (13:43 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 9 Dec 2012 13:14:44 +0000 (14:14 +0100)
In case a TTEntry stores both an upper and a lower bound
ensure that upper bound is not smaller than lower bound.

bench 1813815

src/tt.h

index 6c7caf75fce19bbab5c55886a26e6d75f27f47c1..c41f231e2a251ec8f3035a5509abdca3e6232635 100644 (file)
--- a/src/tt.h
+++ b/src/tt.h
@@ -59,20 +59,38 @@ public:
   void update(Value v, Bound b, Depth d, Move m, int g) {
 
     move16      = (uint16_t)m;
-    bound      |= (uint8_t)b;
     generation8 = (uint8_t)g;
 
+    if (bound == BOUND_EXACT)
+        bound = BOUND_UPPER | BOUND_LOWER; // Drop 'EXACT' flag
+
     if (b & BOUND_UPPER)
     {
         valueUpper = (int16_t)v;
         depthUpper = (int16_t)d;
+
+        if ((bound & BOUND_LOWER) && v < valueLower)
+        {
+            bound ^= BOUND_LOWER;
+            valueLower = VALUE_NONE;
+            depthLower = DEPTH_NONE;
+        }
     }
 
     if (b & BOUND_LOWER)
     {
         valueLower = (int16_t)v;
         depthLower = (int16_t)d;
+
+        if ((bound & BOUND_UPPER) && v > valueUpper)
+        {
+            bound ^= BOUND_UPPER;
+            valueUpper = VALUE_NONE;
+            depthUpper = DEPTH_NONE;
+        }
     }
+
+    bound |= (uint8_t)b;
   }
 
   void set_generation(int g) { generation8 = (uint8_t)g; }