diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-08-02 09:13:25 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-08-02 09:13:25 +0200 |
commit | 349721b7de62e4b30a7ecfd7cb157bfcb73e738d (patch) | |
tree | b807873a8846c30e9ba2a91f4ea4c854367f9892 /gcc/function.c | |
parent | 04199738b48867d8c1d60e98578340047e3237da (diff) | |
download | gcc-349721b7de62e4b30a7ecfd7cb157bfcb73e738d.zip gcc-349721b7de62e4b30a7ecfd7cb157bfcb73e738d.tar.gz gcc-349721b7de62e4b30a7ecfd7cb157bfcb73e738d.tar.bz2 |
re PR middle-end/79499 (ICE in rtl_verify_bb_insns, at cfgrtl.c:2661)
PR middle-end/79499
* function.c (thread_prologue_and_epilogue_insns): Determine blocks
for find_many_sub_basic_blocks bitmap by looking up BLOCK_FOR_INSN
of first NONDEBUG_INSN_P in each of the split_prologue_seq and
prologue_seq sequences - if any.
* gcc.dg/pr79499.c: New test.
From-SVN: r250814
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/gcc/function.c b/gcc/function.c index 62e72eb..86f1484 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -6048,20 +6048,42 @@ thread_prologue_and_epilogue_insns (void) if (split_prologue_seq || prologue_seq) { + rtx_insn *split_prologue_insn = split_prologue_seq; if (split_prologue_seq) - insert_insn_on_edge (split_prologue_seq, orig_entry_edge); + { + while (split_prologue_insn && !NONDEBUG_INSN_P (split_prologue_insn)) + split_prologue_insn = NEXT_INSN (split_prologue_insn); + insert_insn_on_edge (split_prologue_seq, orig_entry_edge); + } + rtx_insn *prologue_insn = prologue_seq; if (prologue_seq) - insert_insn_on_edge (prologue_seq, entry_edge); + { + while (prologue_insn && !NONDEBUG_INSN_P (prologue_insn)) + prologue_insn = NEXT_INSN (prologue_insn); + insert_insn_on_edge (prologue_seq, entry_edge); + } commit_edge_insertions (); /* Look for basic blocks within the prologue insns. */ - auto_sbitmap blocks (last_basic_block_for_fn (cfun)); - bitmap_clear (blocks); - bitmap_set_bit (blocks, entry_edge->dest->index); - bitmap_set_bit (blocks, orig_entry_edge->dest->index); - find_many_sub_basic_blocks (blocks); + if (split_prologue_insn + && BLOCK_FOR_INSN (split_prologue_insn) == NULL) + split_prologue_insn = NULL; + if (prologue_insn + && BLOCK_FOR_INSN (prologue_insn) == NULL) + prologue_insn = NULL; + if (split_prologue_insn || prologue_insn) + { + auto_sbitmap blocks (last_basic_block_for_fn (cfun)); + bitmap_clear (blocks); + if (split_prologue_insn) + bitmap_set_bit (blocks, + BLOCK_FOR_INSN (split_prologue_insn)->index); + if (prologue_insn) + bitmap_set_bit (blocks, BLOCK_FOR_INSN (prologue_insn)->index); + find_many_sub_basic_blocks (blocks); + } } default_rtl_profile (); |