On Tue, Sep 23, 2025 at 5:56 AM Andrew Pinski <[email protected]> wrote: > > This is the next patch in the series of removing fab. > This one is simplier than builtin_constant_p because the only > time we want to simplify this builtin is at the final folding step. > > Note align-5.c needs to change slightly as __builtin_assume_aligned > is no longer taken into account for the same reason as why PR 111875 > is closed as invalid and why the testcase is failing at -Og > I added a new testcase align-5a.c where the pointer is explictly aligned > so that the check is gone there. > Note __builtin_assume_aligned should really be instrumented for UBSAN, > I filed PR 122038 for that. > > Bootstrapped and tested on x86_64-linux-gnu.
OK. > PR tree-optimization/121762 > gcc/ChangeLog: > > * gimple-fold.cc (gimple_fold_builtin_assume_aligned): New function. > (gimple_fold_builtin): Call gimple_fold_builtin_assume_aligned > for BUILT_IN_ASSUME_ALIGNED. > * tree-ssa-ccp.cc (pass_fold_builtins::execute): Remove handling > of BUILT_IN_ASSUME_ALIGNED. > > gcc/testsuite/ChangeLog: > > * c-c++-common/ubsan/align-5.c: Update as __builtin_assume_aligned > is no longer taked into account. > * c-c++-common/ubsan/align-5a.c: New test. > > Signed-off-by: Andrew Pinski <[email protected]> > --- > gcc/gimple-fold.cc | 21 +++++++++++++++++++++ > gcc/testsuite/c-c++-common/ubsan/align-5.c | 7 +++---- > gcc/testsuite/c-c++-common/ubsan/align-5a.c | 18 ++++++++++++++++++ > gcc/tree-ssa-ccp.cc | 5 ----- > 4 files changed, 42 insertions(+), 9 deletions(-) > create mode 100644 gcc/testsuite/c-c++-common/ubsan/align-5a.c > > diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc > index 70e2d26291a..403fbe09102 100644 > --- a/gcc/gimple-fold.cc > +++ b/gcc/gimple-fold.cc > @@ -5231,6 +5231,24 @@ gimple_fold_builtin_constant_p (gimple_stmt_iterator > *gsi) > return true; > } > > +/* Fold __builtin_assume_aligned builtin. */ > + > +static bool > +gimple_fold_builtin_assume_aligned (gimple_stmt_iterator *gsi) > +{ > + if (!(cfun->curr_properties & PROP_last_full_fold)) > + return false; > + > + gcall *call = as_a<gcall*>(gsi_stmt (*gsi)); > + > + if (gimple_call_num_args (call) < 2) > + return false; > + > + gimplify_and_update_call_from_tree (gsi, gimple_call_arg (call, 0)); > + > + return true; > +} > + > /* Fold the non-target builtin at *GSI and return whether any simplification > was made. */ > > @@ -5403,6 +5421,9 @@ gimple_fold_builtin (gimple_stmt_iterator *gsi) > case BUILT_IN_CONSTANT_P: > return gimple_fold_builtin_constant_p (gsi); > > + case BUILT_IN_ASSUME_ALIGNED: > + return gimple_fold_builtin_assume_aligned (gsi); > + > default:; > } > > diff --git a/gcc/testsuite/c-c++-common/ubsan/align-5.c > b/gcc/testsuite/c-c++-common/ubsan/align-5.c > index b94e167bb67..484790134a6 100644 > --- a/gcc/testsuite/c-c++-common/ubsan/align-5.c > +++ b/gcc/testsuite/c-c++-common/ubsan/align-5.c > @@ -1,8 +1,7 @@ > /* { dg-do compile } */ > /* { dg-options "-fno-sanitize=null -fsanitize=alignment -O2" } */ > -/* Check that when optimizing if we know the alignment is right > - and we are not doing -fsanitize=null instrumentation we don't > - instrument the alignment check. */ > +/* __builtin_assume_aligned should be instrumented too. UBSAN alignment > + should not depend on it. */ > > __attribute__((noinline, noclone)) int > foo (char *p) > @@ -12,4 +11,4 @@ foo (char *p) > return *q; > } > > -/* { dg-final { scan-assembler-not "__ubsan_handle" } } */ > +/* { dg-final { scan-assembler "__ubsan_handle" } } */ > diff --git a/gcc/testsuite/c-c++-common/ubsan/align-5a.c > b/gcc/testsuite/c-c++-common/ubsan/align-5a.c > new file mode 100644 > index 00000000000..d86e5377e03 > --- /dev/null > +++ b/gcc/testsuite/c-c++-common/ubsan/align-5a.c > @@ -0,0 +1,18 @@ > +/* { dg-do compile } */ > +/* { dg-options "-fno-sanitize=null -fsanitize=alignment -O2" } */ > +/* Check that when optimizing if we know the alignment is right > + and we are not doing -fsanitize=null instrumentation we don't > + instrument the alignment check. */ > + > +__attribute__((noinline, noclone)) int > +foo (int *p) > +{ > + /* Align the pointer explictly. */ > + __INTPTR_TYPE__ t = (__INTPTR_TYPE__)p; > + t &= ~0xf; > + p = (int*)t; > + > + return *p; > +} > + > +/* { dg-final { scan-assembler-not "__ubsan_handle" } } */ > diff --git a/gcc/tree-ssa-ccp.cc b/gcc/tree-ssa-ccp.cc > index 4bdcd00219d..070289ca9f0 100644 > --- a/gcc/tree-ssa-ccp.cc > +++ b/gcc/tree-ssa-ccp.cc > @@ -4317,11 +4317,6 @@ pass_fold_builtins::execute (function *fun) > switch (DECL_FUNCTION_CODE (callee)) > { > > - case BUILT_IN_ASSUME_ALIGNED: > - /* Remove __builtin_assume_aligned. */ > - result = gimple_call_arg (stmt, 0); > - break; > - > case BUILT_IN_STACK_RESTORE: > result = optimize_stack_restore (i); > if (result) > -- > 2.43.0 >
