On Tue, 19 May 2020 at 13:28, Richard Earnshaw <richard.earns...@foss.arm.com> wrote: > > On 11/05/2020 17:43, Christophe Lyon via Gcc wrote: > > Hi, > > > > > > As you may know, I've been running validations of GCC trunk in many > > configurations for Arm and Aarch64. > > > > > > I was recently trying to make some cleanup in the new Bfloat16, MVE, CDE, > > and > > ACLE tests because in several configurations I see 300-400 FAILs > > mainly in these areas, because of “testisms”. The goal is to avoid > > wasting time over the same failure reports when checking what needs > > fixing. I thought this would be quick & easy, but this is tedious > > because of the numerous combinations of options and configurations > > available on Arm. > > > > > > Sorry for the very long email, it’s hard to describe and summarize, > > but I'd like to try nonetheless, hoping that we can make testing > > easier/more efficient :-), because most of the time the problems I > > found are with the tests rather than real compiler bugs, so I think > > it's a bit of wasted time. > > > > > > Here is a list of problems, starting with the tricky dependencies > > around -mfloat-abi=XXX: > > > > * Some targets do not support multilibs (eg arm-linux-gnueabi[hf] with > > glibc), or one can decide not to build with both hard and soft FP > > multilibs. This generally becomes a problem when including stdint.h > > (used by arm_neon.h, arm_acle.h, …), leading to a compiler error for > > lack of gnu/stub*.h for the missing float-abi. If you add -mthumb to > > the picture, it becomes quite complex (eg -mfloat-abi=hard is not > > supported on thumb-1). > > > > > > Consider mytest.c that does not depend on any include file and has: > > /* { dg-options "-mfloat-abi=hard" } */ > > > > If GCC is configured for arm-linux-gnueabi --with-cpu=cortex-a9 > > --with-fpu=neon, > > with ‘make check’, the test PASSes. > > With ‘make check’ with --target-board=-march=armv5t/-mthumb, then the > > test FAILs: > > sorry, unimplemented: Thumb-1 hard-float VFP ABI > > > > > > If I add > > /* { dg-require-effective-target arm_hard_ok } */ > > ‘make check’ with --target-board=-march=armv5t/-mthumb is now > > UNSUPPORTED (which is OK), but > > plain ‘make check’ is now also UNSUPPORTED because arm_hard_ok detects > > that we lack the -mfloat-abi=hard multilib. So we lose a PASS. > > > > If I configure GCC for arm-linux-gnueabihf, then: > > ‘make check’ PASSes > > ‘make check’ with --target-board=-march=armv5t/-mthumb, FAILs > > and with > > /* { dg-require-effective-target arm_hard_ok } */ > > ‘make check’ with --target-board=-march=armv5t/-mthumb is now UNSUPPORTED > > and > > plain ‘make check’ PASSes > > > > So it seems the best option is to add > > /* { dg-require-effective-target arm_hard_ok } */ > > although it makes the test UNSUPPORTED by arm-linux-gnueabi even in > > cases where it could PASS. > > > > Is there consensus that this is the right way? > > > > > > > > * In GCC DejaGnu helpers, the queries for -mfloat-abi=hard and > > -march=XXX are independent in general, meaning if you query for > > -mfloat-abi=hard support, it will do that in the absence of any > > -march=XXX that the testcase may also be using. So, if GCC is > > configured with its default cpu/fpu, -mfloat-abi=hard will be rejected > > for lack of an fpu on the default cpu, but if GCC is configured with a > > suitable cpu/fpu pair, -mfloat-abi=hard will be accepted. > > > > I faced this problem when I tried to “fix” the order in which we try > > options in > > Arm_v8_2a_bf16_neon_ok. (see > > https://gcc.gnu.org/pipermail/gcc-patches/2020-April/544654.html) > > > > I faced similar problems while working on a patch of mine about a bug > > with IRQ handlers which has different behaviour depending on the FP > > ABI used: I have the feeling that I spend too much time writing the > > tests to the detriment of the patch itself... > > > > I also noticed that Richard Sandiford probably faced similar issues > > with his recent fix for "no_unique_address", where he finally added > > arm_arch_v8a_hard_ok to check arm8v-a CPU + neon-fp-armv8 FPU + > > float-abi=hard at the same time. > > > > Maybe we could decide on a consistent and simpler way of checking such > > things? > > > > > > * A metric for this complexity could be the number of arm > > effective-targets, a quick and not-fully accurate grep | sed | sort | > > uniq -c | sort -n on target-supports.exp ends with: > > 9 mips > > 16 aarch64 > > 21 powerpc > > 97 vect > > 106 arm > > (does not count all the effective-targets generated by tcl code, eg > > arm_arch_FUNC_ok) > > > > This probably explains why it’s hard to get test directives right :-) > > > > I’ve not thought about how we could reduce that number…. > > > > > > > > * Finally, I’m wondering about the most appropriate way of configuring > > GCC and running the tests. > > > > So far, for most of the configurations I'm testing, I use different > > --with-cpu/--with-fpu/--with-mode configure flags for each toolchain > > configuration I’m testing and rarely override the flags at testing > > time. I also disable multilibs to save build time and (scratch) disk > > space. (See > > https://people.linaro.org/~christophe.lyon/cross-validation/gcc/trunk/0latest/report-build-info.html > > for the current list, each line corresponds to a clean build + make > > check job -- so there are 15 different toolchain configs for > > arm-linux-gnueabihf for instance) > > > > However, I think this is may not be appropriate at least for the > > arm-eabi toolchains, because I suspect the vendors who support several > > SoCs generally ship one binary toolchain built with the default > > cpu/fpu/mode and the appropriate multilibs (aprofile or rmprofile), > > and the associated IDE adds the right -mcpu/-mfpu flags (see > > arm-embedded toolchain, ST CubeMX for stm32). So it seems to me that > > the "appropriate" way of testing such a toolchain is to build it with > > the default settings and appropriate multilibs and add the needed > > -mcpu/-mfpu variants at 'make check' time. > > > > I would still build one toolchain per configuration I want to test and > > not use runtest’s capability to iterate over several combinations: > > this way I can run the tests in parallel and reduce the total time > > needed to get the results. > > > > One can compare the results of both options with the two lines with > > cortex-m33 in the above table (target arm-none-eabi). > > > > In the first one, GCC is configured for cortex-m33, and tests executed > > via plain ‘make check’: 401 failures in gcc. (duration ~2h, disk space > > 14GB) > > > > In the 2nd line, GCC is configured with the default cpu/fpu, multilibs > > enabled and I use test flags suitable for cortex-m33: now only 73 > > failures for gcc. (duration ~3h15, disk space 26GB). Note that there > > are more failures for g++ and libstdc++ than for the previous line, I > > haven’t fully checked why -- for libstdc++ there are spurious > > -march=armv8-m.main+fp flags in the log. So this is not the magic > > bullet. > > > > > > Unfortunately, this means every test with arm_hard_ok effective target > > would be unsupported (lack of fpu on default cpu) whatever the > > validation cflags. The increased build time (many multilibs built for > > nothing) will also reduce the validation bandwidth (I hope the > > increased scratch disk space will not be a problem with my IT…) > > > > > > > > OTOH, I have a feeling that arm-linux-gnueabi* toolchain vendors > > probably prefer to tune them for their preferred default CPU. For > > instance I have an arm board running Ubuntu with gcc-5.4 configured > > --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard > > --with-mode=thumb. > > > > If this is right, it would mean I should keep the configurations I > > currently use for arm-linux* (no multilib, rely on default cpu/fpu). > > > > ** Regarding the flags used for testing, I’m also wondering what’s the > > most appropriate: -mcpu or -march. Both have probably pros and cons? > > > > In https://gcc.gnu.org/pipermail/gcc/2019-September/230258.html, I > > described a problem where it seems that one expects the tests to run > > with -march=XXX. > > > > Another log of mine has an effective-target helper compiled with: > > -mthumb -mcpu=cortex-m33 -mfloat-abi=hard -mfloat-abi=softfp > > -mfpu=auto -march=armv8.1-m.main+mve.fp -mthumb > > which produces this error: > > cc1: warning: switch '-mcpu=cortex-m33' conflicts with > > '-march=armv8.1-m.main' switch > > which looks suspicious: running the tests in multiple ways surely > > helps uncovering bugs…. > > > > > > In summary, I’d like to gather opinions on: > > * appropriate usage of dg-require-effective-target arm_hard_ok > > * how to improve float-abi support detection in combination with > > architecture level > > * hopefully consensus on choosing how to configure the toolchain and > > run the tests. I’m suggesting default config + multilibs + > > runtest-flags for arm-eabi and a selection of default cpu/fpu + less > > runtest-flags for arm-linux*. > > > > > > Thanks for reading that far :-) > > > > > > Christophe > > >
Thanks för your anwer. > I've been pondering this for some time now (well before you sent your mail). > > My feeling is that trying to control this via dejagnu options is just > getting too fiddly. Perhaps a new approach is called for. > > My thoughts are along the line of reworking the tests to use > > #pragma target <option> > > etc (or the attribute equivalent), to set the compilation state to > something appropriate for the test so that the output is reasonable for > that and then we can stabilize the test. > > It only works for assembly tests, not for anything that requires linking > or execution: but for those tests we shouldn't be looking for a specific > output but a specific behaviour and we can tolerate more variation in > the instructions that implement that behaviour (hybrid tests would need > splitting). I'm not sure to fully understand what you mean: if we add #pragma CPU XXX to a test for instance, and then run the tests with -mcpu=YYY, then the test will still be compiled for XXX, right? How would we detect that the generated code is wrong if compiling for YYY? > > It's a fair amount of work, though, since many of the required options > cannot be controlled today via the attributes. It's also not entirely Indeed! Not to mention that we would also have to decorate the many existing tests. > clear whether these should be exposed to users, since in most cases such > control is unlikely to be of use in real code. Probably indeed. For the record, I've changed the way I run the validations for arm-eabi as I described in my original email: I now use the default cpu/fpu/mode at GCC configure time, enable the relevant multilibs then override the compilation flags when running the tests. For instance: -mthumb/-mcpu=cortex-m33/-mfloat-abi=hard The number of failures is now lower than it used to be when configuring --with-cpu=cortex-m33. Christophe