simplify-rtx.c (avoid_constant_pool_reference): Coerce the retrieved constant into the expected mode.

* simplify-rtx.c (avoid_constant_pool_reference): Coerce
        the retrieved constant into the expected mode.

From-SVN: r44321
This commit is contained in:
Richard Henderson 2001-07-24 16:43:55 -07:00 committed by Richard Henderson
parent ca9fef16af
commit 5a2aa3bd76
2 changed files with 27 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2001-07-24 Richard Henderson <rth@redhat.com>
* simplify-rtx.c (avoid_constant_pool_reference): Coerce
the retrieved constant into the expected mode.
Wed Jul 25 01:41:27 CEST 2001 Jan Hubicka <jh@suse.cz>
* flow.c (try_simplify_condjump): Avoid duplicated edges.

View File

@ -136,18 +136,36 @@ simplify_gen_binary (code, mode, op0, op1)
return gen_rtx_fmt_ee (code, mode, op0, op1);
}
/* In case X is MEM referencing constant pool, return the real value.
/* If X is a MEM referencing the constant pool, return the real value.
Otherwise return X. */
static rtx
avoid_constant_pool_reference (x)
rtx x;
{
rtx c, addr;
enum machine_mode cmode;
if (GET_CODE (x) != MEM)
return x;
if (GET_CODE (XEXP (x, 0)) != SYMBOL_REF
|| !CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)))
addr = XEXP (x, 0);
if (GET_CODE (addr) != SYMBOL_REF
|| ! CONSTANT_POOL_ADDRESS_P (addr))
return x;
return get_pool_constant (XEXP (x, 0));
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);
return c ? c : x;
}
return c;
}
/* Make a unary operation by first seeing if it folds and otherwise making