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.

Tested on powerpc64-linux.  This is needed for some of the rlwimi
testcases to be optimised properly.


Segher


2016-11-26  Segher Boessenkool  <seg...@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.

---
 gcc/combine.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/gcc/combine.c b/gcc/combine.c
index 4b3496b..2c3bcf1 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -11275,11 +11275,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)
-- 
1.9.3

Reply via email to