gcc.target/arm/fp16-aapcs-3.c is failing on one of our targets, and I'm
puzzled as to the reason for the failure and to the proper fix.
The test fails because, despite the dg-add-options in the subject,
-mfp16-format=alternative is not passed to the compiler, so type __fp16
is not recognized.
gcc.target/arm/fp16-aapcs-4.c used to have the same dg-add-options, but
that was changed to an explicit -mfp16-format=alternative.
commit e70bbc6f1f55a9532219812309ec22b04b539367 r240655
so I'm tempted to make a similar change to fp16-aapcs-3.c:
diff --git a/gcc/testsuite/gcc.target/arm/fp16-aapcs-3.c
b/gcc/testsuite/gcc.target/arm/fp16-aapcs-3.c
index 56a3ae2..858181c 100644
--- a/gcc/testsuite/gcc.target/arm/fp16-aapcs-3.c
+++ b/gcc/testsuite/gcc.target/arm/fp16-aapcs-3.c
@@ -1,8 +1,7 @@
/* { dg-do compile } */
/* { dg-require-effective-target arm_hard_vfp_ok } */
/* { dg-require-effective-target arm_fp16_alternative_ok } */
-/* { dg-options "-O2" } */
-/* { dg-add-options arm_fp16_alternative } */
+/* { dg-options "-O2 -mfp16-format=alternative" } */
/* Test __fp16 arguments and return value in registers (hard-float). */
With the change above, the test compiled and passed. However,
other tests with such dg-add-options requests (aapcs/vfp2[2-5].c) all have
/* { dg-require-effective-target arm_fp16_hw } */
and, presumably for this unmet requirement, come out as UNSUPPORTED.
I imagine arm_fp16_alternative_ok should imply this.
I tried to figure out why the dg-add-options wasn't working, and I found
something very puzzling: there appears to be a disconnect between
/* { dg-require-effective-target arm_fp16_alternative_ok } */
and /* { dg-add-options arm_fp16_alternative } */
You'd think the latter would work if the former passed, but they seem to
be unrelated. check_effective_target_arm_fp16_alternative_ok_nocache
seems to be setting a flags variable that pertains to something else
(cut? intended? the patchlet below is just for context, not
meant for inclusion as is), and that does not require an arm_fp16
effective target:
diff --git a/gcc/testsuite/lib/target-supports.exp
b/gcc/testsuite/lib/target-supports.exp
index 3654e7b..9000721 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -4156,11 +4156,11 @@ proc add_options_for_aarch64_sve { flags } {
# Return 1 if this is an ARM target supporting the FP16 alternative
# format. Some multilibs may be incompatible with the options needed. Also
-# set et_arm_neon_fp16_flags to the best options to add.
+# set et_arm_fp16_flags to the best options to add.
proc check_effective_target_arm_fp16_alternative_ok_nocache { } {
-global et_arm_neon_fp16_flags
-set et_arm_neon_fp16_flags ""
+global et_arm_fp16_flags
+set et_arm_fp16_flags ""
if { [check_effective_target_arm32] } {
foreach flags {"" "-mfloat-abi=softfp" "-mfpu=neon-fp16"
"-mfpu=neon-fp16 -mfloat-abi=softfp"} {
@@ -4170,7 +4170,7 @@ proc
check_effective_target_arm_fp16_alternative_ok_nocache { } {
#error __ARM_FP16_FORMAT_ALTERNATIVE not defined
#endif
} "$flags -mfp16-format=alternative"] } {
- set et_arm_neon_fp16_flags "$flags -mfp16-format=alternative"
+ set et_arm_fp16_flags "$flags -mfp16-format=alternative"
return 1
}
}
whereas add_options_for_arm_fp16_alternative requires
check_effective_target_arm_fp16_ok, which presumably fails, causing both
dg-add-options to return without adding any options, and also causes
arm_fp16_hw requires to fail.
So, here are some potential fixes:
- install the patchlet for fp16-aapcs-3.c above, and be done with it
- add an arm_fp16_hw requirement to this test
- add to check_effective_target_arm_fp16_alternative_ok_nocache above a
check for arm_fp16, besides arm32.
Unrelated potential fix, assuming it's a cut rather than intended:
- drop the et_arm_neon_fp16_flags settings from the unrelated (?)
check_effective_target_arm_fp16_alternative_ok_nocache
Thanks in advance for signaling the preferred way to fix this.
--
Alexandre Oliva, freedom fighterhe/himhttps://FSFLA.org/blogs/lxo/
Free Software Evangelist Stallman was right, but he's left :(
GNU Toolchain Engineer Live long and free, and prosper ethically