diff options
Diffstat (limited to 'src/split.c')
| -rwxr-xr-x | src/split.c | 21 |
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, |
