+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.
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. */
/* 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));
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. */
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;