diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-08-02 07:26:46 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-08-02 07:26:46 +0000 |
commit | 8f0009d0d49b6d2e6d0c6fd1c1e85231ee4bac77 (patch) | |
tree | 55f279fea28daea711f1fb15eb66d11faacf6d80 | |
parent | bbdc807b74277ac9e4f58000da5247bc12adf61b (diff) | |
download | gcc-8f0009d0d49b6d2e6d0c6fd1c1e85231ee4bac77.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@250815 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/function.c | 36 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr79499.c | 13 |
4 files changed, 55 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9f50c861262..83797525fb4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-08-02 Jakub Jelinek <jakub@redhat.com> + + 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. + 2017-08-01 Uros Bizjak <ubizjak@gmail.com> PR target/81641 diff --git a/gcc/function.c b/gcc/function.c index 9cfe58afe90..b3de845af8a 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -6057,20 +6057,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 (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8171bfc28a4..47a4fe024e7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-08-02 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/79499 + * gcc.dg/pr79499.c: New test. + 2017-08-01 Uros Bizjak <ubizjak@gmail.com> PR target/81641 diff --git a/gcc/testsuite/gcc.dg/pr79499.c b/gcc/testsuite/gcc.dg/pr79499.c new file mode 100644 index 00000000000..509549ff2fd --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr79499.c @@ -0,0 +1,13 @@ +/* PR middle-end/79499 */ +/* { dg-do compile { target split_stack } } */ +/* { dg-options "-O2 -fsplit-stack -fno-omit-frame-pointer" } */ + +struct S { struct S *a, *b; }; + +void +foo (struct S *x) +{ + do + x->b = x->a; + while (x = x->a); +} |