OSDN Git Service

Avoid copying libcall results directly to user variables.
authorcrux <crux@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 15 Sep 2000 15:35:03 +0000 (15:35 +0000)
committercrux <crux@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 15 Sep 2000 15:35:03 +0000 (15:35 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@36433 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/optabs.c

index c80ffa8..6c1152a 100644 (file)
@@ -1,3 +1,8 @@
+2000-09-15  Bernd Schmidt  <bernds@redhat.co.uk>
+
+       * optabs.c (emit_libcall_block): If target is a user variable,
+       copy to a temporary first.
+
 2000-09-15  Richard Henderson  <rth@cygnus.com>
 
        * expmed.c (store_bit_field): Consider naturally aligned
index f35300b..136f178 100644 (file)
@@ -2756,8 +2756,14 @@ emit_libcall_block (insns, target, result, equiv)
      rtx result;
      rtx equiv;
 {
+  rtx final_dest = target;
   rtx prev, next, first, last, insn;
 
+  /* If this is a reg with REG_USERVAR_P set, then it could possibly turn
+     into a MEM later.  Protect the libcall block from this change.  */
+  if (! REG_P (target) || REG_USERVAR_P (target))
+    target = gen_reg_rtx (GET_MODE (target));
+
   /* look for any CALL_INSNs in this sequence, and attach a REG_EH_REGION
      reg note to indicate that this call cannot throw or execute a nonlocal
      goto. (Unless there is already a REG_EH_REGION note, in which case
@@ -2833,6 +2839,8 @@ emit_libcall_block (insns, target, result, equiv)
       remove_note (last, find_reg_note (last, REG_EQUAL, NULL_RTX));
     }
 
+  emit_move_insn (final_dest, target);
+
   if (prev == 0)
     first = get_insns ();
   else