]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Fix moveCount after legality check delay
[stockfish] / src / search.cpp
index e18a0aafb01405f8c3801fa0ed88b05a1b877799..dc6ad98b10a937d07997f52f8cf5faed61e8914a 100644 (file)
@@ -904,13 +904,18 @@ split_point_start: // At split points actual search starts from here
     {
       assert(move_is_ok(move));
 
+      if (move == excludedMove)
+          continue;
+
+      // At PV and SpNode nodes we want the moves to be legal
+      if ((PvNode || SpNode) && !pos.pl_move_is_legal(move, pinned))
+          continue;
+
       if (SpNode)
       {
           moveCount = ++sp->moveCount;
           lock_release(&(sp->lock));
       }
-      else if (move == excludedMove)
-          continue;
       else
           moveCount++;
 
@@ -1026,7 +1031,10 @@ split_point_start: // At split points actual search starts from here
 
       // Check for legality only before to do the move
       if (!pos.pl_move_is_legal(move, pinned))
+      {
+          moveCount--;
           continue;
+      }
 
       ss->currentMove = move;
 
@@ -1370,7 +1378,8 @@ split_point_start: // At split points actual search starts from here
       }
 
       // Detect non-capture evasions that are candidate to be pruned
-      evasionPrunable =   inCheck
+      evasionPrunable =   !PvNode
+                       && inCheck
                        && bestValue > VALUE_MATED_IN_PLY_MAX
                        && !pos.move_is_capture(move)
                        && !pos.can_castle(pos.side_to_move());
@@ -1995,12 +2004,10 @@ split_point_start: // At split points actual search starts from here
 
     pos.do_move(pv[0], *st++);
 
-    Bitboard pinned = pos.pinned_pieces(pos.side_to_move());
-
     while (   (tte = TT.probe(pos.get_key())) != NULL
            && tte->move() != MOVE_NONE
            && pos.move_is_pl(tte->move())
-           && pos.pl_move_is_legal(tte->move(), pinned)
+           && pos.pl_move_is_legal(tte->move(), pos.pinned_pieces(pos.side_to_move()))
            && ply < PLY_MAX
            && (!pos.is_draw() || ply < 2))
     {