PR78590 shows a problem in change_zero_ext, where we change a zero_extend
of a subreg to a logical and.  We should only do this if the thing we are
taking the subreg of is a scalar integer, otherwise we will take a subreg
of (e.g.) a float in a different size, which is nonsensical and hits an

Tested on powerpc64-linux; committing to trunk.


2016-11-30  Segher Boessenkool  <>

        PR rtl-optimization/78590
        * combine.c (change_zero_ext): Transform zero_extend of subregs only
        if the subreg_reg is a scalar integer mode.

 gcc/combine.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/gcc/combine.c b/gcc/combine.c
index 5696eea9..fd33a4d 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -11285,6 +11285,7 @@ change_zero_ext (rtx pat)
       else if (GET_CODE (x) == ZERO_EXTEND
               && SCALAR_INT_MODE_P (mode)
               && GET_CODE (XEXP (x, 0)) == SUBREG
+              && SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (XEXP (x, 0))))
               && !paradoxical_subreg_p (XEXP (x, 0))
               && subreg_lowpart_p (XEXP (x, 0)))

Reply via email to