summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>2003-10-24 08:47:18 +0000
committerRichard Earnshaw <rearnsha@gcc.gnu.org>2003-10-24 08:47:18 +0000
commit244b1afb66fc094953097790a6ea6a52d8321177 (patch)
tree938cb1276268aee27afea9ca9cf019afd17f5c4b
parentbb88593883c783c600c89b8d1e5d7973c90d3f5a (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/config/arm/arm.c20
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;
}