"Maciej W. Rozycki" <ma...@orcam.me.uk> writes: > The next change for Alpha will produce extra labels and branches in > reload, which in turn requires basic blocks to be split at completion. > We do this already for functions that can trap, so just extend the > arrangement with a flag for the backend to use whenever it finds it > necessary. > > gcc/ > * function.h (struct function): Add > `split_basic_blocks_after_reload' member. > * lra.cc (lra): Handle it. > * reload1.cc (reload): Likewise. > --- > This was approved by Richard Sandiford in v1, so I'll commit it along with > 6/7, which relies on it.
Still stands, but I didn't think of this before, so thought I'd ask: Would it also work to record max_label_num () before RA and then compare that recorded value with max_label_num () after RA? Or would that have too many false positives? Thanks, Richard > No change from v1. > --- > gcc/function.h | 3 +++ > gcc/lra.cc | 6 ++++-- > gcc/reload1.cc | 6 ++++-- > 3 files changed, 11 insertions(+), 4 deletions(-) > > gcc-split-basic-blocks-after-reload.diff > > Index: gcc/gcc/function.h > =================================================================== > --- gcc.orig/gcc/function.h > +++ gcc/gcc/function.h > @@ -449,6 +449,9 @@ struct GTY(()) function { > /* Set for artificial function created for [[assume (cond)]]. > These should be GIMPLE optimized, but not expanded to RTL. */ > unsigned int assume_function : 1; > + > + /* Nonzero if reload will have to split basic blocks. */ > + unsigned int split_basic_blocks_after_reload : 1; > }; > > /* Add the decl D to the local_decls list of FUN. */ > Index: gcc/gcc/lra.cc > =================================================================== > --- gcc.orig/gcc/lra.cc > +++ gcc/gcc/lra.cc > @@ -2594,8 +2594,10 @@ lra (FILE *f, int verbose) > > inserted_p = fixup_abnormal_edges (); > > - /* We've possibly turned single trapping insn into multiple ones. */ > - if (cfun->can_throw_non_call_exceptions) > + /* Split basic blocks if we've possibly turned single trapping insn > + into multiple ones or otherwise the backend requested to do so. */ > + if (cfun->can_throw_non_call_exceptions > + || cfun->split_basic_blocks_after_reload) > { > auto_sbitmap blocks (last_basic_block_for_fn (cfun)); > bitmap_ones (blocks); > Index: gcc/gcc/reload1.cc > =================================================================== > --- gcc.orig/gcc/reload1.cc > +++ gcc/gcc/reload1.cc > @@ -1272,8 +1272,10 @@ reload (rtx_insn *first, int global) > > inserted = fixup_abnormal_edges (); > > - /* We've possibly turned single trapping insn into multiple ones. */ > - if (cfun->can_throw_non_call_exceptions) > + /* Split basic blocks if we've possibly turned single trapping insn > + into multiple ones or otherwise the backend requested to do so. */ > + if (cfun->can_throw_non_call_exceptions > + || cfun->split_basic_blocks_after_reload) > { > auto_sbitmap blocks (last_basic_block_for_fn (cfun)); > bitmap_ones (blocks);