From 452385a7205e963d02890bae566ba523a977c877 Mon Sep 17 00:00:00 2001 From: Segher Boessenkool Date: Tue, 29 Nov 2016 06:44:32 +0100 Subject: [PATCH] combine: Tweak change_zero_ext 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 | 5 +++++ gcc/combine.c | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 27f4137134a..5ef1fcc0424 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-11-29 Segher Boessenkool + + * 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 PR target/77687 diff --git a/gcc/combine.c b/gcc/combine.c index 41f69daf7f3..22fb7a97653 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -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) -- 2.30.2