From d004ec924de058f46076b23c0cf244d46e752ac7 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Fri, 23 Jul 2010 02:26:10 +0100 Subject: [PATCH] Fix errouneus reset of ss->threatMove After we set ss->threatMove we could go under a IID step that resets SearchStack ss and so also ss->threatMove. When later we use that field in futility pruning we have this set to MOVE_NONE ! The fix is to use a local variable and add threatMove to SplitPoint to pass this move to slaves. Spotted by Ralph Stoesser, fix suggested by Richard Vida. Signed-off-by: Marco Costalba --- src/search.cpp | 20 +++++++++++--------- src/search.h | 1 - src/thread.h | 1 + 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 7d5e45fc..35565d87 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -90,7 +90,7 @@ namespace { template void split(const Position& pos, SearchStack* ss, int ply, Value* alpha, const Value beta, Value* bestValue, - Depth depth, bool mateThreat, int* moveCount, MovePicker* mp, bool pvNode); + Depth depth, Move threatMove, bool mateThreat, int* moveCount, MovePicker* mp, bool pvNode); private: friend void poll(); @@ -364,7 +364,7 @@ void init_search() { // Called at the beginning of search() when starting to examine a new node. void SearchStack::init() { - currentMove = threatMove = bestMove = MOVE_NONE; + currentMove = bestMove = MOVE_NONE; } // SearchStack::initKillers() initializes killers for a search stack entry @@ -1026,6 +1026,7 @@ namespace { bool mateThreat = false; int moveCount = 0; int threadID = pos.thread(); + Move threatMove = MOVE_NONE; refinedValue = bestValue = value = -VALUE_INFINITE; oldAlpha = alpha; @@ -1190,10 +1191,10 @@ namespace { if (nullValue == value_mated_in(ply + 2)) mateThreat = true; - ss->threatMove = (ss+1)->currentMove; + threatMove = (ss+1)->currentMove; if ( depth < ThreatDepth && (ss-1)->reduction - && connected_moves(pos, (ss-1)->currentMove, ss->threatMove)) + && connected_moves(pos, (ss-1)->currentMove, threatMove)) return beta - 1; } } @@ -1282,7 +1283,7 @@ namespace { { // Move count based pruning if ( moveCount >= futility_move_count(depth) - && !(ss->threatMove && connected_threat(pos, move, ss->threatMove)) + && !(threatMove && connected_threat(pos, move, threatMove)) && bestValue > value_mated_in(PLY_MAX)) continue; @@ -1390,7 +1391,7 @@ namespace { && !TM.thread_should_stop(threadID) && Iteration <= 99) TM.split(pos, ss, ply, &alpha, beta, &bestValue, depth, - mateThreat, &moveCount, &mp, PvNode); + threatMove, mateThreat, &moveCount, &mp, PvNode); } // Step 19. Check for mate and stalemate @@ -1664,7 +1665,7 @@ namespace { { // Move count based pruning if ( moveCount >= futility_move_count(sp->depth) - && !(ss->threatMove && connected_threat(pos, move, ss->threatMove)) + && !(sp->threatMove && connected_threat(pos, move, sp->threatMove)) && sp->bestValue > value_mated_in(PLY_MAX)) { lock_grab(&(sp->lock)); @@ -2640,8 +2641,8 @@ namespace { template void ThreadsManager::split(const Position& p, SearchStack* ss, int ply, Value* alpha, - const Value beta, Value* bestValue, Depth depth, bool mateThreat, - int* moveCount, MovePicker* mp, bool pvNode) { + const Value beta, Value* bestValue, Depth depth, Move threatMove, + bool mateThreat, int* moveCount, MovePicker* mp, bool pvNode) { assert(p.is_ok()); assert(ply > 0 && ply < PLY_MAX); assert(*bestValue >= -VALUE_INFINITE); @@ -2674,6 +2675,7 @@ namespace { splitPoint.stopRequest = false; splitPoint.ply = ply; splitPoint.depth = depth; + splitPoint.threatMove = threatMove; splitPoint.mateThreat = mateThreat; splitPoint.alpha = *alpha; splitPoint.beta = beta; diff --git a/src/search.h b/src/search.h index 74951548..e2e76000 100644 --- a/src/search.h +++ b/src/search.h @@ -51,7 +51,6 @@ struct EvalInfo; struct SearchStack { Move currentMove; Move mateKiller; - Move threatMove; Move excludedMove; Move bestMove; Move killers[2]; diff --git a/src/thread.h b/src/thread.h index 17354773..c209e125 100644 --- a/src/thread.h +++ b/src/thread.h @@ -55,6 +55,7 @@ struct SplitPoint { bool pvNode, mateThreat; Value beta; int ply; + Move threatMove; SearchStack sstack[MAX_THREADS][PLY_MAX_PLUS_2]; // Const pointers to shared data -- 2.39.2