From: Marco Costalba Date: Thu, 25 Apr 2013 19:51:05 +0000 (+0200) Subject: Store Eval::Info in Search::Stack X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=2ef53ee368683d5aa62b028377b94efe961f18ac;hp=d810441b359508577b736d7b6410190ba13078f5 Store Eval::Info in Search::Stack Instead of a pointer. This should fix the issue of remaining with a stale pointer when for instance calling IID, but also null search verification, singular search and razoring where we call search with the same ss pointer. In this case ss->ei is overwritten in the search() call and upon returning remains stale. This patch could have a performance hit because Eval::Info is big (176 bytes) and during splitting we copy 4 ss entries. On the good side, this patch is a clean solution. Proposed by Gary. No functional change. --- diff --git a/src/search.cpp b/src/search.cpp index 0bd1de4e..438c2d6f 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -489,7 +489,6 @@ namespace { Move movesSearched[64]; StateInfo st; - Eval::Info ei; const TTEntry *tte; SplitPoint* splitPoint; Key posKey; @@ -524,7 +523,6 @@ namespace { bestValue = -VALUE_INFINITE; ss->currentMove = threatMove = (ss+1)->excludedMove = bestMove = MOVE_NONE; ss->ply = (ss-1)->ply + 1; - ss->ei = &ei; (ss+1)->skipNullMove = false; (ss+1)->reduction = DEPTH_ZERO; (ss+2)->killers[0] = (ss+2)->killers[1] = MOVE_NONE; @@ -594,7 +592,7 @@ namespace { // Never assume anything on values stored in TT if ( (ss->staticEval = eval = tte->eval_value()) == VALUE_NONE ||(ss->evalMargin = tte->eval_margin()) == VALUE_NONE) - eval = ss->staticEval = evaluate(pos, ss->evalMargin, &ei); + eval = ss->staticEval = evaluate(pos, ss->evalMargin, &ss->ei); // Can ttValue be used as a better position evaluation? if (ttValue != VALUE_NONE) @@ -604,7 +602,7 @@ namespace { } else { - eval = ss->staticEval = evaluate(pos, ss->evalMargin, &ei); + eval = ss->staticEval = evaluate(pos, ss->evalMargin, &ss->ei); TT.store(posKey, VALUE_NONE, BOUND_NONE, DEPTH_NONE, MOVE_NONE, ss->staticEval, ss->evalMargin); } @@ -1121,7 +1119,6 @@ split_point_start: // At split points actual search starts from here assert(depth <= DEPTH_ZERO); StateInfo st; - Eval::Info ei; const TTEntry* tte; Key posKey; Move ttMove, move, bestMove; @@ -1178,10 +1175,10 @@ split_point_start: // At split points actual search starts from here // Never assume anything on values stored in TT if ( (ss->staticEval = bestValue = tte->eval_value()) == VALUE_NONE ||(ss->evalMargin = tte->eval_margin()) == VALUE_NONE) - ss->staticEval = bestValue = evaluate(pos, ss->evalMargin, &ei); + ss->staticEval = bestValue = evaluate(pos, ss->evalMargin, &ss->ei); } else - ss->staticEval = bestValue = evaluate(pos, ss->evalMargin, &ei); + ss->staticEval = bestValue = evaluate(pos, ss->evalMargin, &ss->ei); // Stand pat. Return immediately if static value is at least beta if (bestValue >= beta) diff --git a/src/search.h b/src/search.h index 7fe2749c..1fa7d064 100644 --- a/src/search.h +++ b/src/search.h @@ -49,7 +49,7 @@ struct Stack { Value evalMargin; int skipNullMove; int futilityMoveCount; - Eval::Info* ei; + Eval::Info ei; };