re PR middle-end/86864 (ICE in commit_one_edge_insertion on switch construct)
authorEric Botcazou <ebotcazou@adacore.com>
Sat, 15 Sep 2018 09:21:09 +0000 (09:21 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 15 Sep 2018 09:21:09 +0000 (09:21 +0000)
PR middle-end/86864
* cfgexpand.c (expand_gimple_basic_block): Be prepared for a BARRIER
before and after a JUMP_TABLE_DATA.

From-SVN: r264342

gcc/ChangeLog
gcc/cfgexpand.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20180915-1.c [new file with mode: 0644]

index 8fda90ac6ce684701e00d3195e8c4459ec6a94d4..9f6b4b53fc44fcdaa2c29f42a6f6d4fb330130f3 100644 (file)
@@ -1,3 +1,9 @@
+2018-09-15  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR middle-end/86864
+       * cfgexpand.c (expand_gimple_basic_block): Be prepared for a BARRIER
+       before and after a JUMP_TABLE_DATA.
+
 2018-09-14  John David Anglin  <danglin@gcc.gnu.org>
 
        PR middle-end/87188
index 697b238669fb0687c3e277c0b3fb1cd63df4f39b..c8d7805308c464a443dc003c25094e0ca99f976a 100644 (file)
@@ -5817,6 +5817,8 @@ expand_gimple_basic_block (basic_block bb, bool disable_tail_calls)
     last = PREV_INSN (last);
   if (JUMP_TABLE_DATA_P (last))
     last = PREV_INSN (PREV_INSN (last));
+  if (BARRIER_P (last))
+    last = PREV_INSN (last);
   BB_END (bb) = last;
 
   update_bb_for_insn (bb);
index 25c253fe9afbbfee801130006a2625e9c47cffdc..847f57ba95c3b72ab1ab149b51189790c2f98b49 100644 (file)
@@ -1,3 +1,7 @@
+2018-09-15  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.c-torture/compile/20180915-1.c: New test.
+
 2018-09-14  David Malcolm  <dmalcolm@redhat.com>
 
        PR c/82967
diff --git a/gcc/testsuite/gcc.c-torture/compile/20180915-1.c b/gcc/testsuite/gcc.c-torture/compile/20180915-1.c
new file mode 100644 (file)
index 0000000..be5c4f0
--- /dev/null
@@ -0,0 +1,27 @@
+/* PR middle-end/86864 */
+/* Testcase by Serge Belyshev <belyshev@depni.sinp.msu.ru> */
+
+long a;
+void f ();
+void g (int b, int c, int d)
+{
+  switch (b)
+    {
+    case 42:
+    case 29:
+    case 48:
+    case 40:
+    case 32:
+      c = 2;
+      break;
+    case 0:
+      c = 1;
+      break;
+    default:
+      __builtin_unreachable ();
+    }
+  if (d || a)
+    f ();
+  if (c == 1)
+    f ();
+}