From: Alan Modra Date: Sat, 28 Jul 2012 00:04:10 +0000 (+0930) Subject: re PR target/54093 (ICE in in extract_insn, at recog.c:2129) X-Git-Tag: releases/gcc-4.8.0~4232 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6ad58e822ee297cd93f9855630a8ab4fc9ad4036;p=thirdparty%2Fgcc.git re PR target/54093 (ICE in in extract_insn, at recog.c:2129) PR target/54093 * config/rs6000/rs6000.c (rs6000_secondary_reload): Limit 32-bit multi-gpr reload to cases where predicate passes. Do the same for 64-bit multi-gpr reload. From-SVN: r189921 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bbff917e3569..ca2d9419c966 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-07-28 Alan Modra + + PR target/54093 + * config/rs6000/rs6000.c (rs6000_secondary_reload): Limit 32-bit + multi-gpr reload to cases where predicate passes. Do the same for + 64-bit multi-gpr reload. + 2012-07-27 Nathan Froyd * expmed.h (alg_hash, alg_hash_used_p, sdiv_pow2_cheap, diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index ef7d46fe3823..7bb984031785 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -13582,8 +13582,11 @@ rs6000_secondary_reload (bool in_p, && GET_MODE_SIZE (GET_MODE (x)) >= UNITS_PER_WORD) { rtx off = address_offset (XEXP (x, 0)); + unsigned int extra = GET_MODE_SIZE (GET_MODE (x)) - UNITS_PER_WORD; - if (off != NULL_RTX && (INTVAL (off) & 3) != 0) + if (off != NULL_RTX + && (INTVAL (off) & 3) != 0 + && (unsigned HOST_WIDE_INT) INTVAL (off) + 0x8000 < 0x10000 - extra) { if (in_p) sri->icode = CODE_FOR_reload_di_load; @@ -13601,10 +13604,17 @@ rs6000_secondary_reload (bool in_p, && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD) { rtx off = address_offset (XEXP (x, 0)); - + unsigned int extra = GET_MODE_SIZE (GET_MODE (x)) - UNITS_PER_WORD; + + /* We need a secondary reload only when our legitimate_address_p + says the address is good (as otherwise the entire address + will be reloaded). So for mode sizes of 8 and 16 this will + be when the offset is in the ranges [0x7ffc,0x7fff] and + [0x7ff4,0x7ff7] respectively. Note that the address we see + here may have been manipulated by legitimize_reload_address. */ if (off != NULL_RTX - && ((unsigned HOST_WIDE_INT) INTVAL (off) + 0x8000 - >= 0x1000u - (GET_MODE_SIZE (GET_MODE (x)) - UNITS_PER_WORD))) + && ((unsigned HOST_WIDE_INT) INTVAL (off) - (0x8000 - extra) + < UNITS_PER_WORD)) { if (in_p) sri->icode = CODE_FOR_reload_si_load;