On 27 Oct 2011, at 11:33, Eric Botcazou wrote:

The crash is in find_valid_class() called from push_reload(), via this
code block around line 1184 of reload.c:

     enum reg_class in_out_class
        = find_valid_class (outmode, GET_MODE (SUBREG_REG (out)),
                            subreg_regno_offset (REGNO (SUBREG_REG (out)),
                                                 GET_MODE (SUBREG_REG (out)),
                                                 SUBREG_BYTE (out),
                                                 GET_MODE (out)),
                            REGNO (SUBREG_REG (out)));

'out' is:

(subreg:DI (reg/v:V4QI 50 %f18 [orig:314 s2hi4_ ] [314]) 0)

so subreg_regno_offset() returns -1, and find_valid_class() isn't too happy
about getting "-1" for it's 'n' argument.

OK, Alan's case is the same-sized and yours is the paradoxical one. Clearly we
shouldn't have tried to change anything for them.

Tentative fix attached, it should restore the old behavior for the cases where everything was working fine before. I'm going to give it some testing.


        PR rtl-optimization/46603
        * reload.c (push_reload): In the out case, restore previous behavior
        for subregs that don't have word mode.

powerpc darwin9 is also affected - I stage3-bubbled the patch above and libjava built OK (full reg-strap is a long job).
Iain

Reply via email to