From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 7FA5A385E839 for ; Wed, 24 Jan 2024 17:41:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7FA5A385E839 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 7FA5A385E839 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=1706118066; cv=none; b=m9cy5w0+qDXdmJmd0WxP+alnLi6JDqIz4O4Bmh12VP5I7iUS0KxCIDi09/BUwLU6xkS4Ee8ukLMBaHz9NKczATHS0W6Iuh+1zJvsbrIUznq2HMvK0JGcYrS5pPFTW5opQON0Ep9mZ3qssmaPfGrWXoyM6Dn5xy+byJwBha6yP1M= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706118066; c=relaxed/simple; bh=qTBcEN3xYsW+Oyb0B/nkZ3udyGT1bqJ72cbZJZR152c=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=DWL/g/vVLUh6Mpymi/aLMl8AMhyd3ImPDHRqeT1LEEKEi4IP4zPdz1H91ERKb84xdX3q/7FtOA1E0yCz+cF0PciVRKoLxFMAlpdWVJ6Pt1n3tbczyEK50PvblVfjjekUzLu+9IAO5GD9yx8kgeSv4I7844YP9pt96msfCCeo14w= 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 BF66C1FB; Wed, 24 Jan 2024 09:41:46 -0800 (PST) Received: from localhost (e121540-lin.manchester.arm.com [10.32.110.72]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 863E53F762; Wed, 24 Jan 2024 09:41:01 -0800 (PST) From: Richard Sandiford To: Szabolcs Nagy Mail-Followup-To: Szabolcs Nagy ,, richard.sandiford@arm.com Cc: Subject: Re: [PATCH] aarch64: Fix eh_return for -mtrack-speculation [PR112987] References: <20240117143703.2998316-1-szabolcs.nagy@arm.com> Date: Wed, 24 Jan 2024 17:41:00 +0000 In-Reply-To: <20240117143703.2998316-1-szabolcs.nagy@arm.com> (Szabolcs Nagy's message of "Wed, 17 Jan 2024 14:37:03 +0000") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-21.3 required=5.0 tests=BAYES_00,GIT_PATCH_0,KAM_DMARC_NONE,KAM_DMARC_STATUS,KAM_LAZY_DOMAIN_SECURITY,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 List-Id: Szabolcs Nagy writes: > Recent commit introduced a conditional branch in eh_return epilogues > that is not compatible with speculation tracking: > > commit 426fddcbdad6746fe70e031f707fb07f55dfb405 > Author: Szabolcs Nagy > CommitDate: 2023-11-27 15:52:48 +0000 > > aarch64: Use br instead of ret for eh_return > > gcc/ChangeLog: > > PR target/112987 > * config/aarch64/aarch64.cc (aarch64_expand_epilogue): Use > explicit compare and separate jump with speculation tracking. > --- > gcc/config/aarch64/aarch64.cc | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc > index e6bd3fd0bb4..e6de62dc02a 100644 > --- a/gcc/config/aarch64/aarch64.cc > +++ b/gcc/config/aarch64/aarch64.cc > @@ -9879,7 +9879,17 @@ aarch64_expand_epilogue (rtx_call_insn *sibcall) > is just as correct as retaining the CFA from the body > of the function. Therefore, do nothing special. */ > rtx label = gen_label_rtx (); > - rtx x = gen_rtx_EQ (VOIDmode, EH_RETURN_TAKEN_RTX, const0_rtx); > + rtx x; > + if (aarch64_track_speculation) > + { > + /* Emit an explicit compare, so cc can be tracked. */ > + rtx cc_reg = aarch64_gen_compare_reg (EQ, > + EH_RETURN_TAKEN_RTX, > + const0_rtx); > + x = gen_rtx_EQ (GET_MODE (cc_reg), cc_reg, const0_rtx); > + } > + else > + x = gen_rtx_EQ (VOIDmode, EH_RETURN_TAKEN_RTX, const0_rtx); It looks from a quick scan like we already have 3 instances of this kind of construct. Would you mind factoring them out into a helper? E.g. (strawman): static rtx aarch64_gen_compare_zero_and_branch (rtx_code code, rtx x, rtx_label *label) { } that returns the SET pattern. The caller can then emit the pattern using whichever interface is appropriate. Thanks, Richard > x = gen_rtx_IF_THEN_ELSE (VOIDmode, x, > gen_rtx_LABEL_REF (Pmode, label), pc_rtx); > rtx jump = emit_jump_insn (gen_rtx_SET (pc_rtx, x));