cse.c (cse_insn): Avoid subreg games if the equivalence is already in the proper...
authorRichard Henderson <rth@redhat.com>
Wed, 4 Sep 2002 23:03:31 +0000 (16:03 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 4 Sep 2002 23:03:31 +0000 (16:03 -0700)
        * cse.c (cse_insn): Avoid subreg games if the equivalence
        is already in the proper mode.

From-SVN: r56819

gcc/ChangeLog
gcc/cse.c

index ae3918f66d6ceaed56d5e6aa5e043bcb4a1ba8bc..d2d03983631ee971e10e1c44deb5ed44c276f628 100644 (file)
@@ -1,3 +1,8 @@
+2002-09-04  Richard Henderson  <rth@redhat.com>
+
+       * cse.c (cse_insn): Avoid subreg games if the equivalence
+       is already in the proper mode.
+
 2002-09-04  Eric Botcazou  <ebotcazou@multimania.com>
 
        PR c/7102
index afdc8daa8b03c38a349d2f3b779f001764d76d02..7f0365aa1736712f61aaf7a6de181d84d133e7f0 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -6203,14 +6203,23 @@ cse_insn (insn, libcall_insn)
                    && ! exp_equiv_p (elt->exp, elt->exp, 1, 0))
                  continue;
 
-               /* Calculate big endian correction for the SUBREG_BYTE
-                  (or equivalent).  We have already checked that M1
-                  ( GET_MODE (dest) ) is not narrower than M2 (new_mode).  */
-               if (BYTES_BIG_ENDIAN)
-                 byte = (GET_MODE_SIZE (GET_MODE (dest))
-                         - GET_MODE_SIZE (new_mode));
-               new_src = simplify_gen_subreg (new_mode, elt->exp,
-                                              GET_MODE (dest), byte);
+               /* We may have already been playing subreg games.  If the
+                  mode is already correct for the destination, use it.  */
+               if (GET_MODE (elt->exp) == new_mode)
+                 new_src = elt->exp;
+               else
+                 {
+                   /* Calculate big endian correction for the SUBREG_BYTE.
+                      We have already checked that M1 (GET_MODE (dest))
+                      is not narrower than M2 (new_mode).  */
+                   if (BYTES_BIG_ENDIAN)
+                     byte = (GET_MODE_SIZE (GET_MODE (dest))
+                             - GET_MODE_SIZE (new_mode));
+
+                   new_src = simplify_gen_subreg (new_mode, elt->exp,
+                                                  GET_MODE (dest), byte);
+                 }
+
                /* The call to simplify_gen_subreg fails if the value
                   is VOIDmode, yet we can't do any simplification, e.g.
                   for EXPR_LISTs denoting function call results.