Optimize generate_moves
authorTomasz Sobczyk <tomasz.sobczyk1997@gmail.com>
Sun, 10 Jan 2021 06:30:40 +0000 (03:30 -0300)
committerJoost VandeVondele <Joost.VandeVondele@gmail.com>
Wed, 13 Jan 2021 21:59:54 +0000 (22:59 +0100)
This change simplifies control flow in the generate_moves function which ensures the compiler doesn't duplicate work due to possibly not resolving pureness of the function calls. Also the biggest change is the removal of the unnecessary condition checking for empty b in a convoluted way. The rationale for removal of this condition is that computing attacks_bb with occupancy is not much more costly than computing pseudo attacks and overall the condition (also being likely unpredictable) is a pessimisation.

This is inspired by previous changes by @BM123499.

Passed STC:
LLR: 2.94 (-2.94,2.94) {-0.25,1.25}
Total: 88040 W: 8172 L: 7931 D: 71937
Ptnml(0-2): 285, 6128, 30957, 6361, 289
https://tests.stockfishchess.org/tests/view/5ffc28386019e097de3ef1c7

closes https://github.com/official-stockfish/Stockfish/pull/3300

No functional change.

src/movegen.cpp

index fafa65ee53f11100d396d717bb374ee32a5032aa..88c31cfa4856643e60ca45c64cfa53706aff1d97 100644 (file)
@@ -180,17 +180,17 @@ namespace {
 
     Bitboard bb = piecesToMove & pos.pieces(Pt);
 
+    if (!bb)
+        return moveList;
+
+    [[maybe_unused]] const Bitboard checkSquares = pos.check_squares(Pt);
+
     while (bb) {
         Square from = pop_lsb(&bb);
 
-        if (Checks && (Pt == BISHOP || Pt == ROOK || Pt == QUEEN)
-            && !(attacks_bb<Pt>(from) & target & pos.check_squares(Pt)))
-            continue;
-
         Bitboard b = attacks_bb<Pt>(from, pos.pieces()) & target;
-
-        if (Checks)
-            b &= pos.check_squares(Pt);
+        if constexpr (Checks)
+            b &= checkSquares;
 
         while (b)
             *moveList++ = make_move(from, pop_lsb(&b));