Fix a logic bug in TranspositionTable::store()
authorMarco Costalba <mcostalba@gmail.com>
Mon, 10 Nov 2008 14:15:40 +0000 (15:15 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Mon, 10 Nov 2008 18:19:40 +0000 (19:19 +0100)
Make the logic work as advertised in the function
description.

Still a fallback from TT cleanup.

This should be less serious then the one in retrieve(),
but it's still a bug.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/tt.cpp

index 97ca23dc43a6ab3c926520f0194235533815c68f..fb524e303fa3a932be953775c03a64e410c4b39a 100644 (file)
@@ -124,12 +124,14 @@ void TranspositionTable::store(const Position &pos, Value v, Depth d,
         *(tte+i) = TTEntry(pos.get_key(), v, type, d, m, generation);
         return;
     }
-    if (   i == 0  // already is (replace == tte+i), common case
-        || replace->generation() < (tte+i)->generation())
+    if (i == 0)  // replace would be a no-op in this common case
         continue;
 
-    if (    replace->generation() > (tte+i)->generation()
-        || (tte+i)->depth() < replace->depth())
+    int c1 = (replace->generation() == generation ?  2 : 0);
+    int c2 = ((tte+i)->generation() == generation ? -2 : 0);
+    int c3 = ((tte+i)->depth() < replace->depth() ?  1 : 0);
+
+    if (c1 + c2 + c3 > 0)
         replace = tte+i;
   }
   *replace = TTEntry(pos.get_key(), v, type, d, m, generation);