OSDN Git Service

* emit-rtl.c (gen_lowpart): When requesting the low-part of a
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 6 Mar 2003 21:59:09 +0000 (21:59 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 6 Mar 2003 21:59:09 +0000 (21:59 +0000)
MEM, try loading the MEM into a register and taking the low-part
of that, to help CSE see the use of the MEM in its true mode.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@63907 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/emit-rtl.c

index 8af6689..3850c98 100644 (file)
@@ -1,3 +1,9 @@
+2003-03-06  Roger Sayle  <roger@eyesopen.com>
+
+       * emit-rtl.c (gen_lowpart): When requesting the low-part of a
+       MEM, try loading the MEM into a register and taking the low-part
+       of that, to help CSE see the use of the MEM in its true mode.
+
 2002-03-05  Tom Tromey  <tromey@redhat.com>
 
        * config/stormy16/stormy16.h (DWARF_LINE_MIN_INSTR_LENGTH):
index dbc0a37..c96bc4e 100644 (file)
@@ -1371,6 +1371,12 @@ gen_lowpart (mode, x)
     {
       /* The only additional case we can do is MEM.  */
       int offset = 0;
+
+      /* The following exposes the use of "x" to CSE.  */
+      if (GET_MODE_SIZE (GET_MODE (x)) <= UNITS_PER_WORD
+         && ! no_new_pseudos)
+       return gen_lowpart (mode, force_reg (GET_MODE (x), x));
+
       if (WORDS_BIG_ENDIAN)
        offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
                  - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));