]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Remember when TT value equals static evaluation value
[stockfish] / src / search.cpp
index 3617853e5f23d2f3589b7af48da9decbf48e4593..022f3a9d15b8a08a5c78483490156051e4f732d7 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));
@@ -1475,15 +1475,12 @@ namespace {
     Value bestValue = staticValue;
 
     if (bestValue >= beta)
-    {
-        // Update transposition table before to leave
-        TT.store(pos, value_to_tt(bestValue, ply), depth, MOVE_NONE, VALUE_TYPE_EXACT);
-        return bestValue;
-    }
-    else if (!isCheck && !tte && ei.futilityMargin == 0)
     {
         // Store the score to avoid a future costly evaluation() call
-        TT.store(pos, value_to_tt(bestValue, ply), Depth(-127*OnePly), MOVE_NONE, VALUE_TYPE_EVAL);
+        if (!isCheck && !tte && ei.futilityMargin == 0)
+            TT.store(pos, value_to_tt(bestValue, ply), Depth(-127*OnePly), MOVE_NONE, VALUE_TYPE_EVAL);
+
+        return bestValue;
     }
 
     if (bestValue > alpha)
@@ -1568,6 +1565,27 @@ namespace {
 
     assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
 
+    // Update transposition table
+    if (!pvNode)
+    {
+        Depth d = (depth == Depth(0) ? Depth(0) : Depth(-1));
+        Value v = value_to_tt(bestValue, ply);
+        TTEntry* e;
+        if (bestValue < beta)
+            e = TT.store(pos, v, d, MOVE_NONE, VALUE_TYPE_UPPER);
+        else
+            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
     Move m = ss[ply].currentMove;
     if (alpha >= beta && ok_to_history(pos, m)) // Only non capture moves are considered