From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1130) id A27903854160; Fri, 21 Oct 2022 09:06:38 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A27903854160 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1666343198; bh=fngANEXlHdYWAWP5B6RYM9BD4hy8NJwZh0LCdc58tRU=; h=From:To:Subject:Date:From; b=Fu0p1FyUCM5IhFOdwmdPLG70+WLhy14K/3Dwfkm4LMBEln/TAp9Qn2gxUWxeQCVaS xBgtaS/ft3qml7aKOu+udmoyE04xey9vrAhJRN4ZJx+IRegHsok1hvunRtIhCMJkst +i02zgfp542j503a9ZChRSjToE4o+f/JBeX9OjJ4= 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 r10-11051] aarch64: Prevent generation of /M BRKAS and BRKBS X-Act-Checkin: gcc X-Git-Author: Richard Sandiford X-Git-Refname: refs/heads/releases/gcc-10 X-Git-Oldrev: 813cf5d170843dac18124c07e7746068c6f22a00 X-Git-Newrev: 382201fea8d422108b2b038716fb6469c2c020f9 Message-Id: <20221021090638.A27903854160@sourceware.org> Date: Fri, 21 Oct 2022 09:06:38 +0000 (GMT) List-Id: https://gcc.gnu.org/g:382201fea8d422108b2b038716fb6469c2c020f9 commit r10-11051-g382201fea8d422108b2b038716fb6469c2c020f9 Author: Richard Sandiford Date: Fri Oct 21 10:06:13 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 b9af570003f..d77194892f3 100644 --- a/gcc/config/aarch64/aarch64-sve.md +++ b/gcc/config/aarch64/aarch64-sve.md @@ -9228,45 +9228,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} } } */