From 6d49a073b49d3f2f467ebf6cc36ec12f8a3ec012 Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Thu, 22 Jan 1998 14:48:58 +0000 Subject: [PATCH] Fix powerpc/rs6000 (subreg:SF (mem:SI ...)) reload problem. * reload.c (push_reload): In WORD_REGISTER_OPERATIONS code, add test to require the SUBREG mode to be smaller than the SUBREG_REG mode. * reload1.c (eliminate_regs): Likewise. From-SVN: r17444 --- gcc/ChangeLog | 6 ++++++ gcc/reload.c | 8 +++++--- gcc/reload1.c | 20 +++++++++++--------- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 26999e7e1a3..833b3285e6c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Thu Jan 22 14:47:31 1998 Jim Wilson + + * reload.c (push_reload): In WORD_REGISTER_OPERATIONS code, add test + to require the SUBREG mode to be smaller than the SUBREG_REG mode. + * reload1.c (eliminate_regs): Likewise. + Thu Jan 22 14:49:14 1998 Jeffrey A Law (law@cygnus.com) * regmove.c (find_matches): Initialize matches->earlyclobber too. diff --git a/gcc/reload.c b/gcc/reload.c index 983060a865a..2fcdd5a6aea 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -987,9 +987,11 @@ push_reload (in, out, inloc, outloc, class, && ((GET_MODE_SIZE (outmode) > GET_MODE_SIZE (GET_MODE (SUBREG_REG (out)))) #ifdef WORD_REGISTER_OPERATIONS - || ((GET_MODE_SIZE (outmode) - 1) / UNITS_PER_WORD == - ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (out))) - 1) - / UNITS_PER_WORD)) + || ((GET_MODE_SIZE (outmode) + < GET_MODE_SIZE (GET_MODE (SUBREG_REG (out)))) + && ((GET_MODE_SIZE (outmode) - 1) / UNITS_PER_WORD == + ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (out))) - 1) + / UNITS_PER_WORD))) #endif )) || (GET_CODE (SUBREG_REG (out)) == REG diff --git a/gcc/reload1.c b/gcc/reload1.c index 6de93b9b44b..01263c8e452 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -3122,17 +3122,19 @@ eliminate_regs (x, mem_mode, insn) int new_size = GET_MODE_SIZE (GET_MODE (new)); if (GET_CODE (new) == MEM - && x_size <= new_size + && ((x_size < new_size #ifdef WORD_REGISTER_OPERATIONS - /* On these machines, combine can create rtl of the form - (set (subreg:m1 (reg:m2 R) 0) ...) - where m1 < m2, and expects something interesting to - happen to the entire word. Moreover, it will use the - (reg:m2 R) later, expecting all bits to be preserved. - So if the number of words is the same, preserve the - subreg so that push_reloads can see it. */ - && ! ((x_size-1)/UNITS_PER_WORD == (new_size-1)/UNITS_PER_WORD) + /* On these machines, combine can create rtl of the form + (set (subreg:m1 (reg:m2 R) 0) ...) + where m1 < m2, and expects something interesting to + happen to the entire word. Moreover, it will use the + (reg:m2 R) later, expecting all bits to be preserved. + So if the number of words is the same, preserve the + subreg so that push_reloads can see it. */ + && ! ((x_size-1)/UNITS_PER_WORD == (new_size-1)/UNITS_PER_WORD) #endif + ) + || (x_size == new_size)) #ifdef LOAD_EXTEND_OP /* On these machines we will be reloading what is inside the SUBREG if it originally was a pseudo and -- 2.30.2