haifa-sched: handle fallthru edge to EXIT block (PR 85899)

Message ID alpine.LNX.2.20.13.1902282043500.30425@monopod.intra.ispras.ru
State New
Headers show
Series
  • haifa-sched: handle fallthru edge to EXIT block (PR 85899)
Related show

Commit Message

Alexander Monakov Feb. 28, 2019, 5:57 p.m.
Hi,

in PR 85899 an assert is failing in find_fallthru_edge_from because the code
tries to verify the invariant e->dest == e->src->next_bb for a fallthru edge
and does not anticipate that it will fail if e->dest is the exit block (bb 1):
in this case next_bb is fairly arbitrary (it's just the next bb that appears
in the insn sequence and has nothing to do with the "fake" fallthru to exit).

So it looks to me that the assert has to allow this.  I've bootstrapped the
following (not that it matters much as it simply relaxes the assert) and
verified it fixes the testcase.

OK for trunk?

	* haifa-sched.c (find_fallthru_edge_from): Relax assert to account for
	fallthru edges leading to the exit block.

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

Comments

Alexander Monakov Feb. 28, 2019, 6:19 p.m. | #1
On Thu, 28 Feb 2019, Alexander Monakov wrote:

> Hi,

> 

> in PR 85899 an assert is failing in find_fallthru_edge_from because the code

> tries to verify the invariant e->dest == e->src->next_bb for a fallthru edge

> and does not anticipate that it will fail if e->dest is the exit block (bb 1):

> in this case next_bb is fairly arbitrary (it's just the next bb that appears

> in the insn sequence and has nothing to do with the "fake" fallthru to exit).


Or is the bug in out-of-cfglayout code creating such bogus fallthru edge?

Thanks.
Alexander
Eric Botcazou Feb. 28, 2019, 7:14 p.m. | #2
> So it looks to me that the assert has to allow this.  I've bootstrapped the

> following (not that it matters much as it simply relaxes the assert) and

> verified it fixes the testcase.


Yes, fallthrough edges to the exit block exist in RTL, see could_fall_through.

> OK for trunk?

> 

> 	* haifa-sched.c (find_fallthru_edge_from): Relax assert to account for

> 	fallthru edges leading to the exit block.

> 

> 	* gcc.dg/pr85899.c: New test.


OK, thanks.

-- 
Eric Botcazou

Patch

diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c
index 72178b68999..5025aae421d 100644
--- a/gcc/haifa-sched.c
+++ b/gcc/haifa-sched.c
@@ -8082,7 +8082,7 @@  find_fallthru_edge_from (basic_block pred)
 
       if (e)
 	{
-	  gcc_assert (e->dest == succ);
+	  gcc_assert (e->dest == succ || e->dest->index == EXIT_BLOCK);
 	  return e;
 	}
     }
diff --git a/gcc/testsuite/gcc.dg/pr85899.c b/gcc/testsuite/gcc.dg/pr85899.c
index e69de29bb2d..eb2b175339c 100644
--- a/gcc/testsuite/gcc.dg/pr85899.c
+++ b/gcc/testsuite/gcc.dg/pr85899.c
@@ -0,0 +1,17 @@ 
+/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -fschedule-insns -fselective-scheduling -funroll-loops -fno-gcse -fno-if-conversion -fno-ivopts" } */
+
+#define N 4096
+int cb[N];
+int cc[N];
+int cd[N];
+
+void init ()
+{
+  int i;
+  for (i = 0; i < N; ++i) {
+    cb[i] = 3 * i - 2048;
+    cc[i] = -5 * i + 93;
+    cd[i] = i % 2 ? 1 : -1;
+  }
+}