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>
{
assert(move_is_ok(move));
{
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));
}
if (SpNode)
{
moveCount = ++sp->moveCount;
lock_release(&(sp->lock));
}
- else if (move == excludedMove)
- continue;
// Check for legality only before to do the move
if (!pos.pl_move_is_legal(move, pinned))
// Check for legality only before to do the move
if (!pos.pl_move_is_legal(move, pinned))
}
// Detect non-capture evasions that are candidate to be pruned
}
// 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());
&& bestValue > VALUE_MATED_IN_PLY_MAX
&& !pos.move_is_capture(move)
&& !pos.can_castle(pos.side_to_move());
pos.do_move(pv[0], *st++);
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())
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))
{
&& ply < PLY_MAX
&& (!pos.is_draw() || ply < 2))
{