]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Allow to prune also first move
[stockfish] / src / search.cpp
index 5d753e8ea7be3281332731b0617ecde637c266ee..ba31bd0221bc3a811a861c99c56d7c1df0025b2b 100644 (file)
@@ -948,6 +948,9 @@ split_point_start: // At split points actual search starts from here
     {
         lock_grab(&(sp->lock));
         bestValue = sp->bestValue;
+        moveCount = sp->moveCount;
+
+        assert(bestValue > -VALUE_INFINITE && moveCount > 0);
     }
 
     // Step 11. Loop through moves
@@ -1042,12 +1045,12 @@ split_point_start: // At split points actual search starts from here
           && !inCheck
           && !dangerous
           &&  move != ttMove
-          && !is_castle(move))
+          && !is_castle(move)
+          && (bestValue > VALUE_MATED_IN_PLY_MAX || bestValue == -VALUE_INFINITE))
       {
           // Move count based pruning
           if (   moveCount >= futility_move_count(depth)
-              && (!threatMove || !connected_threat(pos, move, threatMove))
-              && bestValue > VALUE_MATED_IN_PLY_MAX) // FIXME bestValue is racy
+              && (!threatMove || !connected_threat(pos, move, threatMove)))
           {
               if (SpNode)
                   lock_grab(&(sp->lock));
@@ -1065,20 +1068,13 @@ split_point_start: // At split points actual search starts from here
           if (futilityValue < beta)
           {
               if (SpNode)
-              {
                   lock_grab(&(sp->lock));
-                  if (futilityValue > sp->bestValue)
-                      sp->bestValue = bestValue = futilityValue;
-              }
-              else if (futilityValue > bestValue)
-                  bestValue = futilityValue;
 
               continue;
           }
 
           // Prune moves with negative SEE at low depths
           if (   predictedDepth < 2 * ONE_PLY
-              && bestValue > VALUE_MATED_IN_PLY_MAX
               && pos.see_sign(move) < 0)
           {
               if (SpNode)
@@ -1220,9 +1216,17 @@ split_point_start: // At split points actual search starts from here
     // case of StopRequest or thread.cutoff_occurred() are set, but this is
     // harmless because return value is discarded anyhow in the parent nodes.
     // If we are in a singular extension search then return a fail low score.
-    if (!SpNode && !moveCount)
+    if (!moveCount)
         return excludedMove ? oldAlpha : inCheck ? value_mated_in(ss->ply) : VALUE_DRAW;
 
+    // We have pruned all the moves, so return a fail-low score
+    if (bestValue == -VALUE_INFINITE)
+    {
+        assert(!playedMoveCount);
+
+        bestValue = alpha;
+    }
+
     // Step 21. Update tables
     // If the search is not aborted, update the transposition table,
     // history counters, and killer moves.