]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
MATCH: `a | C -> C` when we know that `a & ~C == 0`
authorAndrew Pinski <apinski@marvell.com>
Sun, 20 Aug 2023 00:56:46 +0000 (17:56 -0700)
committerAndrew Pinski <apinski@marvell.com>
Fri, 25 Aug 2023 16:34:59 +0000 (09:34 -0700)
Even though this is handled by other code inside both VRP and CCP,
sometimes we want to optimize this outside of VRP and CCP.
An example is given in PR 106677 where phiopt will happen
after VRP (which removes a cast for a comparison) and then
phiopt will optimize the phi to be `a | 1` which can then
be optimized to `1` due to this patch.

OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

Note Similar code already exists in simplify_rtx for the RTL level;
it was moved from combine to simplify_rtx in r0-72539-gbd1ef757767f6d.
gcc/ChangeLog:

* match.pd (`a | C -> C`): New pattern.

gcc/match.pd

index cf0bb3a42170459ad54b5734b5ce04c21f581683..d9f35e9e25bc29dc1f969a31572f7201ef2d917b 100644 (file)
@@ -1456,6 +1456,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
  (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
       && wi::bit_and_not (get_nonzero_bits (@0), wi::to_wide (@1)) == 0)
   @0))
+/* x | C -> C if we know that x & ~C == 0.  */
+(simplify
+ (bit_ior SSA_NAME@0 INTEGER_CST@1)
+ (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
+      && wi::bit_and_not (get_nonzero_bits (@0), wi::to_wide (@1)) == 0)
+  @1))
 #endif
 
 /* ~(~X - Y) -> X + Y and ~(~X + Y) -> X - Y.  */