X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=022f3a9d15b8a08a5c78483490156051e4f732d7;hp=3617853e5f23d2f3589b7af48da9decbf48e4593;hb=6a8e46d53efca6dd56a396b32f43bef9f95127d6;hpb=5a0581498cde3d0904924d8ef7ed25ea1a2c855a diff --git a/src/search.cpp b/src/search.cpp index 3617853e..022f3a9d 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -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