From: Ulrich Weigand Date: Wed, 17 Apr 2002 12:25:31 +0000 (+0000) Subject: re PR rtl-optimization/6305 (c++ gets ICE in reload_cse_simplify_operands) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7c82a1ed2b4523fb31eb8a33f0728a8cfc7feb6f;p=gcc.git re PR rtl-optimization/6305 (c++ gets ICE in reload_cse_simplify_operands) PR optimization/6305 * config/s390/s390.c (s390_expand_plus_operand): Use find_replacement to make sure previous reloads are taken into account. Generate better code if one operand is an in-range immediate constant. From-SVN: r52417 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2e1d28615fe..558fce4e83f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2002-04-17 Ulrich Weigand + + PR optimization/6305 + * config/s390/s390.c (s390_expand_plus_operand): Use find_replacement + to make sure previous reloads are taken into account. Generate + better code if one operand is an in-range immediate constant. + 2002-04-16 Andrew Haley * doc/install.texi (Building): libgcj requires GNU make. diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index c365f049854..131f6ecbb60 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -37,6 +37,7 @@ Boston, MA 02111-1307, USA. */ #include "function.h" #include "recog.h" #include "expr.h" +#include "reload.h" #include "toplev.h" #include "basic-block.h" #include "integrate.h" @@ -1189,15 +1190,21 @@ s390_expand_plus_operand (target, src, scratch_in) if (GET_CODE (src) != PLUS || GET_MODE (src) != Pmode) abort (); - sum1 = XEXP (src, 0); - sum2 = XEXP (src, 1); + /* Check if any of the two operands is already scheduled + for replacement by reload. This can happen e.g. when + float registers occur in an address. */ + sum1 = find_replacement (&XEXP (src, 0)); + sum2 = find_replacement (&XEXP (src, 1)); /* If one of the two operands is equal to the target, - make it the first one. */ - if (rtx_equal_p (target, sum2)) + make it the first one. If one is a constant, make + it the second one. */ + if (rtx_equal_p (target, sum2) + || GET_CODE (sum1) == CONST_INT) { - sum2 = XEXP (src, 0); - sum1 = XEXP (src, 1); + rtx tem = sum2; + sum2 = sum1; + sum1 = tem; } /* If the first operand is not an address register, @@ -1210,8 +1217,11 @@ s390_expand_plus_operand (target, src, scratch_in) /* Likewise for the second operand. However, take care not to clobber the target if we already used - it for the first operand. Use the scratch instead. */ - if (true_regnum (sum2) < 1 || true_regnum (sum2) > 15) + it for the first operand. Use the scratch instead. + Also, allow an immediate offset if it is in range. */ + if ((true_regnum (sum2) < 1 || true_regnum (sum2) > 15) + && !(GET_CODE (sum2) == CONST_INT + && INTVAL (sum2) >= 0 && INTVAL (sum2) < 4096)) { if (!rtx_equal_p (target, sum1)) {