summaryrefslogtreecommitdiffstats
path: root/gcc/reload.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2002-10-17 15:13:10 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2002-10-17 15:13:10 +0000
commit6ac1948967783b44c7daf21200eb6cccf01ac7aa (patch)
tree8f8c5246b0eb528c5257757713c9e674e267a314 /gcc/reload.c
parentd06e19b2afa0b54a0d0ab2d0a27f729c9a917902 (diff)
downloadppe42-gcc-6ac1948967783b44c7daf21200eb6cccf01ac7aa.tar.gz
ppe42-gcc-6ac1948967783b44c7daf21200eb6cccf01ac7aa.zip
PR opt/7630
* reload.c (reload_inner_reg_of_subreg): New argument output; (push_reload): Update call. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58248 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/reload.c')
-rw-r--r--gcc/reload.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/gcc/reload.c b/gcc/reload.c
index 2b427226512..9b779beeabc 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 dup_replacements PARAMS ((rtx *, rtx *));
static void combine_reloads PARAMS ((void));
@@ -795,9 +795,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;
@@ -825,6 +826,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)
!= (int) HARD_REGNO_NREGS (REGNO (inner), GET_MODE (inner))));
@@ -1048,7 +1050,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;
@@ -1145,7 +1147,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
@@ -1733,7 +1735,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
OpenPOWER on IntegriCloud