cse.c (cse_insn): Enable subsitution inside libcall only for REG, SUBREG, MEM.
authorVladimir N. Makarov <vmakarov@cygnus.com>
Tue, 28 Jul 1998 12:54:04 +0000 (12:54 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Tue, 28 Jul 1998 12:54:04 +0000 (12:54 +0000)

* cse.c (cse_insn): Enable subsitution inside libcall only for REG,
SUBREG, MEM.
* rtlanal.c (replace_rtx): Prohibit replaces in CONST_DOUBLE.

From-SVN: r21435

gcc/ChangeLog
gcc/cse.c
gcc/rtlanal.c

index 425a940..498879e 100644 (file)
@@ -1,3 +1,9 @@
+1998-07-28  Vladimir N. Makarov  <vmakarov@cygnus.com>
+
+       * cse.c (cse_insn): Enable subsitution inside libcall only for REG,
+       SUBREG, MEM.
+       * rtlanal.c (replace_rtx): Prohibit replaces in CONST_DOUBLE. 
+
 Tue Jul 28 11:33:09 1998  Mark Mitchell  <mark@markmitchell.com>
 
        * cplus-dem.c (type_kind_t): New type.
index 19e809a..5d12187 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -6117,8 +6117,9 @@ record_jump_cond (code, mode, op0, op1, reversed_nonequality)
    Then install the new sources and destinations in the table
    of available values. 
 
-   If IN_LIBCALL_BLOCK is nonzero, don't record any equivalence made in
-   the insn.  */
+   If LIBCALL_INSN is nonzero, don't record any equivalence made in
+   the insn.  It means that INSN is inside libcall block.  In this
+   case LIBCALL_INSN is the corresponding insn with REG_LIBCALL. */
 
 /* Data on one SET contained in the instruction.  */
 
@@ -6948,7 +6949,10 @@ cse_insn (insn, libcall_insn)
              /* If we just made a substitution inside a libcall, then we
                 need to make the same substitution in any notes attached
                 to the RETVAL insn.  */
-             if (libcall_insn)
+             if (libcall_insn
+                 && (GET_CODE (old_src) == REG
+                     || GET_CODE (old_src) == SUBREG
+                     ||  GET_CODE (old_src) == MEM))
                replace_rtx (REG_NOTES (libcall_insn), old_src, 
                             canon_reg (SET_SRC (sets[i].rtl), insn));
 
index 8f42391..221b3fa 100644 (file)
@@ -1765,7 +1765,8 @@ inequality_comparisons_p (x)
   return 0;
 }
 \f
-/* Replace any occurrence of FROM in X with TO.
+/* Replace any occurrence of FROM in X with TO.  The function does
+   not enter into CONST_DOUBLE for the replace.
 
    Note that copying is not done so X must not be shared unless all copies
    are to be modified.  */
@@ -1777,6 +1778,11 @@ replace_rtx (x, from, to)
   register int i, j;
   register char *fmt;
 
+  /* The following prevents loops occurrence when we change MEM in
+     CONST_DOUBLE onto the same CONST_DOUBLE. */
+  if (x != 0 && GET_CODE (x) == CONST_DOUBLE)
+    return x;
+
   if (x == from)
     return to;