Relax constrain in prevents_threat()
authorMarco Costalba <mcostalba@gmail.com>
Sat, 3 Nov 2012 14:48:34 +0000 (15:48 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sat, 3 Nov 2012 14:57:20 +0000 (15:57 +0100)
When testing if a move blocks the threat path there is no
reason to require the threat to be a slider. Indeed threat
can be a double pawn push like in this example:

r1bq1rk1/ppp1np1p/4n1p1/3p4/3P2Q1/2P1B3/PPBN2PP/R4RK1 w - - 0 16

Where white's move Rf6 blocks the threat f5.

As a nice side effect we can retire the now useless helper
piece_is_slider().

This patch kicks in only very rare cases, indeed the bench is
still the same!

bench: 5809010

src/search.cpp

index 35160b9665a39d6ed99bae69da65940ebf9f049b..03d05796ae69bd2df092183764604e9ac7f1d85d 100644 (file)
@@ -62,10 +62,6 @@ namespace {
   // Different node types, used as template parameter
   enum NodeType { Root, PV, NonPV, SplitPointRoot, SplitPointPV, SplitPointNonPV };
 
   // Different node types, used as template parameter
   enum NodeType { Root, PV, NonPV, SplitPointRoot, SplitPointPV, SplitPointNonPV };
 
-  // Lookup table to check if a Piece is a slider and its access function
-  const bool Slidings[18] = { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1 };
-  inline bool piece_is_slider(Piece p) { return Slidings[p]; }
-
   // Dynamic razoring margin based on depth
   inline Value razor_margin(Depth d) { return Value(512 + 16 * int(d)); }
 
   // Dynamic razoring margin based on depth
   inline Value razor_margin(Depth d) { return Value(512 + 16 * int(d)); }
 
@@ -1437,10 +1433,8 @@ split_point_start: // At split points actual search starts from here
             return true;
     }
 
             return true;
     }
 
-    // If the threat piece is a slider, don't prune safe moves which block it
-    if (    piece_is_slider(pos.piece_on(tfrom))
-        && (between_bb(tfrom, tto) & mto)
-        &&  pos.see_sign(move) >= 0)
+    // Don't prune safe moves which block the threat path
+    if ((between_bb(tfrom, tto) & mto) && pos.see_sign(move) >= 0)
         return true;
 
     return false;
         return true;
 
     return false;