> On 27 Apr 2025, at 00:06, Andrew Pinski <quic_apin...@quicinc.com> wrote:
>
> When we have an empty function, things can go wrong with
> cfi_startproc/cfi_endproc and a few other
> things like exceptions. So if the only thing the function does is a call to
> __builtin_unreachable,
> let's expand that to a __builtin_trap instead. For most targets that is one
> instruction wide so it
> won't hurt things that much and we get correct behavior for exceptions and
> some linkers will be better
> for it.
>
> Bootstrapped and tested on x86_64-linux-gnu.
This also works to restore bootstrap for aarch64-darwin and is preferable
to the patch I suggested (since it is narrower in application). A couple of
typographical nits below …
thanks
Iain
>
> PR middle-end/109267
>
> gcc/ChangeLog:
>
> * cfgexpand.cc (expand_gimple_basic_block): If the first non debug
> statement in the
> first (and only) basic block is a call to __builtin_unreachable change
> it to a call
> to __builtin_trap.
some of these lines look quite long in the patch?
>
> gcc/testsuite/ChangeLog:
>
> * gcc.dg/pr109267-1.c: New test.
> * gcc.dg/pr109267-2.c: New test.
>
> Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> ---
> gcc/cfgexpand.cc | 8 ++++++++
> gcc/testsuite/gcc.dg/pr109267-1.c | 14 ++++++++++++++
> gcc/testsuite/gcc.dg/pr109267-2.c | 13 +++++++++++++
> 3 files changed, 35 insertions(+)
> create mode 100644 gcc/testsuite/gcc.dg/pr109267-1.c
> create mode 100644 gcc/testsuite/gcc.dg/pr109267-2.c
>
> diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc
> index e84f12a5e93..e14df760b7a 100644
> --- a/gcc/cfgexpand.cc
> +++ b/gcc/cfgexpand.cc
> @@ -6206,6 +6206,14 @@ expand_gimple_basic_block (basic_block bb, bool
> disable_tail_calls)
> basic_block new_bb;
>
> stmt = gsi_stmt (gsi);
> +
> + /* If we are expanding the first (and only) bb and the only non debug
> + statement is __builtin_unreachable call, then replace it with a trap
> + so the function is at least one instruction in size. */
> + if (!nondebug_stmt_seen && bb->index == NUM_FIXED_BLOCKS
> + && gimple_call_builtin_p (stmt, BUILT_IN_UNREACHABLE))
^^ whitespace glitch?
> + gimple_call_set_fndecl(stmt, builtin_decl_implicit (BUILT_IN_TRAP));
> +
> if (!is_gimple_debug (stmt))
> nondebug_stmt_seen = true;
>
> diff --git a/gcc/testsuite/gcc.dg/pr109267-1.c
> b/gcc/testsuite/gcc.dg/pr109267-1.c
> new file mode 100644
> index 00000000000..4f1da8b41e3
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr109267-1.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-rtl-expand-details" } */
> +
> +/* PR middle-end/109267 */
> +
> +int f(void)
> +{
> + __builtin_unreachable();
> +}
> +
> +/* This unreachable should expand as trap. */
> +
> +/* { dg-final { scan-rtl-dump-times "__builtin_trap " 1 "expand"} } */
> +/* { dg-final { scan-rtl-dump-times "__builtin_unreachable " 1 "expand"} } */
> diff --git a/gcc/testsuite/gcc.dg/pr109267-2.c
> b/gcc/testsuite/gcc.dg/pr109267-2.c
> new file mode 100644
> index 00000000000..e6da4860998
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr109267-2.c
> @@ -0,0 +1,13 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-rtl-expand-details" } */
> +
> +/* PR middle-end/109267 */
> +void g(void);
> +int f(int *t)
> +{
> + g();
> + __builtin_unreachable();
> +}
> +
> +/* This should be expanded to unreachable so it should show up twice. */
> +/* { dg-final { scan-rtl-dump-times "__builtin_unreachable " 2 "expand"} } */
> --
> 2.43.0
>