Remember when TT value equals static evaluation value
[stockfish] / src / search.cpp
index 434587a..022f3a9 100644 (file)
@@ -1455,7 +1455,7 @@ namespace {
     if (isCheck)
         staticValue = -VALUE_INFINITE;
 
-    else if (tte && tte->type() == VALUE_TYPE_EVAL)
+    else if (tte && (tte->type() == VALUE_TYPE_EVAL || tte->staticValue()))
     {
         // Use the cached evaluation score if possible
         assert(tte->value() == evaluate(pos, ei, threadID));
@@ -1569,10 +1569,21 @@ namespace {
     if (!pvNode)
     {
         Depth d = (depth == Depth(0) ? Depth(0) : Depth(-1));
+        Value v = value_to_tt(bestValue, ply);
+        TTEntry* e;
         if (bestValue < beta)
-            TT.store(pos, value_to_tt(bestValue, ply), d, MOVE_NONE, VALUE_TYPE_UPPER);
+            e = TT.store(pos, v, d, MOVE_NONE, VALUE_TYPE_UPPER);
         else
-            TT.store(pos, value_to_tt(bestValue, ply), d, MOVE_NONE, VALUE_TYPE_LOWER);
+            e = TT.store(pos, v, d, MOVE_NONE, VALUE_TYPE_LOWER);
+
+        assert(e && e == TT.retrieve(pos));
+        assert(!e->staticValue());
+
+        // If the just stored value happens to be equal to the static evaluation
+        // score then set the flag, so to avoid calling evaluation() next time we
+        // hit this position.
+        if (staticValue == v && !ei.futilityMargin)
+            e->setStaticValue();
     }
 
     // Update killers only for good check moves