Commit bdb82177 by Paolo Bonzini Committed by Paolo Bonzini

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
parent 57a95bc4
2005-05-26 Paolo Bonzini <bonzini@gnu.org> 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>
* 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.
* df.c (DF_SUBREGS, df_local_def_available_p, df_insn_modified_p): New. * df.c (DF_SUBREGS, df_local_def_available_p, df_insn_modified_p): New.
......
...@@ -145,6 +145,7 @@ avoid_constant_pool_reference (rtx x) ...@@ -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) ...@@ -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); c = get_pool_constant (addr);
cmode = get_pool_mode (addr); cmode = get_pool_mode (addr);
/* If we're accessing the constant in a different mode than it was /* If we're accessing the constant in a different mode than it was
originally stored, attempt to fix that up via subreg simplifications. originally stored, attempt to fix that up via subreg simplifications.
If that fails we have no choice but to return the original memory. */ If that fails we have no choice but to return the original memory. */
if (cmode != GET_MODE (x)) if (offset != 0 || cmode != GET_MODE (x))
{ {
c = simplify_subreg (GET_MODE (x), c, cmode, 0); rtx tem = simplify_subreg (GET_MODE (x), c, cmode, offset);
return c ? c : x; 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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment