diff options
author | Richard Earnshaw <rearnsha@arm.com> | 2003-10-24 08:47:18 +0000 |
---|---|---|
committer | Richard Earnshaw <rearnsha@gcc.gnu.org> | 2003-10-24 08:47:18 +0000 |
commit | 244b1afb66fc094953097790a6ea6a52d8321177 (patch) | |
tree | 938cb1276268aee27afea9ca9cf019afd17f5c4b | |
parent | bb88593883c783c600c89b8d1e5d7973c90d3f5a (diff) | |
download | gcc-244b1afb66fc094953097790a6ea6a52d8321177.tar.gz |
arm.c (note_invalid_constants): Try to extract the constant pool value using avoid_constant_pool_reference...
* arm.c (note_invalid_constants): Try to extract the constant
pool value using avoid_constant_pool_reference; only use
get_pool_constant if that returns the original reference.
From-SVN: r72883
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 20 |
2 files changed, 23 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4b59697d372..794eb0190d2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-10-24 Richard Earnshaw <rearnsha@arm.com> + + * arm.c (note_invalid_constants): Try to extract the constant + pool value using avoid_constant_pool_reference; only use + get_pool_constant if that returns the original reference. + 2003-10-24 Jan Hubicka <jh@suse.cz> PR c++/12624 diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 8a7997e30f3..2b1bf7a1389 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -6894,9 +6894,23 @@ note_invalid_constants (rtx insn, HOST_WIDE_INT address, int do_pushes) && CONSTANT_POOL_ADDRESS_P (XEXP (op, 0))) { if (do_pushes) - push_minipool_fix (insn, address, recog_data.operand_loc[opno], - recog_data.operand_mode[opno], - get_pool_constant (XEXP (op, 0))); + { + rtx cop = avoid_constant_pool_reference (op); + + /* Casting the address of something to a mode narrower + than a word can cause avoid_constant_pool_reference() + to return the pool reference itself. That's no good to + us here. Lets just hope that we can use the + constant pool value directly. */ + if (op == cop) + op = get_pool_constant (XEXP (op, 0)); + else + op = cop; + + push_minipool_fix (insn, address, + recog_data.operand_loc[opno], + recog_data.operand_mode[opno], op); + } result = true; } |