From 11b904a1fc450d9d4d9c77441aa25d0fb8a5e51b Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Fri, 15 Sep 2006 12:35:43 +0000 Subject: [PATCH] cfgrtl.c (emit_insn_at_entry): New function. * cfgrtl.c (emit_insn_at_entry): New function. * rtl.h (emit_insn_at_entry): Declare it. * integrate.c (emit_initial_value_sets): Use it. From-SVN: r116968 --- gcc/ChangeLog | 4 ++++ gcc/cfgrtl.c | 14 ++++++++++++++ gcc/integrate.c | 2 +- gcc/rtl.h | 1 + 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d6f892c6ea6..b69961aa18b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -5,6 +5,10 @@ expanding the number of iterations. * config/bfin/bfin.c (bfin_rtx_costs): Handle UDIV, UMOD. + * cfgrtl.c (emit_insn_at_entry): New function. + * rtl.h (emit_insn_at_entry): Declare it. + * integrate.c (emit_initial_value_sets): Use it. + 2006-09-15 Kazu Hirata * doc/tm.texi (TARGET_FUNCTION_VALUE): Put @deftypefn all in diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index b07bb9467eb..df281cb2d89 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -453,6 +453,20 @@ entry_of_function (void) BB_HEAD (ENTRY_BLOCK_PTR->next_bb) : get_insns ()); } +/* Emit INSN at the entry point of the function, ensuring that it is only + executed once per function. */ +void +emit_insn_at_entry (rtx insn) +{ + edge_iterator ei = ei_start (ENTRY_BLOCK_PTR->succs); + edge e = ei_safe_edge (ei); + if (!(e->flags & EDGE_FALLTHRU)) + abort (); + + insert_insn_on_edge (insn, e); + commit_edge_insertions (); +} + /* Update insns block within BB. */ void diff --git a/gcc/integrate.c b/gcc/integrate.c index 98769354ddf..a6eeede3985 100644 --- a/gcc/integrate.c +++ b/gcc/integrate.c @@ -294,7 +294,7 @@ emit_initial_value_sets (void) seq = get_insns (); end_sequence (); - emit_insn_after (seq, entry_of_function ()); + emit_insn_at_entry (seq); return 0; } diff --git a/gcc/rtl.h b/gcc/rtl.h index 75a89b63df1..f8d97a18aad 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -2074,6 +2074,7 @@ extern rtx emit (rtx); extern void renumber_insns (void); extern rtx delete_insn (rtx); extern rtx entry_of_function (void); +extern void emit_insn_at_entry (rtx); extern void delete_insn_chain (rtx, rtx); extern rtx unlink_insn_chain (rtx, rtx); extern rtx delete_insn_and_edges (rtx);