From 75d001adddfaa7a2eb57af99cf6c57a12913d2d1 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sun, 16 Nov 2008 00:47:55 +0100 Subject: [PATCH] MovePicker: fix a nasty bug in EvalInfo optimization EvalInfo has missing attack info when a specialized endgame function is used. We missed this case and were using an empty attack bitboard instead so that no captures were generated for endgames. After testing the EvalInfo optimization gave worst results, so after a (long) debug session this nasty bug was found. Signed-off-by: Marco Costalba --- src/movepick.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/movepick.cpp b/src/movepick.cpp index b1dcea01..43f30f77 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -78,11 +78,14 @@ MovePicker::MovePicker(const Position& p, bool pv, Move ttm, numOfBadCaptures = 0; // With EvalInfo we are able to know how many captures are possible before - // generating them. So avoid generating them in case we know are zero. + // generating them. So avoid generating in case we know are zero. Color us = pos.side_to_move(); Color them = opposite_color(us); - bool noAttacks = ei && (ei->attackedBy[us][0] & pos.pieces_of_color(them)) == 0; - bool noCaptures = noAttacks && (pos.ep_square() == SQ_NONE) && !pos.has_pawn_on_7th(us); + bool noCaptures = ei + && (ei->attackedBy[us][0] & pos.pieces_of_color(them)) == 0 + && !ei->mi->specialized_eval_exists() + && (pos.ep_square() == SQ_NONE) + && !pos.has_pawn_on_7th(us); if (p.is_check()) phaseIndex = EvasionsPhaseIndex; @@ -93,7 +96,6 @@ MovePicker::MovePicker(const Position& p, bool pv, Move ttm, else phaseIndex = (noCaptures ? NoMovesPhaseIndex : QsearchWithoutChecksPhaseIndex); - dc = p.discovered_check_candidates(us); pinned = p.pinned_pieces(p.side_to_move()); -- 2.39.2