From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id CA7753858D20 for ; Sun, 7 Apr 2024 07:59:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CA7753858D20 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn ARC-Filter: OpenARC Filter v1.0.0 sourceware.org CA7753858D20 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712476764; cv=none; b=bnXyUwuQr3JxXHiCIkwcsURkJPu91S3ybTzmqjicrIOXPGsafQhIgwJKAIWtp/SQBjHeWa96gcZCnzUiJUIkasMVFvttkjriL0Q+MGmmS44j4DzxSzXQBFud0m6WMwrAgkL1nvoNJ+UbNNFj4yfctghVufAAMVjCqq3o4wIWr+c= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712476764; c=relaxed/simple; bh=Y3yp6017Ixas2wQ2TpG3uRUKhDiwAf53ObL40nY47Yc=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=bVDyrzj70pSMYZJzPae59fDKvBXUtM1sb/GTtIdbjRKnMQv/UWc5UyiKDI9WjLtVVlEkT3KZNPMBbCi1jOrY5k162QpW8kiFxffmyrR335xAPwzS57mnGbz0c+ZFCNP1sf7u8QJxPhh806yMxwER89bAmfO9VqZc5CgVzLlBiPs= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from loongson.cn (unknown [114.243.100.253]) by gateway (Coremail) with SMTP id _____8DxebpRUhJmj_8jAA--.1710S3; Sun, 07 Apr 2024 15:59:15 +0800 (CST) Received: from localhost.localdomain (unknown [114.243.100.253]) by localhost.localdomain (Coremail) with SMTP id AQAAf8BxE8xOUhJmNoN0AA--.8446S2; Sun, 07 Apr 2024 15:59:11 +0800 (CST) From: Yang Yujie To: gcc-patches@gcc.gnu.org Cc: chenglulu@loongson.cn, xuchenghua@loongson.cn, Yang Yujie Subject: [PATCH] LoongArch: Enable switchable target Date: Sun, 7 Apr 2024 15:47:44 +0800 Message-ID: <20240407074743.2747877-2-yangyujie@loongson.cn> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID:AQAAf8BxE8xOUhJmNoN0AA--.8446S2 X-CM-SenderInfo: 51dqw5pxmlvqxorr0wxvrqhubq/1tbiAQASAGYPtmoA1QBLs4 X-Coremail-Antispam: 1Uk129KBj93XoWxtrWrCryfZr4fWw18XF4kXwc_yoWfWFWDpr 9rZr15tr48JFZ3GrZ3tas5Xrn8A3y7Gw17uFySyrWxCw43Jr9Fq3Z5Kr9xXF1UJay3Wr1I vF18Z3W3Za1DAwbCm3ZEXasCq-sJn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7ZEXa sCq-sGcSsGvfJ3Ic02F40EFcxC0VAKzVAqx4xG6I80ebIjqfuFe4nvWSU5nxnvy29KBjDU 0xBIdaVrnRJUUUkFb4IE77IF4wAFF20E14v26r1j6r4UM7CY07I20VC2zVCF04k26cxKx2 IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48v e4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_Jr0_JF4l84ACjcxK6xIIjxv20xvEc7CjxVAFwI 0_Jr0_Gr1l84ACjcxK6I8E87Iv67AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVCY1x0267AK xVW8Jr0_Cr1UM2AIxVAIcxkEcVAq07x20xvEncxIr21l57IF6xkI12xvs2x26I8E6xACxx 1l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjxv20xvE14v26r1j6r18McIj6I8E87Iv 67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41l42xK82IYc2 Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s02 6x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r126r1DMIIYrxkI7VAKI48JMIIF0x vE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r1j6r4UMIIF0xvE 42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6x kF7I0E14v26r1j6r4UYxBIdaVFxhVjvjDU0xZFpf9x07UE-erUUUUU= X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00,GIT_PATCH_0,KAM_DMARC_STATUS,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: 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 + +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 + 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 -- 2.44.0