re PR rtl-optimization/66706 (Redundant bitmask instruction on x >> (n & 32))
authorSegher Boessenkool <segher@kernel.crashing.org>
Thu, 2 Jul 2015 16:27:11 +0000 (18:27 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Thu, 2 Jul 2015 16:27:11 +0000 (18:27 +0200)
PR rtl-optimization/66706
* combine.c (make_compound_operation): If an AND of SUBREG of
LSHIFTRT does not simplify, see if just the AND of SUBREG does.

From-SVN: r225344

gcc/ChangeLog
gcc/combine.c

index 3b15e2e2479863a4f74a94d2042e0249909c9f58..c358b6f1ec6c34e0066e96dd27cdb1e3b86402c0 100644 (file)
@@ -1,3 +1,9 @@
+2015-07-02  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR rtl-optimization/66706
+       * combine.c (make_compound_operation): If an AND of SUBREG of
+       LSHIFTRT does not simplify, see if just the AND of SUBREG does.
+
 2015-07-02  Alan Lawrence  <alan.lawrence@arm.com>
 
        * tree-pass.h (make_pass_ch_vect): New.
index 8eaae7c4e3e1e5cb461cdafc359a32d79b46ae88..b97aa10be0799ec53ce50f8a735959d58f3ab0c9 100644 (file)
@@ -7893,6 +7893,15 @@ make_compound_operation (rtx x, enum rtx_code in_code)
          new_rtx = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new_rtx, 0,
                                 XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
                                 0, in_code == COMPARE);
+
+         /* If that didn't give anything, see if the AND simplifies on
+            its own.  */
+         if (!new_rtx && i >= 0)
+           {
+             new_rtx = make_compound_operation (XEXP (x, 0), next_code);
+             new_rtx = make_extraction (mode, new_rtx, 0, NULL_RTX, i, 1,
+                                        0, in_code == COMPARE);
+           }
        }
       /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)).  */
       else if ((GET_CODE (XEXP (x, 0)) == XOR