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