aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/optabs.c5
-rw-r--r--gcc/reload1.c24
3 files changed, 30 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2b13098..62a4853 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2003-04-09 Alexandre Oliva <aoliva@redhat.com>
+
+ * optabs.c: Comment that gen_add2_insn and others may actually
+ return emitted insns, if the gen functions turn out to return
+ emitted insns.
+ * reload1.c (reload_cse_move2add): Cope with emitted insns from
+ gen_add2_insn.
+
2003-04-09 Richard Henderson <rth@redhat.com>
* config/ia64/ia64.c (move_operand): Allow symbolic_operand,
diff --git a/gcc/optabs.c b/gcc/optabs.c
index bd5c385..14d93c6 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -4512,8 +4512,9 @@ emit_conditional_add (target, code, op0, op1, cmode, op2, op3, mode,
return target;
}
-/* These functions generate an insn body and return it
- rather than emitting the insn.
+/* These functions attempt to generate an insn body, rather than
+ emitting the insn, but if the gen function already emits them, we
+ make no attempt to turn them back into naked patterns.
They do not protect from queued increments,
because they may be used 1) in protect_from_queue itself
diff --git a/gcc/reload1.c b/gcc/reload1.c
index c70694b..a6e41dd 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -9162,8 +9162,16 @@ reload_cse_move2add (first)
validate_change (insn, &SET_SRC (pat), reg, 0);
else if (rtx_cost (new_src, PLUS) < rtx_cost (src, SET)
&& have_add2_insn (reg, new_src))
- validate_change (insn, &PATTERN (insn),
- gen_add2_insn (reg, new_src), 0);
+ {
+ rtx newpat = gen_add2_insn (reg, new_src);
+ if (INSN_P (newpat) && NEXT_INSN (newpat) == NULL_RTX)
+ newpat = PATTERN (newpat);
+ /* If it was the first insn of a sequence or
+ some other emitted insn, validate_change will
+ reject it. */
+ validate_change (insn, &PATTERN (insn),
+ newpat, 0);
+ }
else
{
enum machine_mode narrow_mode;
@@ -9243,9 +9251,15 @@ reload_cse_move2add (first)
else if ((rtx_cost (new_src, PLUS)
< COSTS_N_INSNS (1) + rtx_cost (src3, SET))
&& have_add2_insn (reg, new_src))
- success
- = validate_change (next, &PATTERN (next),
- gen_add2_insn (reg, new_src), 0);
+ {
+ rtx newpat = gen_add2_insn (reg, new_src);
+ if (INSN_P (newpat)
+ && NEXT_INSN (newpat) == NULL_RTX)
+ newpat = PATTERN (newpat);
+ success
+ = validate_change (next, &PATTERN (next),
+ newpat, 0);
+ }
if (success)
delete_insn (insn);
insn = next;