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
>

Reply via email to