Fix moveCount after legality check delay
authorMarco Costalba <mcostalba@gmail.com>
Sat, 28 May 2011 09:35:52 +0000 (10:35 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sat, 28 May 2011 10:16:00 +0000 (11:16 +0100)
We really want PV moves and also Split Point moves to be
legal to avoid messing the move counter and corresonding
PV move detection or shared Split Point's counter variable.

This fixes a real bug where a position with only one move
allowed returns bestValue == -VALUE_INFINITE if the move
turns out to be illegal.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
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))
     {