On Tue, Nov 08, 2022 at 01:53:48PM +0100, Richard Biener wrote: > The following makes sure to set alignment information on the LHS > of __builtin_assume_alignment calls even when not optimizing so > uses as arguments to builtin functions like memcpy or __atomic_load_n > can be reflected at RTL expansion time. > > Bootstrap and regtest running on x86_64-unknown-linux-gnu, OK? > > Thanks, > Richard. > > PR tree-optimization/107389 > * gimple-low.cc (lower_builtin_assume_aligned): New. > (lower_stmt): Call it. > > * gcc.dg/pr107389.c: New testcase. > --- > gcc/gimple-low.cc | 41 +++++++++++++++++++++++++++++++++ > gcc/testsuite/gcc.dg/pr107389.c | 13 +++++++++++ > 2 files changed, 54 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/pr107389.c > > diff --git a/gcc/gimple-low.cc b/gcc/gimple-low.cc > index 512aa9feada..f9bcb772163 100644 > --- a/gcc/gimple-low.cc > +++ b/gcc/gimple-low.cc > @@ -84,6 +84,7 @@ static void lower_try_catch (gimple_stmt_iterator *, struct > lower_data *); > static void lower_gimple_return (gimple_stmt_iterator *, struct lower_data > *); > static void lower_builtin_setjmp (gimple_stmt_iterator *); > static void lower_builtin_posix_memalign (gimple_stmt_iterator *); > +static void lower_builtin_assume_aligned (gimple_stmt_iterator *); > > > /* Lower the body of current_function_decl from High GIMPLE into Low > @@ -768,6 +769,13 @@ lower_stmt (gimple_stmt_iterator *gsi, struct lower_data > *data) > lower_builtin_posix_memalign (gsi); > return; > } > + else if (DECL_FUNCTION_CODE (decl) == BUILT_IN_ASSUME_ALIGNED > + && !optimize) > + { > + lower_builtin_assume_aligned (gsi); > + data->cannot_fallthru = false; > + return; > + } > } > > if (decl && (flags_from_decl_or_type (decl) & ECF_NORETURN)) > @@ -1310,6 +1318,39 @@ lower_builtin_posix_memalign (gimple_stmt_iterator > *gsi) > gsi_insert_after (gsi, stmt, GSI_NEW_STMT); > gsi_insert_after (gsi, gimple_build_label (noalign_label), GSI_NEW_STMT); > } > + > +/* Lower calls to __builtin_assume_aligned when not optimizing. */ > + > +static void > +lower_builtin_assume_aligned (gimple_stmt_iterator *gsi) > +{ > + gcall *call = as_a <gcall *> (gsi_stmt (*gsi)); > + > + tree lhs = gimple_call_lhs (call); > + if (!lhs || !POINTER_TYPE_P (TREE_TYPE (lhs))) > + return;
I think nothing checks that TREE_CODE (lhs) == SSA_NAME, that isn't guaranteed before ssa pass. Otherwise LGTM. Jakub