combine: Omit redundant AND in change_zero_ext.
authorDominik Vogt <vogt@linux.vnet.ibm.com>
Mon, 19 Dec 2016 09:51:11 +0000 (09:51 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Mon, 19 Dec 2016 09:51:11 +0000 (09:51 +0000)
This is another micro-optimisation in change_zero_ext.  If an

  (and (lshiftrt ... (N)) (M))

generated by change_zero_ext is equivalent to just

  (lshiftrt ... (N))

(because the AND constant selects the N rightmost bits of the
result), strip off the AND.

gcc/ChangeLog:

2016-12-19  Dominik Vogt  <vogt@linux.vnet.ibm.com>

* combine.c (change_zero_ext): Skip generation of redundant AND.

From-SVN: r243792

gcc/ChangeLog
gcc/combine.c

index 57a1578caa319363aeaf844b6804e0d66e16e9af..3622483545c54a3a6127c7b1c675cd98616b6cd5 100644 (file)
@@ -1,3 +1,7 @@
+2016-12-19  Dominik Vogt  <vogt@linux.vnet.ibm.com>
+
+       * combine.c (change_zero_ext): Skip generation of redundant AND.
+
 2016-12-19  Krister Walfridsson  <krister.walfridsson@gmail.com>
 
        * config/netbsd.h (LINK_EH_SPEC): Define.
index 473ffc4a1321a610c8de7e77858d6badd9894b65..e74ff4c20a1f283830b2b484ab0560110fe6554e 100644 (file)
@@ -11289,8 +11289,13 @@ change_zero_ext (rtx pat)
       else
        continue;
 
-      wide_int mask = wi::mask (size, false, GET_MODE_PRECISION (mode));
-      x = gen_rtx_AND (mode, x, immed_wide_int_const (mask, mode));
+      if (!(GET_CODE (x) == LSHIFTRT
+           && CONST_INT_P (XEXP (x, 1))
+           && size + INTVAL (XEXP (x, 1)) == GET_MODE_PRECISION (mode)))
+       {
+         wide_int mask = wi::mask (size, false, GET_MODE_PRECISION (mode));
+         x = gen_rtx_AND (mode, x, immed_wide_int_const (mask, mode));
+       }
 
       SUBST (**iter, x);
       changed = true;