simplify-rtx.c (avoid_constant_pool_reference): Support offsetted addresses in the constant pool.
2005-05-26 Paolo Bonzini <bonzini@gnu.org> * simplify-rtx.c (avoid_constant_pool_reference): Support offsetted addresses in the constant pool. From-SVN: r100198
This commit is contained in:
parent
57a95bc48d
commit
bdb8217782
@ -1,3 +1,8 @@
|
|||||||
|
2005-05-26 Paolo Bonzini <bonzini@gnu.org>
|
||||||
|
|
||||||
|
* simplify-rtx.c (avoid_constant_pool_reference): Support
|
||||||
|
offsetted addresses in the constant pool.
|
||||||
|
|
||||||
2005-05-26 Paolo Bonzini <bonzini@gnu.org>
|
2005-05-26 Paolo Bonzini <bonzini@gnu.org>
|
||||||
|
|
||||||
* df.h (DF_SUBREGS, df_local_def_available_p, df_insn_modified_p): New.
|
* df.h (DF_SUBREGS, df_local_def_available_p, df_insn_modified_p): New.
|
||||||
|
@ -145,6 +145,7 @@ avoid_constant_pool_reference (rtx x)
|
|||||||
{
|
{
|
||||||
rtx c, tmp, addr;
|
rtx c, tmp, addr;
|
||||||
enum machine_mode cmode;
|
enum machine_mode cmode;
|
||||||
|
HOST_WIDE_INT offset = 0;
|
||||||
|
|
||||||
switch (GET_CODE (x))
|
switch (GET_CODE (x))
|
||||||
{
|
{
|
||||||
@ -173,26 +174,40 @@ avoid_constant_pool_reference (rtx x)
|
|||||||
/* Call target hook to avoid the effects of -fpic etc.... */
|
/* Call target hook to avoid the effects of -fpic etc.... */
|
||||||
addr = targetm.delegitimize_address (addr);
|
addr = targetm.delegitimize_address (addr);
|
||||||
|
|
||||||
|
/* Split the address into a base and integer offset. */
|
||||||
|
if (GET_CODE (addr) == CONST
|
||||||
|
&& GET_CODE (XEXP (addr, 0)) == PLUS
|
||||||
|
&& GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST_INT)
|
||||||
|
{
|
||||||
|
offset = INTVAL (XEXP (XEXP (addr, 0), 1));
|
||||||
|
addr = XEXP (XEXP (addr, 0), 0);
|
||||||
|
}
|
||||||
|
|
||||||
if (GET_CODE (addr) == LO_SUM)
|
if (GET_CODE (addr) == LO_SUM)
|
||||||
addr = XEXP (addr, 1);
|
addr = XEXP (addr, 1);
|
||||||
|
|
||||||
if (GET_CODE (addr) != SYMBOL_REF
|
/* If this is a constant pool reference, we can turn it into its
|
||||||
|| ! CONSTANT_POOL_ADDRESS_P (addr))
|
constant and hope that simplifications happen. */
|
||||||
return x;
|
if (GET_CODE (addr) == SYMBOL_REF
|
||||||
|
&& CONSTANT_POOL_ADDRESS_P (addr))
|
||||||
c = get_pool_constant (addr);
|
|
||||||
cmode = get_pool_mode (addr);
|
|
||||||
|
|
||||||
/* If we're accessing the constant in a different mode than it was
|
|
||||||
originally stored, attempt to fix that up via subreg simplifications.
|
|
||||||
If that fails we have no choice but to return the original memory. */
|
|
||||||
if (cmode != GET_MODE (x))
|
|
||||||
{
|
{
|
||||||
c = simplify_subreg (GET_MODE (x), c, cmode, 0);
|
c = get_pool_constant (addr);
|
||||||
return c ? c : x;
|
cmode = get_pool_mode (addr);
|
||||||
|
|
||||||
|
/* If we're accessing the constant in a different mode than it was
|
||||||
|
originally stored, attempt to fix that up via subreg simplifications.
|
||||||
|
If that fails we have no choice but to return the original memory. */
|
||||||
|
if (offset != 0 || cmode != GET_MODE (x))
|
||||||
|
{
|
||||||
|
rtx tem = simplify_subreg (GET_MODE (x), c, cmode, offset);
|
||||||
|
if (tem && CONSTANT_P (tem))
|
||||||
|
return tem;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
return c;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make a unary operation by first seeing if it folds and otherwise making
|
/* Make a unary operation by first seeing if it folds and otherwise making
|
||||||
|
Loading…
Reference in New Issue
Block a user