simplify-rtx: The truncation of an IOR can have all bits set (PR81423)
authorSegher Boessenkool <segher@kernel.crashing.org>
Wed, 19 Jul 2017 19:28:41 +0000 (21:28 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Wed, 19 Jul 2017 19:28:41 +0000 (21:28 +0200)
... if it is an IOR with a constant with all bits set in the mode
that is truncated to, for example.  Handle that case.

PR rtl-optimization/81423
* simplify-rtx.c (simplify_truncation): Handle truncating an IOR
with a constant that is -1 in the truncated to mode.

From-SVN: r250363

gcc/ChangeLog
gcc/simplify-rtx.c

index 746b08ecb2d9e4d8468174f879a327af0f9b5304..4de6391a0f573b4fee5dc7342391d13cd3390090 100644 (file)
@@ -1,3 +1,9 @@
+2017-07-19  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR rtl-optimization/81423
+       * simplify-rtx.c (simplify_truncation): Handle truncating an IOR
+       with a constant that is -1 in the truncated to mode.
+
 2017-07-19  Jan Hubicka  <hubicka@ucw.cz>
 
        * predict.c (propagate_unlikely_bbs_forward): Break out from ...
index 3bce329924fc30ee81d697bb25d34848ca68f06e..ef414797af57ed32e51f22922652954116b88f9f 100644 (file)
@@ -857,6 +857,15 @@ simplify_truncation (machine_mode mode, rtx op,
     return simplify_gen_unary (TRUNCATE, mode, XEXP (op, 0),
                               GET_MODE (XEXP (op, 0)));
 
+  /* (truncate:A (ior X C)) is (const_int -1) if C is equal to that already,
+     in mode A.  */
+  if (GET_CODE (op) == IOR
+      && SCALAR_INT_MODE_P (mode)
+      && SCALAR_INT_MODE_P (op_mode)
+      && CONST_INT_P (XEXP (op, 1))
+      && trunc_int_for_mode (INTVAL (XEXP (op, 1)), mode) == -1)
+    return constm1_rtx;
+
   return NULL_RTX;
 }
 \f