Store Eval::Info in Search::Stack
authorMarco Costalba <mcostalba@gmail.com>
Thu, 25 Apr 2013 19:51:05 +0000 (21:51 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Thu, 25 Apr 2013 19:52:26 +0000 (21:52 +0200)
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.

src/search.cpp
src/search.h

index 0bd1de4e57246b49e5e11a9ead90308a7aac2557..438c2d6fe858d85e1c72f1ed37c0ec73b74f48ce 100644 (file)
@@ -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)
index 7fe2749cea74fbe204aaab167be7be8f55288d24..1fa7d064930af4b818bfff4c7ca105bc81739b1b 100644 (file)
@@ -49,7 +49,7 @@ struct Stack {
   Value evalMargin;
   int skipNullMove;
   int futilityMoveCount;
-  Eval::Info* ei;
+  Eval::Info ei;
 };