From 53e04db93bd42a4f0a973bc1699e8bbb2ee25130 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 17 Oct 2002 18:52:27 +0200 Subject: [PATCH] re PR rtl-optimization/7630 (gcc 3.2 breaks on Mozilla 1.0's JS sources with -march=pentium4) PR opt/7630 * reload.c (reload_inner_reg_of_subreg): New argument output; (push_reload): Update call. From-SVN: r58250 --- gcc/ChangeLog | 6 ++++++ gcc/reload.c | 13 ++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 052f6aba6684..4bfd60d9ad93 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Thu Oct 17 17:14:07 CEST 2002 Jan Hubicka + + PR opt/7630 + * reload.c (reload_inner_reg_of_subreg): New argument output; + (push_reload): Update call. + Wed Apr 24 23:45:37 2002 J"orn Rennecke * calls.c (expand_call): Take current_function_pretend_args_size diff --git a/gcc/reload.c b/gcc/reload.c index 80678d0d7b9a..166e11066205 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -242,7 +242,7 @@ static int push_secondary_reload PARAMS ((int, rtx, int, int, enum reg_class, #endif static enum reg_class find_valid_class PARAMS ((enum machine_mode, int, unsigned int)); -static int reload_inner_reg_of_subreg PARAMS ((rtx, enum machine_mode)); +static int reload_inner_reg_of_subreg PARAMS ((rtx, enum machine_mode, int)); static void push_replacement PARAMS ((rtx *, int, enum machine_mode)); static void combine_reloads PARAMS ((void)); static int find_reusable_reload PARAMS ((rtx *, rtx, enum reg_class, @@ -794,9 +794,10 @@ find_reusable_reload (p_in, out, class, type, opnum, dont_share) SUBREG_REG expression. */ static int -reload_inner_reg_of_subreg (x, mode) +reload_inner_reg_of_subreg (x, mode, output) rtx x; enum machine_mode mode; + int output; { rtx inner; @@ -824,6 +825,7 @@ reload_inner_reg_of_subreg (x, mode) word and the number of regs for INNER is not the same as the number of words in INNER, then INNER will need reloading. */ return (GET_MODE_SIZE (mode) <= UNITS_PER_WORD + && output && GET_MODE_SIZE (GET_MODE (inner)) > UNITS_PER_WORD && ((GET_MODE_SIZE (GET_MODE (inner)) / UNITS_PER_WORD) != HARD_REGNO_NREGS (REGNO (inner), GET_MODE (inner)))); @@ -1047,7 +1049,7 @@ push_reload (in, out, inloc, outloc, class, /* Similar issue for (SUBREG constant ...) if it was not handled by the code above. This can happen if SUBREG_BYTE != 0. */ - if (in != 0 && reload_inner_reg_of_subreg (in, inmode)) + if (in != 0 && reload_inner_reg_of_subreg (in, inmode, 0)) { enum reg_class in_class = class; @@ -1144,7 +1146,7 @@ push_reload (in, out, inloc, outloc, class, However, we must reload the inner reg *as well as* the subreg in that case. In this case, the inner reg is an in-out reload. */ - if (out != 0 && reload_inner_reg_of_subreg (out, outmode)) + if (out != 0 && reload_inner_reg_of_subreg (out, outmode, 1)) { /* This relies on the fact that emit_reload_insns outputs the instructions for output reloads of type RELOAD_OTHER in reverse @@ -1722,7 +1724,8 @@ combine_reloads () && ! (GET_CODE (rld[i].in) == REG && reg_overlap_mentioned_for_reload_p (rld[i].in, rld[output_reload].out)))) - && ! reload_inner_reg_of_subreg (rld[i].in, rld[i].inmode) + && ! reload_inner_reg_of_subreg (rld[i].in, rld[i].inmode, + rld[i].when_needed != RELOAD_FOR_INPUT) && (reg_class_size[(int) rld[i].class] || SMALL_REGISTER_CLASSES) /* We will allow making things slightly worse by combining an -- 2.47.2