On Wed, Dec 13, 2017 at 03:25:07PM +0100, Jakub Jelinek wrote: > I think there are 2 issues. One is that the ia64 backend emits > the group barrier insns before BB_HEAD label, so it isn't part of a bb, > but has BLOCK_FOR_INSN of the following block, that looks invalid to me > and the ia64.c hunk ought to fix that, except that I don't have access to > ia64 anymore and so can't test it. Andreas, could you try that? > > Another thing is that if we because of this end up with insns outside of > basic blocks, the vt_initialize asserts will fire again. Here, first of > all, IMNSHO we should assert that debug bind insns aren't outside of basic > blocks, the other patches and checking should ensure that (and if any slips > in, we want to fix that too rather than work-around). > Another is that while walking from get_first_insn to one before BB_HEAD > (bb->next_bb), > we can encounter insns outside of bb not just before BB_HEAD (bb), but also > after BB_END (bb), both cases are outside of a bb and thus we can > expect BLOCK_FOR_INSN being NULL. > > Bootstrapped/regtested on x86_64-linux, i686-linux, powerpc64le-linux, > regtest on powerpc64-linux pending. Ok for trunk perhaps without the > ia64.c bits until that gets tested? > > Or, in the PR there is a variant patch which just doesn't do the asserts and > doesn't have to track outside_bb.
Here is another variant, without trying to change ia64 backend which apparently doesn't bootstrap for other reasons. This patch instead ignores insns outside of basic blocks during var-tracking exactly as it has been ignoring them before, and just processes the debug begin stmt markers in there (and verifies no debug bind stmts appear in between bbs). Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2017-12-13 Jakub Jelinek <ja...@redhat.com> PR bootstrap/83396 * var-tracking.c (vt_initialize): Ignore non-DEBUG_INSNs outside of basic blocks. Assert debug bind insns don't appear outside of bbs, don't reset them. Assert insns without BLOCK_FOR_INSN are outside of bb. Simplify. * gcc.dg/pr83396.c: New test. --- gcc/var-tracking.c.jj 2017-12-13 13:22:59.651783152 +0100 +++ gcc/var-tracking.c 2017-12-13 19:11:13.895699735 +0100 @@ -10157,25 +10157,31 @@ vt_initialize (void) insns that might be before it too. Unfortunately, BB_HEADER and BB_FOOTER are not set while we run this pass. */ - insn = get_first_insn (bb); - for (rtx_insn *next; - insn != BB_HEAD (bb->next_bb) - ? next = NEXT_INSN (insn), true : false; + rtx_insn *next; + bool outside_bb = true; + for (insn = get_first_insn (bb); insn != BB_HEAD (bb->next_bb); insn = next) { + if (insn == BB_HEAD (bb)) + outside_bb = false; + else if (insn == NEXT_INSN (BB_END (bb))) + outside_bb = true; + next = NEXT_INSN (insn); if (INSN_P (insn)) { + if (outside_bb) + { + /* Ignore non-debug insns outside of basic blocks. */ + if (!DEBUG_INSN_P (insn)) + continue; + /* Debug binds shouldn't appear outside of bbs. */ + gcc_assert (!DEBUG_BIND_INSN_P (insn)); + } basic_block save_bb = BLOCK_FOR_INSN (insn); if (!BLOCK_FOR_INSN (insn)) { + gcc_assert (outside_bb); BLOCK_FOR_INSN (insn) = bb; - gcc_assert (DEBUG_INSN_P (insn)); - /* Reset debug insns between basic blocks. - Their location is not reliable, because they - were probably not maintained up to date. */ - if (DEBUG_BIND_INSN_P (insn)) - INSN_VAR_LOCATION_LOC (insn) - = gen_rtx_UNKNOWN_VAR_LOC (); } else gcc_assert (BLOCK_FOR_INSN (insn) == bb); --- gcc/testsuite/gcc.dg/pr83396.c.jj 2017-12-13 15:53:15.446687005 +0100 +++ gcc/testsuite/gcc.dg/pr83396.c 2017-12-13 15:53:15.446687005 +0100 @@ -0,0 +1,12 @@ +/* PR bootstrap/83396 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -g" } */ + +int bar (int); +int baz (int); + +int +foo (int x) +{ + return bar (x) || baz (x) != 0; +} Jakub