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. --- NB I do hope such a small change for a new feature can be still accepted for reload despite its final days coming soon now. This will unblock the Alpha port for progressing including in particular with the conversion to LRA (as far as I'm concerned). --- 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);