diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2003-04-09 17:50:08 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2003-04-09 17:50:08 +0000 |
commit | 0913e4b49e38718e767bc4e4575a8271ee484efb (patch) | |
tree | 34830d3300213fa9d314566552067ebc840c3cb3 /gcc | |
parent | 21515593f66c14e18a64eec763152dfaabd95fa3 (diff) | |
download | gcc-0913e4b49e38718e767bc4e4575a8271ee484efb.zip gcc-0913e4b49e38718e767bc4e4575a8271ee484efb.tar.gz gcc-0913e4b49e38718e767bc4e4575a8271ee484efb.tar.bz2 |
optabs.c: Comment that gen_add2_insn and others may actually return emitted insns...
* 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.
From-SVN: r65400
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/optabs.c | 5 | ||||
-rw-r--r-- | gcc/reload1.c | 24 |
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; |