Commit 7c82a1ed by Ulrich Weigand Committed by Ulrich Weigand

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
parent 58db9d1a
2002-04-17 Ulrich Weigand <uweigand@de.ibm.com>
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 <aph@cambridge.redhat.com> 2002-04-16 Andrew Haley <aph@cambridge.redhat.com>
* doc/install.texi (Building): libgcj requires GNU make. * doc/install.texi (Building): libgcj requires GNU make.
......
...@@ -37,6 +37,7 @@ Boston, MA 02111-1307, USA. */ ...@@ -37,6 +37,7 @@ Boston, MA 02111-1307, USA. */
#include "function.h" #include "function.h"
#include "recog.h" #include "recog.h"
#include "expr.h" #include "expr.h"
#include "reload.h"
#include "toplev.h" #include "toplev.h"
#include "basic-block.h" #include "basic-block.h"
#include "integrate.h" #include "integrate.h"
...@@ -1189,15 +1190,21 @@ s390_expand_plus_operand (target, src, scratch_in) ...@@ -1189,15 +1190,21 @@ s390_expand_plus_operand (target, src, scratch_in)
if (GET_CODE (src) != PLUS || GET_MODE (src) != Pmode) if (GET_CODE (src) != PLUS || GET_MODE (src) != Pmode)
abort (); abort ();
sum1 = XEXP (src, 0); /* Check if any of the two operands is already scheduled
sum2 = XEXP (src, 1); 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, /* If one of the two operands is equal to the target,
make it the first one. */ make it the first one. If one is a constant, make
if (rtx_equal_p (target, sum2)) it the second one. */
if (rtx_equal_p (target, sum2)
|| GET_CODE (sum1) == CONST_INT)
{ {
sum2 = XEXP (src, 0); rtx tem = sum2;
sum1 = XEXP (src, 1); sum2 = sum1;
sum1 = tem;
} }
/* If the first operand is not an address register, /* If the first operand is not an address register,
...@@ -1210,8 +1217,11 @@ s390_expand_plus_operand (target, src, scratch_in) ...@@ -1210,8 +1217,11 @@ s390_expand_plus_operand (target, src, scratch_in)
/* Likewise for the second operand. However, take /* Likewise for the second operand. However, take
care not to clobber the target if we already used care not to clobber the target if we already used
it for the first operand. Use the scratch instead. */ it for the first operand. Use the scratch instead.
if (true_regnum (sum2) < 1 || true_regnum (sum2) > 15) 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)) if (!rtx_equal_p (target, sum1))
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment