target/8087: sparc-sun-solaris2.7 C testsuite failures in execute/20020720-1.c w/-m64 or on sparcv9/sparc64
Roger Sayle
roger@eyesopen.com
Mon Oct 7 11:18:00 GMT 2002
> The fixes that I'm still investigating address the sparc64 backend's
> convoluted constant pool loading code.
>
> There is nothing convoluted about it. That's a perfectly valid
> and fine way to output a load from the constant pool and expose
> all of the instructions to the compiler for scheduling purposes.
I beg to differ.
The sparc64 backend represents a load from the constant pool as:
(mem/u/f:DF (lo_sum:DI (reg/f:DI 110)
(symbol_ref/u:DI ("*.LLC0"))) [2 S8 A64]
The problem is that the code in "avoid_constant_pool_reference"
in simplify-rtx.c (line 149), assumes that constant pool references
are of the form "(mem (symbol_ref ...))". Indeed the macro
CONSTANT_POOL_ADDRESS_P assumes that it is always passed a naked
symbol_ref.
A possible fix may be to extend this test is also allow the constant
pool to be indexed via LO_SUM. Something like:
if (GET_CODE (x) != MEM)
return x;
addr = XEXP (x, 0)
+ if (GET_CODE (addr) == LO_SUM
+ && GET_CODE (XEXP (addr, 1)) == SYMBOL_REF)
+ addr = XEXP (addr, 1);
if (GET_CODE (addr) != SYMBOL_REF
|| ! CONSTANT_POOL_ADDRESS_P (addr))
return x;
Could someone that understands LO_SUM targets confirm that this is
a reasonable thing to do? I'm assuming that the ".LLC0" symbol_ref
will be correctly marked with CONSTANT_POOL_ADDRESS_P. If it is,
this should not only solve 20020720-1.c, but also enable many more
optimizations on sparc64. RTH?
Roger
--
More information about the Gcc-bugs
mailing list