On Tue, Feb 24, 2026 at 6:39 AM Andrew Pinski
<[email protected]> wrote:
>
> So for function splitting when we outlined the function, we
> should keep around the clobbers that were at the begining of
> the bb which will be outlined. So change the last stmt
> to where we split the bb for where the function call will be
> to be after the clobbers.
>
> Note we have to ignore the debug stmts here otherwise you would
> get a debug comparison failure.
>
> This also fixes some of the warnings about dangling-pointers because
> the clobbers are now correctly handled while function splitting.
> The testcases test for the cases where the dangling-pointers pointer
> warnings would show up too.
>
> Note only end of storage clobbers in this case.
>
> Bootstrapped and tested on x86_64-linux-gnu.

OK.

Thanks,
Richard.

>         PR tree-optimization/110091
>
> gcc/ChangeLog:
>
>         * ipa-split.cc (split_function): Split after
>         the clobbers/debug stmts rather than after the labels.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/tree-ssa/pr110091-1.c: New test.
>         * gcc.dg/tree-ssa/pr110091-2.c: New test.
>
> Signed-off-by: Andrew Pinski <[email protected]>
> ---
>  gcc/ipa-split.cc                           |  6 ++--
>  gcc/testsuite/gcc.dg/tree-ssa/pr110091-1.c | 38 ++++++++++++++++++++++
>  gcc/testsuite/gcc.dg/tree-ssa/pr110091-2.c | 35 ++++++++++++++++++++
>  3 files changed, 77 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr110091-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr110091-2.c
>
> diff --git a/gcc/ipa-split.cc b/gcc/ipa-split.cc
> index fd1860bf50a..3185830609d 100644
> --- a/gcc/ipa-split.cc
> +++ b/gcc/ipa-split.cc
> @@ -1458,10 +1458,12 @@ split_function (basic_block return_bb, class 
> split_point *split_point,
>      dump_function_to_file (node->decl, dump_file, dump_flags);
>
>    /* Create the basic block we place call into.  It is the entry basic block
> -     split after last label.  */
> +     split after last label and after the last eos clobber and debug stmt.  
> */
>    call_bb = split_point->entry_bb;
>    for (gimple_stmt_iterator gsi = gsi_start_bb (call_bb); !gsi_end_p (gsi);)
> -    if (gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL)
> +    if (gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL
> +       || gimple_clobber_p (gsi_stmt (gsi), CLOBBER_STORAGE_END)
> +       || is_gimple_debug (gsi_stmt (gsi)))
>        {
>         last_stmt = gsi_stmt (gsi);
>         gsi_next (&gsi);
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr110091-1.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/pr110091-1.c
> new file mode 100644
> index 00000000000..793a832ec05
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr110091-1.c
> @@ -0,0 +1,38 @@
> +/* { dg-do compile } */
> +/* { dg-options "-Wall -O2 -fdump-tree-optimized" } */
> +/* PR tree-optimization/110091 */
> +/* The clobbers are before the outlined code */
> +
> +struct tEntry
> +{
> +    int value;
> +};
> +int *out;
> +
> +extern int otherfunc(struct tEntry *);
> +extern void anotherfunc(int val);
> +
> +void bar()
> +{
> +  {
> +    struct tEntry entry1 = { 0 };
> +    struct tEntry entry = { 0 };
> +
> +    if (otherfunc(&entry) != 0)
> +      return;
> +    if (otherfunc(&entry1) != 0)
> +      return;
> +    if (out)
> +     *out = entry.value; /* { dg-bogus "dangling pointer to" } */
> +  }
> +  anotherfunc(5);
> +}
> +
> +void foo()
> +{
> +    bar();
> +}
> +
> +/* There should be 4 CLOBBERs, 2 for entry1 and 2 for entry.  */
> +/* { dg-final { scan-tree-dump-times "CLOBBER\\\(eos\\\)" 4 "optimized" } } 
> */
> +
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr110091-2.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/pr110091-2.c
> new file mode 100644
> index 00000000000..d8512110396
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr110091-2.c
> @@ -0,0 +1,35 @@
> +/* { dg-do compile } */
> +/* { dg-options "-Wall -O2 -fdump-tree-optimized" } */
> +/* PR tree-optimization/110091 */
> +/* The clobbers are before the outlined code */
> +
> +struct tEntry
> +{
> +    int value;
> +};
> +int *out;
> +
> +extern int otherfunc(struct tEntry *);
> +extern void anotherfunc(int val);
> +
> +void bar()
> +{
> +  {
> +    struct tEntry entry = { 0 };
> +
> +    if (otherfunc(&entry) != 0)
> +      return;
> +    if (out)
> +     *out = entry.value; /* { dg-bogus "dangling pointer to" } */
> +  }
> +  anotherfunc(5);
> +}
> +
> +void foo()
> +{
> +    bar();
> +}
> +
> +/* There should be 4 CLOBBERs, 4 for entry; inlined doubles the clobber; 
> return path adds clobber.   */
> +/* { dg-final { scan-tree-dump-times "CLOBBER\\\(eos\\\)" 4 "optimized" } } 
> */
> +
> --
> 2.43.0
>

Reply via email to