summaryrefslogtreecommitdiff
path: root/src/split.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/split.c')
-rwxr-xr-xsrc/split.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/split.c b/src/split.c
index a1f9d32..f8da7ed 100755
--- a/src/split.c
+++ b/src/split.c
@@ -1138,6 +1138,27 @@ Return value:
//
// Decide how much (if any) to reduce this move's depth.
//
+ // Gate matches search.c's non-split move loop exactly (the
+ // preconditions used to live inside GetLMRReduction itself;
+ // a refactor moved them out to the caller in search.c but
+ // this call site was missed, so GetLMRReduction ran
+ // unconditionally here -- including on checking moves,
+ // captures, PV nodes, etc. -- and its own internal
+ // ASSERT(!InCheck(...)) could fire for any checking move
+ // that also passed the killer-move/fail-high filter still
+ // inside GetLMRReduction. Only reachable through a split
+ // (i.e. only under real multithreading), which is why this
+ // looked like a rare, hard-to-reproduce race rather than
+ // the deterministic missing-gate bug it actually was.
+ //
+ if ((uDepth > TWO_PLY) &&
+ !(ctx->sPlyInfo[ctx->uPly].fPvNode) &&
+ !(ctx->sPlyInfo[ctx->uPly - 1].fPvNode) &&
+ ((g_SplitInfo[u].uAlreadyDone + uMoveNum + 1) > 5) &&
+ (0 == iExtend) &&
+ (!IS_ESCAPING_CHECK(mv)) &&
+ (!IS_CAPTURE_OR_PROMOTION(mv)) &&
+ (!IS_CHECKING_MOVE(mv)))
{
INT iLMR = GetLMRReduction(iEval,
iAlpha,