aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/expr.c6
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20040202-1.c8
3 files changed, 18 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a467635..8e2f3c1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-02-02 Richard Henderson <rth@redhat.com>
+
+ PR target/13789
+ * expr.c (store_expr): Use force_operand before emit_move_insn.
+
2004-02-02 Jeff Law <law@redhat.com>
Roger Sayle <roger@eyesopen.com>
diff --git a/gcc/expr.c b/gcc/expr.c
index 8bf0732..ba27b04 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -4334,7 +4334,11 @@ store_expr (tree exp, rtx target, int want_value)
(want_value & 2
? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
else
- emit_move_insn (target, temp);
+ {
+ temp = force_operand (temp, target);
+ if (temp != target)
+ emit_move_insn (target, temp);
+ }
}
/* If we don't want a value, return NULL_RTX. */
diff --git a/gcc/testsuite/gcc.c-torture/compile/20040202-1.c b/gcc/testsuite/gcc.c-torture/compile/20040202-1.c
new file mode 100644
index 0000000..ba32c80
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20040202-1.c
@@ -0,0 +1,8 @@
+/* PR target/13789 */
+/* Failed on SPARC due to a bug in store_expr. */
+
+void *foo (void *c)
+{
+ void *a = __builtin_extract_return_addr (c);
+ return a;
+}