combine: Handle mode expanding zero_extracts in change_zero_ext.
authorDominik Vogt <vogt@linux.vnet.ibm.com>
Mon, 12 Dec 2016 18:23:48 +0000 (18:23 +0000)
committerSegher Boessenkool <segher@gcc.gnu.org>
Mon, 12 Dec 2016 18:23:48 +0000 (19:23 +0100)
Example:

  (zero_extract:DI (reg:SI)
                   (const_int 24)
                   (const_int 0))

-->

  (and:DI (subreg:DI (lshiftrt:SI (reg:SI) (const_int 8))
                     0)
          (const_int 16777215))

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

* combine.c (change_zero_ext): Handle mode expanding zero_extracts.

From-SVN: r243578

gcc/ChangeLog
gcc/combine.c

index 4e99e1f..d0ae5c6 100644 (file)
@@ -1,3 +1,7 @@
+2016-12-12  Dominik Vogt  <vogt@linux.vnet.ibm.com>
+
+       * combine.c (change_zero_ext): Handle mode expanding zero_extracts.
+
 2016-12-12  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/78738
index b429453..19851a2 100644 (file)
@@ -11237,18 +11237,24 @@ change_zero_ext (rtx pat)
       if (GET_CODE (x) == ZERO_EXTRACT
          && CONST_INT_P (XEXP (x, 1))
          && CONST_INT_P (XEXP (x, 2))
-         && GET_MODE (XEXP (x, 0)) == mode)
+         && GET_MODE (XEXP (x, 0)) != VOIDmode
+         && GET_MODE_PRECISION (GET_MODE (XEXP (x, 0)))
+             <= GET_MODE_PRECISION (mode))
        {
+         machine_mode inner_mode = GET_MODE (XEXP (x, 0));
+
          size = INTVAL (XEXP (x, 1));
 
          int start = INTVAL (XEXP (x, 2));
          if (BITS_BIG_ENDIAN)
-           start = GET_MODE_PRECISION (mode) - size - start;
+           start = GET_MODE_PRECISION (inner_mode) - size - start;
 
          if (start)
-           x = gen_rtx_LSHIFTRT (mode, XEXP (x, 0), GEN_INT (start));
+           x = gen_rtx_LSHIFTRT (inner_mode, XEXP (x, 0), GEN_INT (start));
          else
            x = XEXP (x, 0);
+         if (mode != inner_mode)
+           x = gen_lowpart_SUBREG (mode, x);
        }
       else if (GET_CODE (x) == ZERO_EXTEND
               && SCALAR_INT_MODE_P (mode)