On 07/05/2025 16:54, Richard Sandiford wrote: > Richard Earnshaw <richard.earns...@arm.com> writes: >> On 07/05/2025 13:57, Richard Sandiford wrote: >>> Kyrylo Tkachov <ktkac...@nvidia.com> writes: >>>>> On 7 May 2025, at 12:27, Karl Meakin <karl.mea...@arm.com> wrote: >>>>> >>>>> Commit the test file `cmpbr.c` before rules for generating the new >>>>> instructions are added, so that the changes in codegen are more obvious >>>>> in the next commit. >>>> >>>> I guess that’s an LLVM best practice. >>>> In GCC since we have the check-function-bodies mechanism we usually prefer >>>> to include the relevant test together with the patch that adds the >>>> optimization. >>>> But this is not wrong either. >>>> >>>> >>>>> >>>>> gcc/testsuite/ChangeLog: >>>>> >>>>> * gcc.target/aarch64/cmpbr.c: New test. >>>>> --- >>>>> gcc/testsuite/gcc.target/aarch64/cmpbr.c | 1378 ++++++++++++++++++++++ >>>>> 1 file changed, 1378 insertions(+) >>>>> create mode 100644 gcc/testsuite/gcc.target/aarch64/cmpbr.c >>>>> >>>>> diff --git a/gcc/testsuite/gcc.target/aarch64/cmpbr.c >>>>> b/gcc/testsuite/gcc.target/aarch64/cmpbr.c >>>>> new file mode 100644 >>>>> index 00000000000..728d6ead91c >>>>> --- /dev/null >>>>> +++ b/gcc/testsuite/gcc.target/aarch64/cmpbr.c >>>>> @@ -0,0 +1,1378 @@ >>>>> +/* Test that the instructions added by FEAT_CMPBR are emitted */ >>>>> +/* { dg-do compile } */ >>>>> +/* { dg-options "-march=armv9.5-a+cmpbr -O2" } */ >>>>> +/* { dg-final { check-function-bodies "**" "" "" } } */ >>>> >>>> As you’ll be adding new instructions to the compiler it’d be good to have >>>> it a dg-do assemble test where possible. >>> >>> Agreed FWIW, but: >>> >>>> For that you’ll need to create a new aarch64_asm_cmpbr_ok target and use >>>> it like so to fallback to dg-do compile when the assembler is too old: >>>> /* { dg-do compile { target aarch64_asm_cmpbr_ok } } */ >>> >>> ...dg-do assemble for this one :) >> >> I don't think that works. If the first dg-do fails the test is just skipped. >> >> You need to replicate the test with separate dg-do directives, IIRC. > > Hmm, can you remember the circumstances when you saw that? > We've been using the construct that Kyrill suggested with apparent > success in things like aarch64-sve2-acle-asm.exp. E.g.:
Well, the implementation of dg-do contains the comment: # Note: A previous occurrence of `dg-do' with target/xfail selectors # is a user mistake. We clobber previous values here. So one might interpret that as meaning multiple dg-do's are not intended to be supported. But I might have misremembered the exact scenario I was facing. I think it might have been that a test failed to fall back to the dg-do-default if a specific dg-do didn't match. The scenario I remember was something like dg-do-default = compile, then the test was trying to change that to execute if HW was available; but that meant that if it wasn't we didn't fall back to checking the assembler output. R. > > /* { dg-do assemble { target aarch64_asm_sve2p1_ok } } */ > /* { dg-do compile { target { ! aarch64_asm_sve2p1_ok } } } */ > /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ > > If I run this normally, it picks the assemble route (tests run with -c). > If I force aarch64_asm_sve2p1_ok to false by mangling the test > instruction, the test picks the compile route (tests with run -S). > > Thanks, > Richard