simplify-rtx: Simplify sign_extend of lshiftrt to zero_extend (PR68330)
authorSegher Boessenkool <segher@kernel.crashing.org>
Mon, 16 Nov 2015 15:51:33 +0000 (16:51 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Mon, 16 Nov 2015 15:51:33 +0000 (16:51 +0100)
Since r230164, in PR68330 combine ends up with a sign_extend of an
lshiftrt by some constant, and it does not know to morph that into a
zero_extract (the extend will always extend with zeroes).  I think
it is best to let simplify-rtx always replace such a sign_extend by
a zero_extend, after which everything works as expected.

2015-11-15  Segher Boessenkool  <segher@kernel.crashing.org>

PR rtl-optimization/68330
* simplify-rtx.c (simplify_unary_operation_1): Simplify SIGN_EXTEND
of LSHIFTRT by a non-zero constant integer.

From-SVN: r230429

gcc/ChangeLog
gcc/simplify-rtx.c

index 020a00cddbedf59149c0f36ce2cdcce54ae833bb..d318d58633c4a560c1f2f95bc5f4704fb83376e5 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-16  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR rtl-optimization/68330
+       * simplify-rtx.c (simplify_unary_operation_1): Simplify SIGN_EXTEND
+       of LSHIFTRT by a non-zero constant integer.
+
 2015-11-16  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/68306
index c4fc42aebcf2d80c8747ecc6becf0f5f3b827e6d..413d61b17590ca465d6af0ed31a2bc4e09bbeab5 100644 (file)
@@ -1462,6 +1462,13 @@ simplify_unary_operation_1 (enum rtx_code code, machine_mode mode, rtx op)
            }
        }
 
+      /* (sign_extend:M (lshiftrt:N <X> (const_int I))) is better as
+         (zero_extend:M (lshiftrt:N <X> (const_int I))) if I is not 0.  */
+      if (GET_CODE (op) == LSHIFTRT
+         && CONST_INT_P (XEXP (op, 1))
+         && XEXP (op, 1) != const0_rtx)
+       return simplify_gen_unary (ZERO_EXTEND, mode, op, GET_MODE (op));
+
 #if defined(POINTERS_EXTEND_UNSIGNED)
       /* As we do not know which address space the pointer is referring to,
         we can do this only if the target does not support different pointer