From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1130) id E823F3839DC8; Thu, 20 Oct 2022 22:34:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E823F3839DC8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1666305242; bh=t0GrP/VZ8YRrto6SLHF0GWQAvRyHQXGxgyXoVYsYYXE=; h=From:To:Subject:Date:From; b=yAYiygSdDBK165be3/pj2OmMa4gT5wvwApXloMVcox5dOY14mrGUCaS961qX1n+Pr vovkQstXrap7CZ5QyWc0HJlypXqOT5nC2+hYLH0lyUhm5sH+MFzwz2HIsGWc9Sd4rq zcf8dzsNEDeEqW4qtm/Tn/A62YJ2DmNxIgbSijCs= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Richard Sandiford To: gcc-cvs@gcc.gnu.org Subject: [gcc r11-10326] aarch64: Prevent generation of /M BRKAS and BRKBS X-Act-Checkin: gcc X-Git-Author: Richard Sandiford X-Git-Refname: refs/heads/releases/gcc-11 X-Git-Oldrev: 97fe49b9af326fd3f8168386f535b2a25cbaf2d4 X-Git-Newrev: b08fe59022d4a40e11581056925caf1eadbf31ab Message-Id: <20221020223402.E823F3839DC8@sourceware.org> Date: Thu, 20 Oct 2022 22:34:02 +0000 (GMT) List-Id: https://gcc.gnu.org/g:b08fe59022d4a40e11581056925caf1eadbf31ab commit r11-10326-gb08fe59022d4a40e11581056925caf1eadbf31ab Author: Richard Sandiford Date: Thu Oct 20 23:33:39 2022 +0100 aarch64: Prevent generation of /M BRKAS and BRKBS Bit of a brown-paper-bag bug, but: GCC was generating non-existent merging forms of BRKAS and BRKBS. Those instructions only support zero predication (although BRKA and BRKB support both). gcc/ * config/aarch64/aarch64-sve.md (*aarch64_brk_cc): Remove merging alternative. (*aarch64_brk_ptest): Likewise. gcc/testsuite/ * gcc.target/aarch64/sve/acle/general/brka_1.c: Expect a separate PTEST instruction. * gcc.target/aarch64/sve/acle/general/brkb_1.c: Likewise. (cherry picked from commit 57675c7f92a3bd3ca8dae1faac7f2f51d40e0f9e) Diff: --- gcc/config/aarch64/aarch64-sve.md | 24 +++++++++------------- .../gcc.target/aarch64/sve/acle/general/brka_1.c | 5 +++-- .../gcc.target/aarch64/sve/acle/general/brkb_1.c | 5 +++-- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/gcc/config/aarch64/aarch64-sve.md b/gcc/config/aarch64/aarch64-sve.md index 3132a6a8d85..509b7120a1b 100644 --- a/gcc/config/aarch64/aarch64-sve.md +++ b/gcc/config/aarch64/aarch64-sve.md @@ -9430,45 +9430,41 @@ (define_insn "*aarch64_brk_cc" [(set (reg:CC_NZC CC_REGNUM) (unspec:CC_NZC - [(match_operand:VNx16BI 1 "register_operand" "Upa, Upa") + [(match_operand:VNx16BI 1 "register_operand" "Upa") (match_dup 1) (match_operand:SI 4 "aarch64_sve_ptrue_flag") (unspec:VNx16BI [(match_dup 1) - (match_operand:VNx16BI 2 "register_operand" "Upa, Upa") - (match_operand:VNx16BI 3 "aarch64_simd_reg_or_zero" "Dz, 0")] + (match_operand:VNx16BI 2 "register_operand" "Upa") + (match_operand:VNx16BI 3 "aarch64_simd_imm_zero")] SVE_BRK_UNARY)] UNSPEC_PTEST)) - (set (match_operand:VNx16BI 0 "register_operand" "=Upa, Upa") + (set (match_operand:VNx16BI 0 "register_operand" "=Upa") (unspec:VNx16BI [(match_dup 1) (match_dup 2) (match_dup 3)] SVE_BRK_UNARY))] "TARGET_SVE" - "@ - brks\t%0.b, %1/z, %2.b - brks\t%0.b, %1/m, %2.b" + "brks\t%0.b, %1/z, %2.b" ) ;; Same, but with only the flags result being interesting. (define_insn "*aarch64_brk_ptest" [(set (reg:CC_NZC CC_REGNUM) (unspec:CC_NZC - [(match_operand:VNx16BI 1 "register_operand" "Upa, Upa") + [(match_operand:VNx16BI 1 "register_operand" "Upa") (match_dup 1) (match_operand:SI 4 "aarch64_sve_ptrue_flag") (unspec:VNx16BI [(match_dup 1) - (match_operand:VNx16BI 2 "register_operand" "Upa, Upa") - (match_operand:VNx16BI 3 "aarch64_simd_reg_or_zero" "Dz, 0")] + (match_operand:VNx16BI 2 "register_operand" "Upa") + (match_operand:VNx16BI 3 "aarch64_simd_imm_zero")] SVE_BRK_UNARY)] UNSPEC_PTEST)) - (clobber (match_scratch:VNx16BI 0 "=Upa, Upa"))] + (clobber (match_scratch:VNx16BI 0 "=Upa"))] "TARGET_SVE" - "@ - brks\t%0.b, %1/z, %2.b - brks\t%0.b, %1/m, %2.b" + "brks\t%0.b, %1/z, %2.b" ) ;; ------------------------------------------------------------------------- diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/brka_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/brka_1.c index 24aa8f317c4..6146ef82849 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/brka_1.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/brka_1.c @@ -18,5 +18,6 @@ test2 (svbool_t pg, svbool_t x, svbool_t y, int *any) return svptest_any (pg, res); } -/* { dg-final { scan-assembler-times {\tbrkas\tp[0-9]+\.b, p[0-9]+/m,} 2 } } */ -/* { dg-final { scan-assembler-not {\tbrka\t} } } */ +/* { dg-final { scan-assembler-times {\tbrka\t} 2 } } */ +/* { dg-final { scan-assembler-times {\tptest\t} 2 } } */ +/* { dg-final { scan-assembler-not {\tbrkas\t} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/brkb_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/brkb_1.c index 07e3622ed6a..7f1c75837de 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/brkb_1.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/brkb_1.c @@ -18,5 +18,6 @@ test2 (svbool_t pg, svbool_t x, svbool_t y, int *any) return svptest_any (pg, res); } -/* { dg-final { scan-assembler-times {\tbrkbs\tp[0-9]+\.b, p[0-9]+/m,} 2 } } */ -/* { dg-final { scan-assembler-not {\tbrkb\t} } } */ +/* { dg-final { scan-assembler-times {\tbrkb\t} 2 } } */ +/* { dg-final { scan-assembler-times {\tptest\t} 2 } } */ +/* { dg-final { scan-assembler-not {\tbrkbs\t} } } */