]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/81766 (ICE in maybe_add_or_update_dep_1, at sched-deps.c:924...
authorJakub Jelinek <jakub@redhat.com>
Sat, 16 Sep 2017 18:35:03 +0000 (20:35 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 16 Sep 2017 18:35:03 +0000 (20:35 +0200)
Backported from mainline
2017-08-08  Richard Biener  <rguenther@suse.de>

PR middle-end/81766
* function.c (thread_prologue_and_epilogue_insns): Restore
behavior of always calling find_many_sub_basic_blocks on
the inserted prologue.

* gcc.target/i386/pr81766.c: New testcase.

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.

* gcc.dg/pr79499.c: New test.

From-SVN: r252881

gcc/ChangeLog
gcc/function.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr79499.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr81766.c [new file with mode: 0644]

index 8093cf663b6220d7ac48f307883974f9eaacbc08..e10cd11b7716a3d72374e8e94ef32b32b97bdf5d 100644 (file)
@@ -1,3 +1,21 @@
+2017-09-16  Jakub Jelinek  <jakub@redhat.com>
+
+       Backported from mainline
+       2017-08-08  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/81766
+       * function.c (thread_prologue_and_epilogue_insns): Restore
+       behavior of always calling find_many_sub_basic_blocks on
+       the inserted prologue.
+
+       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-09-15  Martin Liska  <mliska@suse.cz>
 
        Backport from mainline
index 8b640584b0b77318e589e84a9f6b3502f5d7e13b..f7e5030d08ca6f3349e38847480c2c6fa197ada3 100644 (file)
@@ -5961,13 +5961,19 @@ thread_prologue_and_epilogue_insns (void)
   try_shrink_wrapping (&entry_edge, orig_entry_edge, &bb_flags, prologue_seq);
 #endif
 
+  rtx_insn *split_prologue_insn = split_prologue_seq;
   if (split_prologue_seq != NULL_RTX)
     {
+      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);
       inserted = true;
     }
+  rtx_insn *prologue_insn = prologue_seq;
   if (prologue_seq != NULL_RTX)
     {
+      while (prologue_insn && !NONDEBUG_INSN_P (prologue_insn))
+       prologue_insn = NEXT_INSN (prologue_insn);
       insert_insn_on_edge (prologue_seq, entry_edge);
       inserted = true;
     }
@@ -6115,8 +6121,19 @@ epilogue_done:
       commit_edge_insertions ();
 
       /* Look for basic blocks within the prologue insns.  */
+      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;
       blocks = sbitmap_alloc (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);
       bitmap_set_bit (blocks, entry_edge->dest->index);
       bitmap_set_bit (blocks, orig_entry_edge->dest->index);
       find_many_sub_basic_blocks (blocks);
index ff8feeb707f30b8e62c1b57bb72e68846725bc9d..1485d418557ad537b43ce73b910f4e4675e9f824 100644 (file)
@@ -1,6 +1,16 @@
 2017-09-16  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2017-08-08  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/81766
+       * gcc.target/i386/pr81766.c: New testcase.
+
+       2017-08-02  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/79499
+       * gcc.dg/pr79499.c: New test.
+
        2017-06-21  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/81154
diff --git a/gcc/testsuite/gcc.dg/pr79499.c b/gcc/testsuite/gcc.dg/pr79499.c
new file mode 100644 (file)
index 0000000..509549f
--- /dev/null
@@ -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);
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr81766.c b/gcc/testsuite/gcc.target/i386/pr81766.c
new file mode 100644 (file)
index 0000000..4bcae7f
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target lp64 } */
+/* { dg-options "-O2 -fPIE -mcmodel=large" } */
+
+int main() { return 0; }