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 e18a0aa..dc6ad98 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))
     {