aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-08-02 09:13:25 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2017-08-02 09:13:25 +0200
commit349721b7de62e4b30a7ecfd7cb157bfcb73e738d (patch)
treeb807873a8846c30e9ba2a91f4ea4c854367f9892 /gcc/function.c
parent04199738b48867d8c1d60e98578340047e3237da (diff)
downloadgcc-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.c36
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 ();