target/8087: sparc-sun-solaris2.7 C testsuite failures in execute/20020720-1.c w/-m64 or on sparcv9/sparc64
David S. Miller
davem@redhat.com
Mon Oct 7 11:27:00 GMT 2002
From: Roger Sayle <roger@eyesopen.com>
Date: Mon, 7 Oct 2002 12:04:10 -0600 (MDT)
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]
So does sparc32, at different stages of the compilation, for
example for something simple like "double foo(void){return 0.0;}"
the foo.c.00.rtl has:
(insn 11 10 13 (set (reg/f:SI 109)
(lo_sum:SI (reg:SI 110)
(symbol_ref/u:SI ("*.LLC0")))) -1 (nil)
(expr_list:REG_EQUAL (symbol_ref/u:SI ("*.LLC0"))
(nil)))
Which has the SYMBOL_REG inside of a LO_SUM construct.
Note, the "/u" flag means unchanging which means it is
a constant pool SYMBOL_REF.
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:
This looks perfectly fine to me. I think it will improve code
on all platforms that use LO_SUM, not just sparc64 and sparc32.
More information about the Gcc-bugs
mailing list