From patchwork Tue Jul 2 09:45:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Small cleanup in RTL expansion X-Patchwork-Submitter: Eric Botcazou X-Patchwork-Id: 20508 Message-Id: <3413974.qYVSK5bheN@polaris> To: gcc-patches@gcc.gnu.org Date: Tue, 02 Jul 2019 11:45:18 +0200 From: Eric Botcazou List-Id: pass_expand::execute does the same job as commit_edge_insertions but manually, except for a special case if the entry block has a single successor. But we can extract the special case and just call commit_edge_insertions afterwards. Tested on x86_64-suse-linux, applied on the mainline. 2019-07-02 Eric Botcazou * cfgexpand.c (pass_expand::execute): Deal specially with instructions to be inserted on single successor edge of the entry block. Then call commit_edge_insertions instead of inserting the instructions manually. * cfgrtl.c (commit_edge_insertions): Do not verify flow info during RTL expansion. -- Eric Botcazou Index: cfgexpand.c =================================================================== --- cfgexpand.c (revision 272891) +++ cfgexpand.c (working copy) @@ -6576,37 +6576,27 @@ pass_expand::execute (function *fun) split edges which edge insertions might do. */ rebuild_jump_labels (get_insns ()); - FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (fun), - EXIT_BLOCK_PTR_FOR_FN (fun), next_bb) + /* If we have a single successor to the entry block, put the pending insns + after parm birth, but before NOTE_INSNS_FUNCTION_BEG. */ + if (single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (fun))) { - edge e; - edge_iterator ei; - for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); ) + edge e = single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (fun)); + if (e->insns.r) { - if (e->insns.r) - { - rebuild_jump_labels_chain (e->insns.r); - /* Put insns after parm birth, but before - NOTE_INSNS_FUNCTION_BEG. */ - if (e->src == ENTRY_BLOCK_PTR_FOR_FN (fun) - && single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (fun))) - { - rtx_insn *insns = e->insns.r; - e->insns.r = NULL; - if (NOTE_P (parm_birth_insn) - && NOTE_KIND (parm_birth_insn) == NOTE_INSN_FUNCTION_BEG) - emit_insn_before_noloc (insns, parm_birth_insn, e->dest); - else - emit_insn_after_noloc (insns, parm_birth_insn, e->dest); - } - else - commit_one_edge_insertion (e); - } + rtx_insn *insns = e->insns.r; + e->insns.r = NULL; + rebuild_jump_labels_chain (insns); + if (NOTE_P (parm_birth_insn) + && NOTE_KIND (parm_birth_insn) == NOTE_INSN_FUNCTION_BEG) + emit_insn_before_noloc (insns, parm_birth_insn, e->dest); else - ei_next (&ei); + emit_insn_after_noloc (insns, parm_birth_insn, e->dest); } } + /* Otherwise, as well as for other edges, take the usual way. */ + commit_edge_insertions (); + /* We're done expanding trees to RTL. */ currently_expanding_to_rtl = 0; Index: cfgrtl.c =================================================================== --- cfgrtl.c (revision 272891) +++ cfgrtl.c (working copy) @@ -2105,7 +2105,8 @@ commit_edge_insertions (void) which will be done by fixup_partitions. */ fixup_partitions (); - checking_verify_flow_info (); + if (!currently_expanding_to_rtl) + checking_verify_flow_info (); FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun), EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)