Remember when TT value equals static evaluation value

When the stored TT value equals the static value set a
proper flag so to not call evaluation() if we hit the
same position again but use the stored TT value instead.

This is another trick to avoid calling costly evaluation()
in qsearch.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba
2009-03-30 08:54:09 +01:00
parent c6c4713ab2
commit 6a8e46d53e
3 changed files with 22 additions and 7 deletions

View 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