On Tue, Jun 28, 2011 at 8:19 AM, Ulrich Weigand <uweig...@de.ibm.com> wrote:
> H.J. Lu wrote:
>> > it doesn't work;
>> >
>> > allocation.f: In function 'allocation':
>> > allocation.f:1048:0: internal compiler error: in subreg_get_info, at
>> > rtlanal.c:3235
>> > Please submit a full bug report,
>> > with preprocessed source if appropriate.
>> > See <http://gcc.gnu.org/bugs.html> for instructions.
>
>> > since subreg_regno_offset only works on hard registers.
>
> Hmm, OK.  That look like another latent bug in the original code ...
>
>> +         if (r->mode != VOIDmode && GET_MODE (reloadreg) != r->mode)
>> +           reloadreg = gen_rtx_REG (r->mode, REGNO (reloadreg));
>
> (As an aside, this is wrong; it's already wrong in the place where you
> copied it from.  This should now use reload_adjust_reg_for_mode just
> like subst_reload does.)
>
>> +
>> +         if ((WORDS_BIG_ENDIAN || BYTES_BIG_ENDIAN)
>> +             && GET_MODE_SIZE (Pmode) > GET_MODE_SIZE (ptr_mode))
>> +           {
>> +             offset = GET_MODE_SIZE (Pmode) - GET_MODE_SIZE (ptr_mode);
>> +             if (! BYTES_BIG_ENDIAN)
>> +               offset = (offset / UNITS_PER_WORD) * UNITS_PER_WORD;
>> +             else if (! WORDS_BIG_ENDIAN)
>> +               offset %= UNITS_PER_WORD;
>> +           }
>> +          else
>> +            offset = 0;
>> +
>> +         return gen_rtx_SUBREG (ptr_mode, reloadreg, offset);
>>
>> works for me.
>
> This doesn't seem correct either, it completely ignores the SUBREG_BYTE
> of the original SUBREG ...   Also, I don't quite see why this should
> have anything special for Pmode / ptr_mode.
>
> It seems simplest to just use simplify_gen_subreg here.  Can you try
> the following version?
>
> Thanks,
> Ulrich
>
>
> ChangeLog:
>
>        * reload.c (struct replacement): Remove SUBREG_LOC member.
>        (push_reload): Do not set it.
>        (push_replacement): Likewise.
>        (subst_reload): Remove dead code.
>        (copy_replacements): Remove assertion.
>        (copy_replacements_1): Do not handle SUBREG_LOC.
>        (move_replacements): Likewise.
>        (find_replacement): Remove dead code.  Use reload_adjust_reg_for_mode.
>        Detect subregs via recursive descent instead of via SUBREG_LOC.
>
>

It works much better.  I am testing it now.

Thanks.

-- 
H.J.

Reply via email to