diff options
author | Bernd Schmidt <bernds@redhat.co.uk> | 2000-09-15 15:35:03 +0000 |
---|---|---|
committer | Bernd Schmidt <crux@gcc.gnu.org> | 2000-09-15 15:35:03 +0000 |
commit | aff2c2d3af3233dfb2d237341f2fd8612dc61391 (patch) | |
tree | c85b3d299188bdcde03c7dc4b888789f679aa2e9 /gcc/optabs.c | |
parent | 4eaa189a5cfd20ca0f5271b4ca0240673ec61f44 (diff) | |
download | gcc-aff2c2d3af3233dfb2d237341f2fd8612dc61391.zip gcc-aff2c2d3af3233dfb2d237341f2fd8612dc61391.tar.gz gcc-aff2c2d3af3233dfb2d237341f2fd8612dc61391.tar.bz2 |
Avoid copying libcall results directly to user variables.
From-SVN: r36433
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r-- | gcc/optabs.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c index f35300b..136f178 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -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 |