From patchwork Tue Dec 5 10:13:23 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 173916 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:bcd1:0:b0:403:3b70:6f57 with SMTP id r17csp3331025vqy; Tue, 5 Dec 2023 02:19:30 -0800 (PST) X-Google-Smtp-Source: AGHT+IGN9UFwFq4IRIPQosuAThfg12dq8zecNXIiw/IcPMd/upfIZ7pbhC4cISJBFFZubd+pEWd9 X-Received: by 2002:a05:690c:dd0:b0:5d7:1940:b38a with SMTP id db16-20020a05690c0dd000b005d71940b38amr5811994ywb.86.1701771569952; Tue, 05 Dec 2023 02:19:29 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1701771569; cv=pass; d=google.com; s=arc-20160816; b=XfpQ/iFQJO7CT5U7O2Q7n39YjJioNRf8MfcxxZXH+PnyO6NxOZL/NAgc/zWOEeu4do 6Y1qwrDXUGWiSG/BMofJoyLL3Zbcyzf1rSZe0Hzg29SeSa37J14mtYUTGzZ6o2BLBHdX zaD3WAvh4sljvr3DIYR4YdD4zyhY6/gExT23lD00JY0BQ8U9oAHUvxPhceMLTJQy2ckZ X3POlofS77QAgzICc3aoFoL/+PW9P5XZZH7Pri+iZcJwdBoKDosgrOPodlysENlwZXrq PNNcI9gsTInhUD8OsfvIPZ3i5D2nbTUnqlOFb310BoIEBxeS/A1546tMVts9wkh2ayT3 al6w== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:arc-filter:dmarc-filter:delivered-to; bh=PuxzjKOP1TIOOFzblf0B76ietDd0u3tyJ/zxc03NwoY=; fh=C4nEn4uRKApr1WsFtLyJD8L5BeRuRc+JFyqoopFjd9M=; b=OJcJmmu5YN+FckTllVPcRVJMtI5K47lpr0vbMLYUd0JjdbVEHRu22rcMQ5hkxpl4+s 9hdNjG4mCeRdHROF0MDheObcVKhwGSWNWn9mLuedohoTDM04eDQbLqcM+Zk3HVC+VOxT eN/G2P8fXAQUIbXzSLX3D+0kQOKmjrjSPqzoup6DlarISTTRPjEEO3/IZ+ZOZQmOcV+Y z4VlGXOGggJ9vKHozGEITl3p6L+mZzpyoE5yf4Nq1FZg5TuRUqrgEpMWXk7jbgsSrmn4 Im0EUWXReZsQ7954yh8XduwsfTwOjaijViMCMJ0X9Igb14IWQphATu6ATkuuDl4Ixudx oeGA== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from server2.sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id br15-20020a05620a460f00b0077d7e876b09si12545291qkb.336.2023.12.05.02.19.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Dec 2023 02:19:29 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 91A993861861 for ; Tue, 5 Dec 2023 10:19:11 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 26EA0384F00A for ; Tue, 5 Dec 2023 10:13:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 26EA0384F00A Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 26EA0384F00A Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1701771233; cv=none; b=E5satoR32jiBPgTGC5uPSV636fbcsR8Ti6kELdDaodlBLIb74FY1Ie/4H139gu4dR1ap0NlSVsXst2kVAyZi9ZuN2h7QSmkuWSIR2unkJMaebzunmx3xw18Eua+ugUVx+jzuI1wYM0jgsXpSPmYfLlyEmkcf9HQniNVYlSCijzw= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1701771233; c=relaxed/simple; bh=8no+6jvoD/wjnrjrqb9BE2F0AdAdtdkc7kxxjFIceXE=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=WniXiqZGqU8MBGhI8TrZE9Hm2evqJ9CGcYe3VVzEIorKv//wPnrWUWP30dMpasqM9eySpkCx91fxk5LDDTMKJNFqHJZ/dC9hSHjFU8PBe/MASWCuQD69Wq+OfJdEncK8+s0BG4pgUgrilIVCbFwppFCKX7QYN08fIHHiILnnlK4= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5E622FEC; Tue, 5 Dec 2023 02:14:37 -0800 (PST) Received: from e121540-lin.manchester.arm.com (e121540-lin.manchester.arm.com [10.32.110.72]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 502EE3F5A1; Tue, 5 Dec 2023 02:13:50 -0800 (PST) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Cc: Richard Sandiford Subject: [pushed v2 25/25] aarch64: Update sibcall handling for SME Date: Tue, 5 Dec 2023 10:13:23 +0000 Message-Id: <20231205101323.1914247-26-richard.sandiford@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231205101323.1914247-1-richard.sandiford@arm.com> References: <20231205101323.1914247-1-richard.sandiford@arm.com> MIME-Version: 1.0 X-Spam-Status: No, score=-22.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, KAM_SHORT, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1784436825923677304 X-GMAIL-MSGID: 1784436825923677304 We only support tail calls between functions with the same PSTATE.ZA setting ("private-ZA" to "private-ZA" and "shared-ZA" to "shared-ZA"). Only a normal non-streaming function can tail-call another non-streaming function, and only a streaming function can tail-call another streaming function. Any function can tail-call a streaming-compatible function. gcc/ * config/aarch64/aarch64.cc (aarch64_function_ok_for_sibcall): Enforce PSTATE.SM and PSTATE.ZA restrictions. (aarch64_expand_epilogue): Save and restore the arguments to a sibcall around any change to PSTATE.SM. gcc/testsuite/ * gcc.target/aarch64/sme/sibcall_1.c: New test. * gcc.target/aarch64/sme/sibcall_2.c: Likewise. * gcc.target/aarch64/sme/sibcall_3.c: Likewise. * gcc.target/aarch64/sme/sibcall_4.c: Likewise. * gcc.target/aarch64/sme/sibcall_5.c: Likewise. * gcc.target/aarch64/sme/sibcall_6.c: Likewise. * gcc.target/aarch64/sme/sibcall_7.c: Likewise. * gcc.target/aarch64/sme/sibcall_8.c: Likewise. --- gcc/config/aarch64/aarch64.cc | 9 +++- .../gcc.target/aarch64/sme/sibcall_1.c | 45 +++++++++++++++++++ .../gcc.target/aarch64/sme/sibcall_2.c | 45 +++++++++++++++++++ .../gcc.target/aarch64/sme/sibcall_3.c | 45 +++++++++++++++++++ .../gcc.target/aarch64/sme/sibcall_4.c | 45 +++++++++++++++++++ .../gcc.target/aarch64/sme/sibcall_5.c | 45 +++++++++++++++++++ .../gcc.target/aarch64/sme/sibcall_6.c | 26 +++++++++++ .../gcc.target/aarch64/sme/sibcall_7.c | 26 +++++++++++ .../gcc.target/aarch64/sme/sibcall_8.c | 19 ++++++++ 9 files changed, 304 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/sme/sibcall_1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sme/sibcall_2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sme/sibcall_3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sme/sibcall_4.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sme/sibcall_5.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sme/sibcall_6.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sme/sibcall_7.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sme/sibcall_8.c diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index 4639310f108..48b7811c100 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -6124,6 +6124,11 @@ aarch64_function_ok_for_sibcall (tree, tree exp) if (crtl->abi->id () != expr_callee_abi (exp).id ()) return false; + tree fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (exp))); + if (aarch64_fntype_pstate_sm (fntype) & ~aarch64_cfun_incoming_pstate_sm ()) + return false; + if (aarch64_fntype_pstate_za (fntype) != aarch64_cfun_incoming_pstate_za ()) + return false; return true; } @@ -9564,7 +9569,9 @@ aarch64_expand_epilogue (rtx_call_insn *sibcall) guard_label = aarch64_guard_switch_pstate_sm (IP0_REGNUM, aarch64_isa_flags); aarch64_sme_mode_switch_regs return_switch; - if (crtl->return_rtx && REG_P (crtl->return_rtx)) + if (sibcall) + return_switch.add_call_args (sibcall); + else if (crtl->return_rtx && REG_P (crtl->return_rtx)) return_switch.add_reg (GET_MODE (crtl->return_rtx), REGNO (crtl->return_rtx)); return_switch.emit_prologue (); diff --git a/gcc/testsuite/gcc.target/aarch64/sme/sibcall_1.c b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_1.c new file mode 100644 index 00000000000..c7530de5c37 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_1.c @@ -0,0 +1,45 @@ +/* { dg-options "-O2" } */ + +void sc_callee () [[arm::streaming_compatible]]; +void s_callee () [[arm::streaming]]; +void n_callee (); + +[[arm::locally_streaming]] __attribute__((noipa)) void +sc_ls_callee () [[arm::streaming_compatible]] {} +[[arm::locally_streaming]] __attribute__((noipa)) void +n_ls_callee () {} + +void +sc_to_sc () [[arm::streaming_compatible]] +{ + sc_callee (); +} +/* { dg-final { scan-assembler {\tb\tsc_callee} } } */ + +void +sc_to_s () [[arm::streaming_compatible]] +{ + s_callee (); +} +/* { dg-final { scan-assembler {\tbl\ts_callee} } } */ + +void +sc_to_n () [[arm::streaming_compatible]] +{ + n_callee (); +} +/* { dg-final { scan-assembler {\tbl\tn_callee} } } */ + +void +sc_to_sc_ls () [[arm::streaming_compatible]] +{ + sc_ls_callee (); +} +/* { dg-final { scan-assembler {\tb\tsc_ls_callee} } } */ + +void +sc_to_n_ls () [[arm::streaming_compatible]] +{ + n_ls_callee (); +} +/* { dg-final { scan-assembler {\tbl\tn_ls_callee} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sme/sibcall_2.c b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_2.c new file mode 100644 index 00000000000..8d1c8a9f901 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_2.c @@ -0,0 +1,45 @@ +/* { dg-options "-O2" } */ + +void sc_callee () [[arm::streaming_compatible]]; +void s_callee () [[arm::streaming]]; +void n_callee (); + +[[arm::locally_streaming]] __attribute__((noipa)) void +sc_ls_callee () [[arm::streaming_compatible]] {} +[[arm::locally_streaming]] __attribute__((noipa)) void +n_ls_callee () {} + +void +s_to_sc () [[arm::streaming]] +{ + sc_callee (); +} +/* { dg-final { scan-assembler {\tb\tsc_callee} } } */ + +void +s_to_s () [[arm::streaming]] +{ + s_callee (); +} +/* { dg-final { scan-assembler {\tb\ts_callee} } } */ + +void +s_to_n () [[arm::streaming]] +{ + n_callee (); +} +/* { dg-final { scan-assembler {\tbl\tn_callee} } } */ + +void +s_to_sc_ls () [[arm::streaming]] +{ + sc_ls_callee (); +} +/* { dg-final { scan-assembler {\tb\tsc_ls_callee} } } */ + +void +s_to_n_ls () [[arm::streaming]] +{ + n_ls_callee (); +} +/* { dg-final { scan-assembler {\tbl\tn_ls_callee} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sme/sibcall_3.c b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_3.c new file mode 100644 index 00000000000..2ae937fc5dc --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_3.c @@ -0,0 +1,45 @@ +/* { dg-options "-O2" } */ + +void sc_callee () [[arm::streaming_compatible]]; +void s_callee () [[arm::streaming]]; +void n_callee (); + +[[arm::locally_streaming]] __attribute__((noipa)) void +sc_ls_callee () [[arm::streaming_compatible]] {} +[[arm::locally_streaming]] __attribute__((noipa)) void +n_ls_callee () {} + +void +n_to_sc () +{ + sc_callee (); +} +/* { dg-final { scan-assembler {\tb\tsc_callee} } } */ + +void +n_to_s () +{ + s_callee (); +} +/* { dg-final { scan-assembler {\tbl\ts_callee} } } */ + +void +n_to_n () +{ + n_callee (); +} +/* { dg-final { scan-assembler {\tb\tn_callee} } } */ + +void +n_to_sc_ls () +{ + sc_ls_callee (); +} +/* { dg-final { scan-assembler {\tb\tsc_ls_callee} } } */ + +void +n_to_n_ls () +{ + n_ls_callee (); +} +/* { dg-final { scan-assembler {\tb\tn_ls_callee} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sme/sibcall_4.c b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_4.c new file mode 100644 index 00000000000..6935a1bd740 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_4.c @@ -0,0 +1,45 @@ +/* { dg-options "-O2" } */ + +void sc_callee () [[arm::streaming_compatible]]; +void s_callee () [[arm::streaming]]; +void n_callee (); + +[[arm::locally_streaming]] __attribute__((noipa)) void +sc_ls_callee () [[arm::streaming_compatible]] {} +[[arm::locally_streaming]] __attribute__((noipa)) void +n_ls_callee () {} + +[[arm::locally_streaming]] void +sc_to_sc () [[arm::streaming_compatible]] +{ + sc_callee (); +} +/* { dg-final { scan-assembler {\tb\tsc_callee} } } */ + +[[arm::locally_streaming]] void +sc_to_s () [[arm::streaming_compatible]] +{ + s_callee (); +} +/* { dg-final { scan-assembler {\tbl\ts_callee} } } */ + +[[arm::locally_streaming]] void +sc_to_n () [[arm::streaming_compatible]] +{ + n_callee (); +} +/* { dg-final { scan-assembler {\tbl\tn_callee} } } */ + +[[arm::locally_streaming]] void +sc_to_sc_ls () [[arm::streaming_compatible]] +{ + sc_ls_callee (); +} +/* { dg-final { scan-assembler {\tb\tsc_ls_callee} } } */ + +[[arm::locally_streaming]] void +sc_to_n_ls () [[arm::streaming_compatible]] +{ + n_ls_callee (); +} +/* { dg-final { scan-assembler {\tbl\tn_ls_callee} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sme/sibcall_5.c b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_5.c new file mode 100644 index 00000000000..7aaf58dfa22 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_5.c @@ -0,0 +1,45 @@ +/* { dg-options "-O2" } */ + +void sc_callee () [[arm::streaming_compatible]]; +void s_callee () [[arm::streaming]]; +void n_callee (); + +[[arm::locally_streaming]] __attribute__((noipa)) void +sc_ls_callee () [[arm::streaming_compatible]] {} +[[arm::locally_streaming]] __attribute__((noipa)) void +n_ls_callee () {} + +[[arm::locally_streaming]] void +n_to_sc () +{ + sc_callee (); +} +/* { dg-final { scan-assembler {\tb\tsc_callee} } } */ + +[[arm::locally_streaming]] void +n_to_s () +{ + s_callee (); +} +/* { dg-final { scan-assembler {\tbl\ts_callee} } } */ + +[[arm::locally_streaming]] void +n_to_n () +{ + n_callee (); +} +/* { dg-final { scan-assembler {\tb\tn_callee} } } */ + +[[arm::locally_streaming]] void +n_to_sc_ls () +{ + sc_ls_callee (); +} +/* { dg-final { scan-assembler {\tb\tsc_ls_callee} } } */ + +[[arm::locally_streaming]] void +n_to_n_ls () +{ + n_ls_callee (); +} +/* { dg-final { scan-assembler {\tb\tn_ls_callee} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sme/sibcall_6.c b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_6.c new file mode 100644 index 00000000000..e568edb17dd --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_6.c @@ -0,0 +1,26 @@ +/* { dg-options "-O2" } */ + +void shared_callee () [[arm::inout("za")]]; +[[arm::new("za")]] __attribute__((noipa)) void new_callee () {} +void normal_callee (); + +void +shared_to_shared () [[arm::inout("za")]] +{ + shared_callee (); +} +/* { dg-final { scan-assembler {\tb\tshared_callee} } } */ + +void +shared_to_new () [[arm::inout("za")]] +{ + new_callee (); +} +/* { dg-final { scan-assembler {\tbl\tnew_callee} } } */ + +void +shared_to_normal () [[arm::inout("za")]] +{ + normal_callee (); +} +/* { dg-final { scan-assembler {\tbl\tnormal_callee} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sme/sibcall_7.c b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_7.c new file mode 100644 index 00000000000..a5f576d2044 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_7.c @@ -0,0 +1,26 @@ +/* { dg-options "-O2" } */ + +void shared_callee () [[arm::inout("za")]]; +[[arm::new("za")]] __attribute__((noipa)) void new_callee () {} +void normal_callee (); + +[[arm::new("za")]] void +new_to_shared () +{ + shared_callee (); +} +/* { dg-final { scan-assembler {\tbl\tshared_callee} } } */ + +[[arm::new("za")]] void +new_to_new () +{ + new_callee (); +} +/* { dg-final { scan-assembler {\tb\tnew_callee} } } */ + +[[arm::new("za")]] void +new_to_normal () +{ + normal_callee (); +} +/* { dg-final { scan-assembler {\tb\tnormal_callee} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sme/sibcall_8.c b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_8.c new file mode 100644 index 00000000000..33370f7a87f --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sme/sibcall_8.c @@ -0,0 +1,19 @@ +/* { dg-options "-O2" } */ + +void shared_callee () [[arm::inout("za")]]; +[[arm::new("za")]] __attribute__((noipa)) void new_callee () {} +void normal_callee (); + +void +normal_to_new () +{ + new_callee (); +} +/* { dg-final { scan-assembler {\tb\tnew_callee} } } */ + +void +normal_to_normal () +{ + normal_callee (); +} +/* { dg-final { scan-assembler {\tb\tnormal_callee} } } */