summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2017-08-02 07:26:46 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2017-08-02 07:26:46 +0000
commit8f0009d0d49b6d2e6d0c6fd1c1e85231ee4bac77 (patch)
tree55f279fea28daea711f1fb15eb66d11faacf6d80
parentbbdc807b74277ac9e4f58000da5247bc12adf61b (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/function.c36
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr79499.c13
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);
+}