[patches] Re: GCC build failed for powerpc-eabisim with your patch on 2001-06-04T15:31:45Z.

Jan Hubicka jh@suse.cz
Tue Jun 5 07:25:00 GMT 2001


> 
> > 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>



More information about the Gcc-regression mailing list