On Wed, Dec 13, 2023 at 10:21 AM Jakub Jelinek <ja...@redhat.com> wrote: > > Hi! > > The following patch makes most of x86 MD builtins nothrow,leaf > (like most middle-end builtins are). For -fnon-call-exceptions it > doesn't nothrow, better might be to still add it if the builtins > don't read or write memory and can't raise floating point exceptions, > but we don't have such information readily available, so the patch > uses just !flag_non_call_exceptions for now. > Not sure if we shouldn't have some exceptions for the leaf attribute, > e.g. wonder about EMMS/FEMMS and the various xsave/xrstor etc. builtins, > pedantically none of those builtins do anything that leaf functions > are forbidden to do (having callbacks, calling functions from current TU, > longjump into the current TU), but sometimes non-leaf is also used on > really complex functions to prevent some unwanted optimizations. > That said, haven't run into any problems as is with the patch. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > 2023-12-13 Jakub Jelinek <ja...@redhat.com> > > PR target/112962 > * config/i386/i386-builtins.cc (ix86_builtins): Increase by one > element. > (def_builtin): If not -fnon-call-exceptions, set TREE_NOTHROW on > the builtin FUNCTION_DECL. Add leaf attribute to DECL_ATTRIBUTES. > (ix86_add_new_builtins): Likewise.
LGTM. Thanks, Uros. > > --- gcc/config/i386/i386-builtins.cc.jj 2023-10-13 19:34:43.767837029 +0200 > +++ gcc/config/i386/i386-builtins.cc 2023-12-12 12:20:50.980071085 +0100 > @@ -221,7 +221,7 @@ ix86_get_builtin_func_type (enum ix86_bu > } > > /* Table for the ix86 builtin decls. */ > -static GTY(()) tree ix86_builtins[(int) IX86_BUILTIN_MAX]; > +static GTY(()) tree ix86_builtins[(int) IX86_BUILTIN_MAX + 1]; > > struct builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX]; > > @@ -295,6 +295,12 @@ def_builtin (HOST_WIDE_INT mask, HOST_WI > NULL, NULL_TREE); > ix86_builtins[(int) code] = decl; > ix86_builtins_isa[(int) code].set_and_not_built_p = false; > + if (!flag_non_call_exceptions) > + TREE_NOTHROW (decl) = 1; > + if (ix86_builtins[(int) IX86_BUILTIN_MAX] == NULL_TREE) > + ix86_builtins[(int) IX86_BUILTIN_MAX] > + = build_tree_list (get_identifier ("leaf"), NULL_TREE); > + DECL_ATTRIBUTES (decl) = ix86_builtins[(int) IX86_BUILTIN_MAX]; > } > else > { > @@ -393,6 +399,12 @@ ix86_add_new_builtins (HOST_WIDE_INT isa > TREE_READONLY (decl) = 1; > if (ix86_builtins_isa[i].pure_p) > DECL_PURE_P (decl) = 1; > + if (!flag_non_call_exceptions) > + TREE_NOTHROW (decl) = 1; > + if (ix86_builtins[(int) IX86_BUILTIN_MAX] == NULL_TREE) > + ix86_builtins[(int) IX86_BUILTIN_MAX] > + = build_tree_list (get_identifier ("leaf"), NULL_TREE); > + DECL_ATTRIBUTES (decl) = ix86_builtins[(int) IX86_BUILTIN_MAX]; > } > } > > > Jakub >