combine: Tweak change_zero_ext
authorSegher Boessenkool <segher@kernel.crashing.org>
Tue, 29 Nov 2016 05:44:32 +0000 (06:44 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Tue, 29 Nov 2016 05:44:32 +0000 (06:44 +0100)
change_zero_ext handles (zero_extend:M1 (subreg:M2 (reg:M1) ...))
already; this patch extends it to also deal with any
(zero_extend:M1 (subreg:M2 (reg:M3) ...)) where the subreg is not
paradoxical.

* combine.c (change_zero_ext): Also handle extends from a subreg
to a mode bigger than that of the operand of the subreg.

From-SVN: r242950

gcc/ChangeLog
gcc/combine.c

index 27f4137134a7de205f216aa9128bc8607f78f933..5ef1fcc04241a14f584f8b19dd6acd2070217917 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-29  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * combine.c (change_zero_ext): Also handle extends from a subreg
+       to a mode bigger than that of the operand of the subreg.
+
 2016-11-29  Segher Boessenkool  <segher@kernel.crashing.org>
 
        PR target/77687
index 41f69daf7f3bbe715701640b174296fd15b4ac30..22fb7a976538f8415b0faebc744387616da5850a 100644 (file)
@@ -11251,11 +11251,13 @@ change_zero_ext (rtx pat)
       else if (GET_CODE (x) == ZERO_EXTEND
               && SCALAR_INT_MODE_P (mode)
               && GET_CODE (XEXP (x, 0)) == SUBREG
-              && GET_MODE (SUBREG_REG (XEXP (x, 0))) == mode
+              && !paradoxical_subreg_p (XEXP (x, 0))
               && subreg_lowpart_p (XEXP (x, 0)))
        {
          size = GET_MODE_PRECISION (GET_MODE (XEXP (x, 0)));
          x = SUBREG_REG (XEXP (x, 0));
+         if (GET_MODE (x) != mode)
+           x = gen_lowpart_SUBREG (mode, x);
        }
       else if (GET_CODE (x) == ZERO_EXTEND
               && SCALAR_INT_MODE_P (mode)