OSDN Git Service

Fix cse bug that broke the ia64 port.
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Nov 1999 07:08:13 +0000 (07:08 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Nov 1999 07:08:13 +0000 (07:08 +0000)
* cse.c (cse_insn): Revert Oct 31 change.  When computing src_elt,
if REG_RETVAL check succeeds, then put classp in src_elt.

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

gcc/ChangeLog
gcc/cse.c

index 079b518..a5dec53 100644 (file)
@@ -1,3 +1,8 @@
+Thu Nov  4 23:07:14 1999  Jim Wilson  <wilson@cygnus.com>
+
+       * cse.c (cse_insn): Revert Oct 31 change.  When computing src_elt,
+       if REG_RETVAL check succeeds, then put classp in src_elt.
+
 Thu Nov  4 23:48:14 1999  Jeffrey A Law  (law@cygnus.com)
 
        * function.c (pad_to_arg_alignment): Only update argument_pad
index 406f879..bac710b 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -5730,9 +5730,8 @@ cse_insn (insn, libcall_insn)
         does not yet have an elt, and if so set the elt of the set source
         to src_eqv_elt.  */
       for (i = 0; i < n_sets; i++)
-       if (n_sets == 1
-           || (sets[i].rtl && sets[i].src_elt == 0
-               && rtx_equal_p (SET_SRC (sets[i].rtl), src_eqv)))
+       if (sets[i].rtl && sets[i].src_elt == 0
+           && rtx_equal_p (SET_SRC (sets[i].rtl), src_eqv))
          sets[i].src_elt = src_eqv_elt;
     }
 
@@ -5760,29 +5759,33 @@ cse_insn (insn, libcall_insn)
            enum machine_mode mode
              = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
 
-           /* Don't put a hard register source into the table if this is
-              the last insn of a libcall.  */
-           if (sets[i].src_elt == 0
-               && (GET_CODE (src) != REG
-                   || REGNO (src) >= FIRST_PSEUDO_REGISTER
-                   || ! find_reg_note (insn, REG_RETVAL, NULL_RTX)))
+           if (sets[i].src_elt == 0)
              {
-               register struct table_elt *elt;
-
-               /* Note that these insert_regs calls cannot remove
-                  any of the src_elt's, because they would have failed to
-                  match if not still valid.  */
-               if (insert_regs (src, classp, 0))
+               /* Don't put a hard register source into the table if this is
+                  the last insn of a libcall.  In this case, we only need
+                  to put src_eqv_elt in src_elt.  */
+               if (GET_CODE (src) != REG
+                   || REGNO (src) >= FIRST_PSEUDO_REGISTER
+                   || ! find_reg_note (insn, REG_RETVAL, NULL_RTX))
                  {
-                   rehash_using_reg (src);
-                   sets[i].src_hash = HASH (src, mode);
+                   register struct table_elt *elt;
+
+                   /* Note that these insert_regs calls cannot remove
+                      any of the src_elt's, because they would have failed to
+                      match if not still valid.  */
+                   if (insert_regs (src, classp, 0))
+                     {
+                       rehash_using_reg (src);
+                       sets[i].src_hash = HASH (src, mode);
+                     }
+                   elt = insert (src, classp, sets[i].src_hash, mode);
+                   elt->in_memory = sets[i].src_in_memory;
+                   elt->in_struct = sets[i].src_in_struct;
+                   sets[i].src_elt = classp = elt;
                  }
-               elt = insert (src, classp, sets[i].src_hash, mode);
-               elt->in_memory = sets[i].src_in_memory;
-               elt->in_struct = sets[i].src_in_struct;
-               sets[i].src_elt = classp = elt;
+               else
+                 sets[i].src_elt = classp;
              }
-
            if (sets[i].src_const && sets[i].src_const_elt == 0
                && src != sets[i].src_const
                && ! rtx_equal_p (sets[i].src_const, src))