From 6d71672db616f6d3f5462028d6476a28610f42b5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 27 Jan 2015 10:19:30 +0100 Subject: [PATCH] re PR rtl-optimization/61058 (ICE: RTL check: expected elt 3 type 'B', have '0' (rtx barrier) in distance_agu_use_in_bb, at config/i386/i386.c:16740 with __builtin_unreachable()) PR rtl-optimization/61058 * jump.c (cleanup_barriers): Update basic block boundaries if BLOCK_FOR_INSN is non-NULL on PREV. * gcc.dg/pr61058.c: New test. From-SVN: r220155 --- gcc/ChangeLog | 6 ++++++ gcc/jump.c | 25 ++++++++++++++++++++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr61058.c | 10 ++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr61058.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5597e32b3f9..57f5efe08fb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-01-27 Jakub Jelinek + + PR rtl-optimization/61058 + * jump.c (cleanup_barriers): Update basic block boundaries + if BLOCK_FOR_INSN is non-NULL on PREV. + 2015-01-27 Ilya Enkovich * tree-chkp.c (chkp_call_returns_bounds_p): Fix handling of diff --git a/gcc/jump.c b/gcc/jump.c index 3b8c91e007f..34b3b7b8932 100644 --- a/gcc/jump.c +++ b/gcc/jump.c @@ -168,7 +168,30 @@ cleanup_barriers (void) if (BARRIER_P (prev)) delete_insn (insn); else if (prev != PREV_INSN (insn)) - reorder_insns_nobb (insn, insn, prev); + { + basic_block bb = BLOCK_FOR_INSN (prev); + rtx_insn *end = PREV_INSN (insn); + reorder_insns_nobb (insn, insn, prev); + if (bb) + { + /* If the backend called in machine reorg compute_bb_for_insn + and didn't free_bb_for_insn again, preserve basic block + boundaries. Move the end of basic block to PREV since + it is followed by a barrier now, and clear BLOCK_FOR_INSN + on the following notes. + ??? Maybe the proper solution for the targets that have + cfg around after machine reorg is not to run cleanup_barriers + pass at all. */ + BB_END (bb) = prev; + do + { + prev = NEXT_INSN (prev); + if (prev != insn && BLOCK_FOR_INSN (prev) == bb) + BLOCK_FOR_INSN (prev) = NULL; + } + while (prev != end); + } + } } } return 0; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0686fa7caaa..8bcb32a0e39 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-01-27 Jakub Jelinek + + PR rtl-optimization/61058 + * gcc.dg/pr61058.c: New test. + 2015-01-27 Ilya Enkovich * gcc.target/i386/chkp-narrow-bounds.c: New. diff --git a/gcc/testsuite/gcc.dg/pr61058.c b/gcc/testsuite/gcc.dg/pr61058.c new file mode 100644 index 00000000000..6f840f418fe --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr61058.c @@ -0,0 +1,10 @@ +/* PR rtl-optimization/61058 */ +/* { dg-do compile } */ +/* { dg-options "" } */ +/* { dg-additional-options "-fno-asynchronous-unwind-tables -mtune=atom" { target i?86-*-* x86_64-*-* } } */ + +void +foo (void) +{ + __builtin_unreachable (); +} -- 2.30.2