This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patches] Re: GCC build failed for powerpc-eabisim with your patch on 2001-06-04T15:31:45Z.
>
> > So simple adding of offsets don't work. The checking code in
> > simplify_subreg refuses to construct the bogus subreg, that is why
> > the compiler aborts.
>
> Yes. The result would be wrong anyway, consider taking
Exactly.
we've constructed whole a bunch of incorrect subregs recently.
Most of code dealed with this bug by rounding back to multiple of the
outer_mode size. This is incorrect in some cases too, when we deal with
non-lowpart subregs.
>
> (subreg:HI (subreg:QI (reg:DI) 3) 0)
>
> it should be
>
> (subreg:HI (reg:DI) 2)
>
> not
>
> (subreg:HI (reg:DI) 3)
After my patching, it should work as follows - the subreg:QI is kept as it is,
the subreg:HI is discovered as paradoxical and difference should be added,
changing 3 to 2:
/* The SUBREG_BYTE represents offset, as if the value were stored
in memory. Irritating exception is paradoxical subreg, where
we define SUBREG_BYTE to be 0. On big endian machines, this
value should be negative. For a moment, undo this exception. */
if (byte == 0 && GET_MODE_SIZE (innermode) < GET_MODE_SIZE (outermode))
{
int difference = (GET_MODE_SIZE (innermode) - GET_MODE_SIZE (outermode));
if (WORDS_BIG_ENDIAN)
final_offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
if (BYTES_BIG_ENDIAN)
final_offset += difference % UNITS_PER_WORD;
}
difference is -1, so final_offset gets changed to 2.
Did you seen real example where the code in question fails currently?
I am nervous about the new failures...
Honza
>
> --
> - Geoffrey Keating <geoffk@geoffk.org>