From: Richard Earnshaw Date: Fri, 24 Oct 2003 08:47:18 +0000 (+0000) Subject: arm.c (note_invalid_constants): Try to extract the constant pool value using avoid_co... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=244b1afb66fc094953097790a6ea6a52d8321177;p=gcc.git 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 --- 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 + + * 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 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; }