From 39810676742d211d2b80a19de7a791378f9c2854 Mon Sep 17 00:00:00 2001 From: aoliva Date: Wed, 9 Apr 2003 17:50:08 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65400 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/optabs.c | 5 +++-- 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 + + * 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 * 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; -- 2.7.4