aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/builtins.c14
2 files changed, 14 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c58b388..8f4b396 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-09-29 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * builtins.c (expand_builtin_strlen): Do not call emit_move_insn
+ with a PLUS as source operand.
+ (expand_movstr): Likewise.
+ (expand_builtin_stpcpy): Likewise.
+
2004-09-29 Richard Henderson <rth@redhat.com>
PR 17739
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 1aeae96..039110a 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -2433,8 +2433,7 @@ expand_builtin_strlen (tree arglist, rtx target,
/* Now that we are assured of success, expand the source. */
start_sequence ();
- pat = memory_address (BLKmode,
- expand_expr (src, src_reg, ptr_mode, EXPAND_SUM));
+ pat = expand_expr (src, src_reg, ptr_mode, EXPAND_NORMAL);
if (pat != src_reg)
emit_move_insn (src_reg, pat);
pat = get_insns ();
@@ -3045,8 +3044,10 @@ expand_movstr (tree dest, tree src, rtx target, int endp)
terminator. If the caller requested a mempcpy-like return value,
adjust it. */
if (endp == 1 && target != const0_rtx)
- emit_move_insn (target, plus_constant (gen_lowpart (GET_MODE (target),
- end), 1));
+ {
+ rtx tem = plus_constant (gen_lowpart (GET_MODE (target), end), 1);
+ emit_move_insn (target, force_operand (tem, NULL_RTX));
+ }
return target;
}
@@ -3156,9 +3157,8 @@ expand_builtin_stpcpy (tree arglist, rtx target, enum machine_mode mode)
if (GET_MODE (target) != GET_MODE (ret))
ret = gen_lowpart (GET_MODE (target), ret);
- ret = emit_move_insn (target,
- plus_constant (ret,
- INTVAL (len_rtx)));
+ ret = plus_constant (ret, INTVAL (len_rtx));
+ ret = emit_move_insn (target, force_operand (ret, NULL_RTX));
gcc_assert (ret);
return target;