"Maciej W. Rozycki" <[email protected]> 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.
OK, thanks.
Richard
> ---
> 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);