public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Lulu Cheng <chenglulu@loongson.cn>
To: Yang Yujie <yangyujie@loongson.cn>, gcc-patches@gcc.gnu.org
Cc: xry111@xry111.site, xuchenghua@loongson.cn
Subject: Re:[pushed] [PATCH v2] LoongArch: Enable switchable target
Date: Tue, 9 Apr 2024 17:23:52 +0800	[thread overview]
Message-ID: <6b4869c1-c92a-971d-5891-11d04f826096@loongson.cn> (raw)
In-Reply-To: <20240408084512.226082-2-yangyujie@loongson.cn>

Pushed to r14-9866.

在 2024/4/8 下午4:45, Yang Yujie 写道:
> This patch fixes the back-end context switching in cases where functions
> should be built with their own target contexts instead of the
> global one, such as LTO linking and functions with target attributes (TBD).
>
> 	PR target/113233
>
> gcc/ChangeLog:
>
> 	* config/loongarch/loongarch.cc (loongarch_reg_init):
> 	Reinitialize the loongarch_regno_mode_ok cache.
> 	(loongarch_option_override): Same.
> 	(loongarch_save_restore_target_globals): Restore target globals.
> 	(loongarch_set_current_function): Restore the target contexts
> 	for functions.
> 	(TARGET_SET_CURRENT_FUNCTION): Define.
> 	* config/loongarch/loongarch.h (SWITCHABLE_TARGET): Enable
> 	switchable target context.
> 	* config/loongarch/loongarch-builtins.cc (loongarch_init_builtins):
> 	Initialize all builtin functions at startup.
> 	(loongarch_expand_builtin): Turn assertion of builtin availability
> 	into a test.
>
> gcc/testsuite/ChangeLog:
>
> 	* lib/target-supports.exp: Define condition loongarch_sx_as.
> 	* gcc.dg/lto/pr113233_0.c: New test.
> ---
>   gcc/config/loongarch/loongarch-builtins.cc | 25 +++---
>   gcc/config/loongarch/loongarch.cc          | 91 ++++++++++++++++++++--
>   gcc/config/loongarch/loongarch.h           |  2 +
>   gcc/testsuite/gcc.dg/lto/pr113233_0.c      | 14 ++++
>   gcc/testsuite/lib/target-supports.exp      | 12 +++
>   5 files changed, 127 insertions(+), 17 deletions(-)
>   create mode 100644 gcc/testsuite/gcc.dg/lto/pr113233_0.c
>
> diff --git a/gcc/config/loongarch/loongarch-builtins.cc b/gcc/config/loongarch/loongarch-builtins.cc
> index efe7e5e5ebc..fbe46833c9b 100644
> --- a/gcc/config/loongarch/loongarch-builtins.cc
> +++ b/gcc/config/loongarch/loongarch-builtins.cc
> @@ -2512,14 +2512,11 @@ loongarch_init_builtins (void)
>     for (i = 0; i < ARRAY_SIZE (loongarch_builtins); i++)
>       {
>         d = &loongarch_builtins[i];
> -      if (d->avail ())
> -	{
> -	  type = loongarch_build_function_type (d->function_type);
> -	  loongarch_builtin_decls[i]
> -	    = add_builtin_function (d->name, type, i, BUILT_IN_MD, NULL,
> -				    NULL);
> -	  loongarch_get_builtin_decl_index[d->icode] = i;
> -	}
> +      type = loongarch_build_function_type (d->function_type);
> +      loongarch_builtin_decls[i]
> +	= add_builtin_function (d->name, type, i, BUILT_IN_MD, NULL,
> +			  NULL);
> +      loongarch_get_builtin_decl_index[d->icode] = i;
>       }
>   }
>   
> @@ -3105,15 +3102,21 @@ loongarch_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
>   			  int ignore ATTRIBUTE_UNUSED)
>   {
>     tree fndecl;
> -  unsigned int fcode, avail;
> +  unsigned int fcode;
>     const struct loongarch_builtin_description *d;
>   
>     fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
>     fcode = DECL_MD_FUNCTION_CODE (fndecl);
>     gcc_assert (fcode < ARRAY_SIZE (loongarch_builtins));
>     d = &loongarch_builtins[fcode];
> -  avail = d->avail ();
> -  gcc_assert (avail != 0);
> +
> +  if (!d->avail ())
> +    {
> +      error_at (EXPR_LOCATION (exp),
> +		"built-in function %qD is not enabled", fndecl);
> +      return target;
> +    }
> +
>     switch (d->builtin_type)
>       {
>       case LARCH_BUILTIN_DIRECT:
> diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc
> index c90b701a533..6b92e7034c5 100644
> --- a/gcc/config/loongarch/loongarch.cc
> +++ b/gcc/config/loongarch/loongarch.cc
> @@ -7570,15 +7570,19 @@ loongarch_global_init (void)
>   	loongarch_dwarf_regno[i] = INVALID_REGNUM;
>       }
>   
> +  /* Function to allocate machine-dependent function status.  */
> +  init_machine_status = &loongarch_init_machine_status;
> +};
> +
> +static void
> +loongarch_reg_init (void)
> +{
>     /* Set up loongarch_hard_regno_mode_ok.  */
>     for (int mode = 0; mode < MAX_MACHINE_MODE; mode++)
>       for (int regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
>         loongarch_hard_regno_mode_ok_p[mode][regno]
>   	= loongarch_hard_regno_mode_ok_uncached (regno, (machine_mode) mode);
> -
> -  /* Function to allocate machine-dependent function status.  */
> -  init_machine_status = &loongarch_init_machine_status;
> -};
> +}
>   
>   static void
>   loongarch_option_override_internal (struct loongarch_target *target,
> @@ -7605,20 +7609,92 @@ loongarch_option_override_internal (struct loongarch_target *target,
>   
>     /* Override some options according to the resolved target.  */
>     loongarch_target_option_override (target, opts, opts_set);
> +
> +  target_option_default_node = target_option_current_node
> +    = build_target_option_node (opts, opts_set);
> +
> +  loongarch_reg_init ();
> +}
> +
> +/* Remember the last target of loongarch_set_current_function.  */
> +
> +static GTY(()) tree loongarch_previous_fndecl;
> +
> +/* Restore or save the TREE_TARGET_GLOBALS from or to new_tree.
> +   Used by loongarch_set_current_function to
> +   make sure optab availability predicates are recomputed when necessary.  */
> +
> +static void
> +loongarch_save_restore_target_globals (tree new_tree)
> +{
> +  if (TREE_TARGET_GLOBALS (new_tree))
> +    restore_target_globals (TREE_TARGET_GLOBALS (new_tree));
> +  else if (new_tree == target_option_default_node)
> +    restore_target_globals (&default_target_globals);
> +  else
> +    TREE_TARGET_GLOBALS (new_tree) = save_target_globals_default_opts ();
> +}
> +
> +/* Implement TARGET_SET_CURRENT_FUNCTION.  */
> +
> +static void
> +loongarch_set_current_function (tree fndecl)
> +{
> +  if (fndecl == loongarch_previous_fndecl)
> +    return;
> +
> +  tree old_tree;
> +  if (loongarch_previous_fndecl == NULL_TREE)
> +    old_tree = target_option_current_node;
> +  else if (DECL_FUNCTION_SPECIFIC_TARGET (loongarch_previous_fndecl))
> +    old_tree = DECL_FUNCTION_SPECIFIC_TARGET (loongarch_previous_fndecl);
> +  else
> +    old_tree = target_option_default_node;
> +
> +  if (fndecl == NULL_TREE)
> +    {
> +      if (old_tree != target_option_current_node)
> +	{
> +	  loongarch_previous_fndecl = NULL_TREE;
> +	  cl_target_option_restore (&global_options, &global_options_set,
> +				    TREE_TARGET_OPTION
> +				    (target_option_current_node));
> +	}
> +      return;
> +    }
> +
> +  tree new_tree = DECL_FUNCTION_SPECIFIC_TARGET (fndecl);
> +  if (new_tree == NULL_TREE)
> +    new_tree = target_option_default_node;
> +
> +  loongarch_previous_fndecl = fndecl;
> +
> +  if (new_tree == old_tree)
> +    return;
> +
> +  cl_target_option_restore (&global_options, &global_options_set,
> +			    TREE_TARGET_OPTION (new_tree));
> +
> +  loongarch_reg_init ();
> +
> +  loongarch_save_restore_target_globals (new_tree);
>   }
>   
> +
> +
>   /* Implement TARGET_OPTION_OVERRIDE.  */
>   
>   static void
>   loongarch_option_override (void)
>   {
> +  /* Global initializations.  */
> +  loongarch_global_init ();
> +
>     /* Setting up the target configuration.  */
>     loongarch_option_override_internal (&la_target,
>   				      &global_options,
>   				      &global_options_set);
>   
> -  /* Global initializations.  */
> -  loongarch_global_init ();
>   }
>   
>   /* Implement TARGET_OPTION_SAVE.  */
> @@ -10935,6 +11011,9 @@ loongarch_asm_code_end (void)
>   #undef TARGET_OPTION_RESTORE
>   #define TARGET_OPTION_RESTORE loongarch_option_restore
>   
> +#undef TARGET_SET_CURRENT_FUNCTION
> +#define TARGET_SET_CURRENT_FUNCTION loongarch_set_current_function
> +
>   #undef TARGET_LEGITIMIZE_ADDRESS
>   #define TARGET_LEGITIMIZE_ADDRESS loongarch_legitimize_address
>   
> diff --git a/gcc/config/loongarch/loongarch.h b/gcc/config/loongarch/loongarch.h
> index 23bb3254883..db8a9eb9516 100644
> --- a/gcc/config/loongarch/loongarch.h
> +++ b/gcc/config/loongarch/loongarch.h
> @@ -23,6 +23,8 @@ along with GCC; see the file COPYING3.  If not see
>   
>   #include "config/loongarch/loongarch-opts.h"
>   
> +#define SWITCHABLE_TARGET 1
> +
>   #define TARGET_SUPPORTS_WIDE_INT 1
>   
>   /* Macros to silence warnings about numbers being signed in traditional
> diff --git a/gcc/testsuite/gcc.dg/lto/pr113233_0.c b/gcc/testsuite/gcc.dg/lto/pr113233_0.c
> new file mode 100644
> index 00000000000..0a045c51966
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/lto/pr113233_0.c
> @@ -0,0 +1,14 @@
> +/* { dg-require-effective-target loongarch_sx_as } */
> +/* { dg-lto-do link } */
> +/* { dg-skip-if "" { ! { loongarch*-linux-* } } } */
> +/* { dg-lto-options { {-mlsx } } } */
> +/* { dg-suppress-ld-options { -mlsx } } */
> +
> +#include <lsxintrin.h>
> +
> +int main (void)
> +{
> +  __m128i a, b, c;
> +  c = __lsx_vand_v (a, b);
> +  return 0;
> +}
> diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
> index 45435586de2..0122440e8d9 100644
> --- a/gcc/testsuite/lib/target-supports.exp
> +++ b/gcc/testsuite/lib/target-supports.exp
> @@ -13402,6 +13402,18 @@ proc check_effective_target_loongarch_sx { } {
>       } "-mlsx"]
>   }
>   
> +proc check_effective_target_loongarch_sx_as { } {
> +    return [check_no_compiler_messages loongarch_sx_as object {
> +        #include <lsxintrin.h>
> +        int main (void)
> +        {
> +          __m128i a, b, c;
> +          c = __lsx_vand_v (a, b);
> +          return 0;
> +        }
> +    } "-mlsx"]
> +}
> +
>   proc check_effective_target_loongarch_sx_hw { } {
>       return [check_runtime loongarch_sx_hw {
>   	#include <lsxintrin.h>


      parent reply	other threads:[~2024-04-09  9:24 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-08  8:45 Yang Yujie
2024-04-08  8:46 ` Yang Yujie
2024-04-08  8:49   ` Xi Ruoyao
2024-04-08  9:05     ` Yang Yujie
2024-04-09  9:23 ` Lulu Cheng [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6b4869c1-c92a-971d-5891-11d04f826096@loongson.cn \
    --to=chenglulu@loongson.cn \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=xry111@xry111.site \
    --cc=xuchenghua@loongson.cn \
    --cc=yangyujie@loongson.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).