X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovepick.cpp;h=638f81757d2af94d72c9b0c6739ab1d191d2c6f5;hp=f4f475fb18baa75d7cdb4535723d455daf14be4f;hb=35ada63174bbec6289d6dea6d3cfc5b5f14d1d27;hpb=c8af7a867e91e833f76b564f6f430c96829760bc diff --git a/src/movepick.cpp b/src/movepick.cpp index f4f475fb..638f8175 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -94,8 +94,16 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, else if (d == Depth(0)) phasePtr = QsearchWithChecksPhaseTable; else + { phasePtr = QsearchWithoutChecksPhaseTable; + // Skip TT move if is not a capture or a promotion, this avoids + // qsearch tree explosion due to a possible perpetual check or + // similar rare cases when TT table is full. + if (ttm != MOVE_NONE && !pos.move_is_capture_or_promotion(ttm)) + searchTT = ttMoves[0].move = MOVE_NONE; + } + phasePtr += !searchTT - 1; go_next_phase(); } @@ -141,7 +149,7 @@ void MovePicker::go_next_phase() { case PH_EVASIONS: assert(pos.is_check()); lastMove = generate_evasions(pos, moves); - score_evasions(); + score_evasions_or_checks(); return; case PH_QCAPTURES: @@ -150,8 +158,8 @@ void MovePicker::go_next_phase() { return; case PH_QCHECKS: - // Perhaps we should order moves move here? FIXME lastMove = generate_non_capture_checks(pos, moves); + score_evasions_or_checks(); return; case PH_STOP: @@ -224,7 +232,7 @@ void MovePicker::score_noncaptures() { } } -void MovePicker::score_evasions() { +void MovePicker::score_evasions_or_checks() { // Try good captures ordered by MVV/LVA, then non-captures if // destination square is not under attack, ordered by history // value, and at the end bad-captures and non-captures with a @@ -232,6 +240,10 @@ void MovePicker::score_evasions() { Move m; int seeScore; + // Skip if we don't have at least two moves to order + if (lastMove < moves + 2) + return; + for (MoveStack* cur = moves; cur != lastMove; cur++) { m = cur->move; @@ -250,6 +262,8 @@ void MovePicker::score_evasions() { /// are no more moves left. /// It picks the move with the biggest score from a list of generated moves taking /// care not to return the tt move if has already been searched previously. +/// Note that this function is not thread safe so should be lock protected by +/// caller when accessed through a shared MovePicker object. Move MovePicker::get_next_move() { @@ -339,17 +353,3 @@ Move MovePicker::get_next_move() { } } -/// A variant of get_next_move() which takes a lock as a parameter, used to -/// prevent multiple threads from picking the same move at a split point. - -Move MovePicker::get_next_move(Lock &lock) { - - lock_grab(&lock); - - // Note that it is safe to call many times - // get_next_move() when phase == PH_STOP - Move m = get_next_move(); - - lock_release(&lock); - return m; -}