[2/2] testsuite: add -fpu=auto to complex_neon checks for arm

Message ID 20260108115332.1155064-1-artemiy.volkov@arm.com
State Superseded
Delegated to: Richard Earnshaw
Headers
Series [1/2] testsuite: require arm_v8_3a_fp16_complex_neon for complex fp16 tests |

Commit Message

Artemiy Volkov Jan. 8, 2026, 11:53 a.m. UTC
  The check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache
procedure in target-supports.exp should return a set of flags providing
all of AdvSIMD, complex numbers, and fp16 capabilities.  However, to
achieve this we have to be able to overwrite the current -mfpu setting.
This means that the current empty string alternative for $flags does not
work for us.  This patch splits sets of options to iterate over
between the arm and the aarch64 backend and prohibits an empty string for
the former.  Moreover, it changes
check_effective_target_arm_v8_3a_complex_neon_ok_nocache in the same way.

This (fully) fixes the advsimd-intrinsics.exp/vector-complex_f16.c
testcase, which was previously being compiled with the -mfpu=neon-fp16
flag added by the .exp file itself.

Tested on aarch64 by me and on arm by Christophe.

Co-authored-by: Richard Earnshaw <rearnsha@arm.com>

gcc/testsuite/ChangeLog:

	* lib/target-supports.exp:
	(check_effective_target_arm_v8_3a_complex_neon_ok_nocache):
	Split and fill in arm and aarch64 compile options.  Remove the
	cpu_unset variable.
	(check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache):
	Likewise.
---
 gcc/testsuite/lib/target-supports.exp | 31 +++++++++++++++++----------
 1 file changed, 20 insertions(+), 11 deletions(-)
  

Comments

Christophe Lyon Jan. 8, 2026, 12:35 p.m. UTC | #1
On 1/8/26 12:53, Artemiy Volkov wrote:
> The check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache
> procedure in target-supports.exp should return a set of flags providing
> all of AdvSIMD, complex numbers, and fp16 capabilities.  However, to
> achieve this we have to be able to overwrite the current -mfpu setting.
> This means that the current empty string alternative for $flags does not
> work for us.  This patch splits sets of options to iterate over
> between the arm and the aarch64 backend and prohibits an empty string for
> the former.  Moreover, it changes
> check_effective_target_arm_v8_3a_complex_neon_ok_nocache in the same way.
> 
> This (fully) fixes the advsimd-intrinsics.exp/vector-complex_f16.c
> testcase, which was previously being compiled with the -mfpu=neon-fp16
> flag added by the .exp file itself.
> 
> Tested on aarch64 by me and on arm by Christophe.
> 
> Co-authored-by: Richard Earnshaw <rearnsha@arm.com>
> 
> gcc/testsuite/ChangeLog:
> 
> 	* lib/target-supports.exp:
> 	(check_effective_target_arm_v8_3a_complex_neon_ok_nocache):
> 	Split and fill in arm and aarch64 compile options.  Remove the
> 	cpu_unset variable.
> 	(check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache):
> 	Likewise.
> ---
>   gcc/testsuite/lib/target-supports.exp | 31 +++++++++++++++++----------
>   1 file changed, 20 insertions(+), 11 deletions(-)
> 
> diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
> index dbcba42629f..210e246c955 100644
> --- a/gcc/testsuite/lib/target-supports.exp
> +++ b/gcc/testsuite/lib/target-supports.exp
> @@ -13717,27 +13717,32 @@ proc check_effective_target_inff { } {
>   proc check_effective_target_arm_v8_3a_complex_neon_ok_nocache { } {
>       global et_arm_v8_3a_complex_neon_flags
>       set et_arm_v8_3a_complex_neon_flags ""
> -    set cpu_unset ""
>   
>       if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
>   	return 0;
>       }
>   
>       if { [istarget arm*-*-*] } {
> -	set cpu_unset "-mcpu=unset"
> +	set flag_opts {
> +	    "-mcpu=unset -mfpu=auto -march=armv8.3-a+simd"
> +	    "-mcpu=unset -mfloat-abi=softfp -mfpu=auto -march=armv8.3-a+simd"
> +	    "-mcpu=unset -mfloat-abi=hard -mfpu=auto -march=armv8.3-a+simd"
> +	}
> +    } else {
> +	set flag_opts { "" "-march=armv8.3-a" }
>       }

While this had no visible effect with the configurations I/we have 
tested, I suspect we still want to start with just "-mcpu=unset" on arm. 
Richard?

And on aarch64, dropping +simd seems harmless at the moment, but maybe 
we want to keep it in order to be more future-proof?

Thanks,

Christophe

>   
>       # Iterate through sets of options to find the compiler flags that
>       # need to be added to the -march option.
> -    foreach flags {"" "-mfloat-abi=softfp -mfpu=auto" "-mfloat-abi=hard -mfpu=auto"} {
> +    foreach flags $flag_opts {
>   	if { [check_no_compiler_messages_nocache \
>   		  arm_v8_3a_complex_neon_ok assembly {
>   	    #if !defined (__ARM_FEATURE_COMPLEX)
>   	    #error "__ARM_FEATURE_COMPLEX not defined"
>   	    #endif
>   	    #include <complex.h>
> -	} "$flags $cpu_unset -march=armv8.3-a+simd"] } {
> -	    set et_arm_v8_3a_complex_neon_flags "$flags $cpu_unset -march=armv8.3-a+simd"
> +	} "$flags"] } {
> +	    set et_arm_v8_3a_complex_neon_flags "$flags"
>   	    return 1;
>   	}
>       }
> @@ -13765,19 +13770,24 @@ proc add_options_for_arm_v8_3a_complex_neon { flags } {
>   proc check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache { } {
>       global et_arm_v8_3a_fp16_complex_neon_flags
>       set et_arm_v8_3a_fp16_complex_neon_flags ""
> -    set cpu_unset ""
>   
>       if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
>   	return 0;
>       }
>   
>       if { [istarget arm*-*-*] } {
> -	set cpu_unset "-mcpu=unset"
> +	set flag_opts {
> +	    "-mcpu=unset -mfpu=auto -march=armv8.3-a+fp16+simd"
> +	    "-mcpu=unset -mfloat-abi=softfp -mfpu=auto -march=armv8.3-a+fp16+simd"
> +	    "-mcpu=unset -mfloat-abi=hard -mfpu=auto -march=armv8.3-a+fp16+simd"
> +	}
> +    } else {
> +	set flag_opts { "" "-march=armv8.3-a+fp16" }
>       }
>   
>       # Iterate through sets of options to find the compiler flags that
>       # need to be added to the -march option.
> -    foreach flags {"" "-mfloat-abi=softfp -mfpu=auto" "-mfloat-abi=hard -mfpu=auto"} {
> +    foreach flags $flag_opts {
>   	if { [check_no_compiler_messages_nocache \
>   		  arm_v8_3a_fp16_complex_neon_ok assembly {
>   	    #if !defined (__ARM_FEATURE_COMPLEX)
> @@ -13787,9 +13797,8 @@ proc check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache { } {
>   	    #error "__ARM_FEATURE_FP16_VECTOR_ARITHMETIC not defined"
>   	    #endif
>   	    #include <complex.h>
> -	} "$flags $cpu_unset -march=armv8.3-a+fp16+simd"] } {
> -	    set et_arm_v8_3a_fp16_complex_neon_flags \
> -			"$flags $cpu_unset -march=armv8.3-a+fp16+simd"
> +	} "$flags"] } {
> +	    set et_arm_v8_3a_fp16_complex_neon_flags "$flags"
>   	    return 1;
>   	}
>       }
  
Richard Earnshaw (foss) Jan. 8, 2026, 3:19 p.m. UTC | #2
On 08/01/2026 12:35, Christophe Lyon wrote:
> 
> 
> On 1/8/26 12:53, Artemiy Volkov wrote:
>> The check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache
>> procedure in target-supports.exp should return a set of flags providing
>> all of AdvSIMD, complex numbers, and fp16 capabilities.  However, to
>> achieve this we have to be able to overwrite the current -mfpu setting.
>> This means that the current empty string alternative for $flags does not
>> work for us.  This patch splits sets of options to iterate over
>> between the arm and the aarch64 backend and prohibits an empty string for
>> the former.  Moreover, it changes
>> check_effective_target_arm_v8_3a_complex_neon_ok_nocache in the same way.
>>
>> This (fully) fixes the advsimd-intrinsics.exp/vector-complex_f16.c
>> testcase, which was previously being compiled with the -mfpu=neon-fp16
>> flag added by the .exp file itself.
>>
>> Tested on aarch64 by me and on arm by Christophe.
>>
>> Co-authored-by: Richard Earnshaw <rearnsha@arm.com>
>>
>> gcc/testsuite/ChangeLog:
>>
>>     * lib/target-supports.exp:
>>     (check_effective_target_arm_v8_3a_complex_neon_ok_nocache):
>>     Split and fill in arm and aarch64 compile options.  Remove the
>>     cpu_unset variable.
>>     (check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache):
>>     Likewise.
>> ---
>>   gcc/testsuite/lib/target-supports.exp | 31 +++++++++++++++++----------
>>   1 file changed, 20 insertions(+), 11 deletions(-)
>>
>> diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
>> index dbcba42629f..210e246c955 100644
>> --- a/gcc/testsuite/lib/target-supports.exp
>> +++ b/gcc/testsuite/lib/target-supports.exp
>> @@ -13717,27 +13717,32 @@ proc check_effective_target_inff { } {
>>   proc check_effective_target_arm_v8_3a_complex_neon_ok_nocache { } {
>>       global et_arm_v8_3a_complex_neon_flags
>>       set et_arm_v8_3a_complex_neon_flags ""
>> -    set cpu_unset ""
>>         if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
>>       return 0;
>>       }
>>         if { [istarget arm*-*-*] } {
>> -    set cpu_unset "-mcpu=unset"
>> +    set flag_opts {

We should try "" first, before attempting to modify the architecture.

>> +        "-mcpu=unset -mfpu=auto -march=armv8.3-a+simd"
>> +        "-mcpu=unset -mfloat-abi=softfp -mfpu=auto -march=armv8.3-a+simd"
>> +        "-mcpu=unset -mfloat-abi=hard -mfpu=auto -march=armv8.3-a+simd"
>> +    }
>> +    } else {
>> +    set flag_opts { "" "-march=armv8.3-a" }
>>       }
> 
> While this had no visible effect with the configurations I/we have tested, I suspect we still want to start with just "-mcpu=unset" on arm. Richard?

We only want to add -mcpu=unset if we're overriding the defaults.  And since we should try "" before trying anything else, it has to be part of the options where this is needed.

AFAIK aarch64 doesn't support -mcpu=unset (yet), so it's correct not to add that for the aarch64 list.

> 
> And on aarch64, dropping +simd seems harmless at the moment, but maybe we want to keep it in order to be more future-proof?

I'll let Tamar make the call on that one.  But as things stand we always default to having simd on aarch64 and I expect there will be a huge amount of testsuite churn if that ever changes, so I'm not too worried about that.

> 
> Thanks,
> 
> Christophe
> 
>>         # Iterate through sets of options to find the compiler flags that
>>       # need to be added to the -march option.
>> -    foreach flags {"" "-mfloat-abi=softfp -mfpu=auto" "-mfloat-abi=hard -mfpu=auto"} {
>> +    foreach flags $flag_opts {
>>       if { [check_no_compiler_messages_nocache \
>>             arm_v8_3a_complex_neon_ok assembly {
>>           #if !defined (__ARM_FEATURE_COMPLEX)
>>           #error "__ARM_FEATURE_COMPLEX not defined"
>>           #endif
>>           #include <complex.h>
>> -    } "$flags $cpu_unset -march=armv8.3-a+simd"] } {
>> -        set et_arm_v8_3a_complex_neon_flags "$flags $cpu_unset -march=armv8.3-a+simd"
>> +    } "$flags"] } {
>> +        set et_arm_v8_3a_complex_neon_flags "$flags"
>>           return 1;
>>       }
>>       }
>> @@ -13765,19 +13770,24 @@ proc add_options_for_arm_v8_3a_complex_neon { flags } {
>>   proc check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache { } {
>>       global et_arm_v8_3a_fp16_complex_neon_flags
>>       set et_arm_v8_3a_fp16_complex_neon_flags ""
>> -    set cpu_unset ""
>>         if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
>>       return 0;
>>       }
>>         if { [istarget arm*-*-*] } {
>> -    set cpu_unset "-mcpu=unset"
>> +    set flag_opts {

Same here, add "" first.

>> +        "-mcpu=unset -mfpu=auto -march=armv8.3-a+fp16+simd"
>> +        "-mcpu=unset -mfloat-abi=softfp -mfpu=auto -march=armv8.3-a+fp16+simd"
>> +        "-mcpu=unset -mfloat-abi=hard -mfpu=auto -march=armv8.3-a+fp16+simd"
>> +    }
>> +    } else {
>> +    set flag_opts { "" "-march=armv8.3-a+fp16" }
>>       }
>>         # Iterate through sets of options to find the compiler flags that
>>       # need to be added to the -march option.
>> -    foreach flags {"" "-mfloat-abi=softfp -mfpu=auto" "-mfloat-abi=hard -mfpu=auto"} {
>> +    foreach flags $flag_opts {
>>       if { [check_no_compiler_messages_nocache \
>>             arm_v8_3a_fp16_complex_neon_ok assembly {
>>           #if !defined (__ARM_FEATURE_COMPLEX)
>> @@ -13787,9 +13797,8 @@ proc check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache { } {
>>           #error "__ARM_FEATURE_FP16_VECTOR_ARITHMETIC not defined"
>>           #endif
>>           #include <complex.h>
>> -    } "$flags $cpu_unset -march=armv8.3-a+fp16+simd"] } {
>> -        set et_arm_v8_3a_fp16_complex_neon_flags \
>> -            "$flags $cpu_unset -march=armv8.3-a+fp16+simd"
>> +    } "$flags"] } {
>> +        set et_arm_v8_3a_fp16_complex_neon_flags "$flags"
>>           return 1;
>>       }
>>       }
> 

R.
  
Artemiy Volkov Jan. 8, 2026, 4:24 p.m. UTC | #3
On Thu, Jan 08, 2026 at 03:19:47PM +0000, Richard Earnshaw (foss) wrote:
> On 08/01/2026 12:35, Christophe Lyon wrote:
> > 
> > 
> > On 1/8/26 12:53, Artemiy Volkov wrote:
> >> The check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache
> >> procedure in target-supports.exp should return a set of flags providing
> >> all of AdvSIMD, complex numbers, and fp16 capabilities.� However, to
> >> achieve this we have to be able to overwrite the current -mfpu setting.
> >> This means that the current empty string alternative for $flags does not
> >> work for us.� This patch splits sets of options to iterate over
> >> between the arm and the aarch64 backend and prohibits an empty string for
> >> the former.� Moreover, it changes
> >> check_effective_target_arm_v8_3a_complex_neon_ok_nocache in the same way.
> >>
> >> This (fully) fixes the advsimd-intrinsics.exp/vector-complex_f16.c
> >> testcase, which was previously being compiled with the -mfpu=neon-fp16
> >> flag added by the .exp file itself.
> >>
> >> Tested on aarch64 by me and on arm by Christophe.
> >>
> >> Co-authored-by: Richard Earnshaw <rearnsha@arm.com>
> >>
> >> gcc/testsuite/ChangeLog:
> >>
> >> ����* lib/target-supports.exp:
> >> ����(check_effective_target_arm_v8_3a_complex_neon_ok_nocache):
> >> ����Split and fill in arm and aarch64 compile options.� Remove the
> >> ����cpu_unset variable.
> >> ����(check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache):
> >> ����Likewise.
> >> ---
> >> � gcc/testsuite/lib/target-supports.exp | 31 +++++++++++++++++----------
> >> � 1 file changed, 20 insertions(+), 11 deletions(-)
> >>
> >> diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
> >> index dbcba42629f..210e246c955 100644
> >> --- a/gcc/testsuite/lib/target-supports.exp
> >> +++ b/gcc/testsuite/lib/target-supports.exp
> >> @@ -13717,27 +13717,32 @@ proc check_effective_target_inff { } {
> >> � proc check_effective_target_arm_v8_3a_complex_neon_ok_nocache { } {
> >> ����� global et_arm_v8_3a_complex_neon_flags
> >> ����� set et_arm_v8_3a_complex_neon_flags ""
> >> -��� set cpu_unset ""
> >> � ����� if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
> >> ����� return 0;
> >> ����� }
> >> � ����� if { [istarget arm*-*-*] } {
> >> -��� set cpu_unset "-mcpu=unset"
> >> +��� set flag_opts {
> 
> We should try "" first, before attempting to modify the architecture.

That will defeat the purpose of this patch, since you need to be able to
"reset" -mfpu by setting it to "auto", much like you need to do
"-mcpu=unset" in every alternative here.  So I'll prepend "-mcpu=unset
-mfpu=auto" instead of "" to the list and resend as v2, would that be OK
with you?

> 
> >> +������� "-mcpu=unset -mfpu=auto -march=armv8.3-a+simd"
> >> +������� "-mcpu=unset -mfloat-abi=softfp -mfpu=auto -march=armv8.3-a+simd"
> >> +������� "-mcpu=unset -mfloat-abi=hard -mfpu=auto -march=armv8.3-a+simd"
> >> +��� }
> >> +��� } else {
> >> +��� set flag_opts { "" "-march=armv8.3-a" }
> >> ����� }
> > 
> > While this had no visible effect with the configurations I/we have tested, I suspect we still want to start with just "-mcpu=unset" on arm. Richard?
> 
> We only want to add -mcpu=unset if we're overriding the defaults.  And since we should try "" before trying anything else, it has to be part of the options where this is needed.
> 
> AFAIK aarch64 doesn't support -mcpu=unset (yet), so it's correct not to add that for the aarch64 list.
> 
> > 
> > And on aarch64, dropping +simd seems harmless at the moment, but maybe we want to keep it in order to be more future-proof?
> 
> I'll let Tamar make the call on that one.  But as things stand we always default to having simd on aarch64 and I expect there will be a huge amount of testsuite churn if that ever changes, so I'm not too worried about that.

Yeah, every base arch on aarch64 has +simd as per aarch64-arches.def:33,
so armv8.3-a here should be enough.

Thanks,
Artemiy
  
Christophe Lyon Jan. 8, 2026, 5:15 p.m. UTC | #4
Le jeu. 8 janv. 2026, 17:26, Artemiy Volkov <artemiy.volkov@arm.com> a
écrit :

> On Thu, Jan 08, 2026 at 03:19:47PM +0000, Richard Earnshaw (foss) wrote:
> > On 08/01/2026 12:35, Christophe Lyon wrote:
> > >
> > >
> > > On 1/8/26 12:53, Artemiy Volkov wrote:
> > >> The check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache
> > >> procedure in target-supports.exp should return a set of flags
> providing
> > >> all of AdvSIMD, complex numbers, and fp16 capabilities.� However, to
> > >> achieve this we have to be able to overwrite the current -mfpu
> setting.
> > >> This means that the current empty string alternative for $flags does
> not
> > >> work for us.� This patch splits sets of options to iterate over
> > >> between the arm and the aarch64 backend and prohibits an empty string
> for
> > >> the former.� Moreover, it changes
> > >> check_effective_target_arm_v8_3a_complex_neon_ok_nocache in the same
> way.
> > >>
> > >> This (fully) fixes the advsimd-intrinsics.exp/vector-complex_f16.c
> > >> testcase, which was previously being compiled with the -mfpu=neon-fp16
> > >> flag added by the .exp file itself.
> > >>
> > >> Tested on aarch64 by me and on arm by Christophe.
> > >>
> > >> Co-authored-by: Richard Earnshaw <rearnsha@arm.com>
> > >>
> > >> gcc/testsuite/ChangeLog:
> > >>
> > >> ����* lib/target-supports.exp:
> > >> ����(check_effective_target_arm_v8_3a_complex_neon_ok_nocache):
> > >> ����Split and fill in arm and aarch64 compile options.� Remove the
> > >> ����cpu_unset variable.
> > >> ����(check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache):
> > >> ����Likewise.
> > >> ---
> > >> � gcc/testsuite/lib/target-supports.exp | 31
> +++++++++++++++++----------
> > >> � 1 file changed, 20 insertions(+), 11 deletions(-)
> > >>
> > >> diff --git a/gcc/testsuite/lib/target-supports.exp
> b/gcc/testsuite/lib/target-supports.exp
> > >> index dbcba42629f..210e246c955 100644
> > >> --- a/gcc/testsuite/lib/target-supports.exp
> > >> +++ b/gcc/testsuite/lib/target-supports.exp
> > >> @@ -13717,27 +13717,32 @@ proc check_effective_target_inff { } {
> > >> � proc check_effective_target_arm_v8_3a_complex_neon_ok_nocache { } {
> > >> ����� global et_arm_v8_3a_complex_neon_flags
> > >> ����� set et_arm_v8_3a_complex_neon_flags ""
> > >> -��� set cpu_unset ""
> > >> � ����� if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
> > >> ����� return 0;
> > >> ����� }
> > >> � ����� if { [istarget arm*-*-*] } {
> > >> -��� set cpu_unset "-mcpu=unset"
> > >> +��� set flag_opts {
> >
> > We should try "" first, before attempting to modify the architecture.
>
> That will defeat the purpose of this patch, since you need to be able to
> "reset" -mfpu by setting it to "auto", much like you need to do
> "-mcpu=unset" in every alternative here.  So I'll prepend "-mcpu=unset
> -mfpu=auto" instead of "" to the list and resend as v2, would that be OK
> with you?
>
> >
> > >> +������� "-mcpu=unset -mfpu=auto -march=armv8.3-a+simd"
> > >> +������� "-mcpu=unset -mfloat-abi=softfp -mfpu=auto
> -march=armv8.3-a+simd"
> > >> +������� "-mcpu=unset -mfloat-abi=hard -mfpu=auto
> -march=armv8.3-a+simd"
> > >> +��� }
> > >> +��� } else {
> > >> +��� set flag_opts { "" "-march=armv8.3-a" }
> > >> ����� }
> > >
> > > While this had no visible effect with the configurations I/we have
> tested, I suspect we still want to start with just "-mcpu=unset" on arm.
> Richard?
> >
> > We only want to add -mcpu=unset if we're overriding the defaults.  And
> since we should try "" before trying anything else, it has to be part of
> the options where this is needed.
> >

Yes, that's what I meant.


> > AFAIK aarch64 doesn't support -mcpu=unset (yet), so it's correct not to
> add that for the aarch64 list.
>
Yes, I didn't mean to add it to aarch64.

>
> > >
> > > And on aarch64, dropping +simd seems harmless at the moment, but maybe
> we want to keep it in order to be more future-proof?
> >
> > I'll let Tamar make the call on that one.  But as things stand we always
> default to having simd on aarch64 and I expect there will be a huge amount
> of testsuite churn if that ever changes, so I'm not too worried about that.
>
> Yeah, every base arch on aarch64 has +simd as per aarch64-arches.def:33,
> so armv8.3-a here should be enough.
>
> Thanks,
> Artemiy
>
Given the patch removes +simd in the aarch64 without mentioning it in the
commit message, it will not be clear in the future if this was changed on
purpose or not.
  
Richard Earnshaw (foss) Jan. 9, 2026, 10:30 a.m. UTC | #5
On 08/01/2026 17:15, Christophe Lyon wrote:
> 
> 
> Le jeu. 8 janv. 2026, 17:26, Artemiy Volkov <artemiy.volkov@arm.com <mailto:artemiy.volkov@arm.com>> a écrit :
> 
>     On Thu, Jan 08, 2026 at 03:19:47PM +0000, Richard Earnshaw (foss) wrote:
>     > On 08/01/2026 12:35, Christophe Lyon wrote:
>     > >
>     > >
>     > > On 1/8/26 12:53, Artemiy Volkov wrote:
>     > >> The check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache
>     > >> procedure in target-supports.exp should return a set of flags providing
>     > >> all of AdvSIMD, complex numbers, and fp16 capabilities.� However, to
>     > >> achieve this we have to be able to overwrite the current -mfpu setting.
>     > >> This means that the current empty string alternative for $flags does not
>     > >> work for us.� This patch splits sets of options to iterate over
>     > >> between the arm and the aarch64 backend and prohibits an empty string for
>     > >> the former.� Moreover, it changes
>     > >> check_effective_target_arm_v8_3a_complex_neon_ok_nocache in the same way.
>     > >>
>     > >> This (fully) fixes the advsimd-intrinsics.exp/vector-complex_f16.c
>     > >> testcase, which was previously being compiled with the -mfpu=neon-fp16
>     > >> flag added by the .exp file itself.
>     > >>
>     > >> Tested on aarch64 by me and on arm by Christophe.
>     > >>
>     > >> Co-authored-by: Richard Earnshaw <rearnsha@arm.com <mailto:rearnsha@arm.com>>
>     > >>
>     > >> gcc/testsuite/ChangeLog:
>     > >>
>     > >> ����* lib/target-supports.exp:
>     > >> ����(check_effective_target_arm_v8_3a_complex_neon_ok_nocache):
>     > >> ����Split and fill in arm and aarch64 compile options.� Remove the
>     > >> ����cpu_unset variable.
>     > >> ����(check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache):
>     > >> ����Likewise.
>     > >> ---
>     > >> � gcc/testsuite/lib/target-supports.exp | 31 +++++++++++++++++----------
>     > >> � 1 file changed, 20 insertions(+), 11 deletions(-)
>     > >>
>     > >> diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
>     > >> index dbcba42629f..210e246c955 100644
>     > >> --- a/gcc/testsuite/lib/target-supports.exp
>     > >> +++ b/gcc/testsuite/lib/target-supports.exp
>     > >> @@ -13717,27 +13717,32 @@ proc check_effective_target_inff { } {
>     > >> � proc check_effective_target_arm_v8_3a_complex_neon_ok_nocache { } {
>     > >> ����� global et_arm_v8_3a_complex_neon_flags
>     > >> ����� set et_arm_v8_3a_complex_neon_flags ""
>     > >> -��� set cpu_unset ""
>     > >> � ����� if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
>     > >> ����� return 0;
>     > >> ����� }
>     > >> � ����� if { [istarget arm*-*-*] } {
>     > >> -��� set cpu_unset "-mcpu=unset"
>     > >> +��� set flag_opts {
>     >
>     > We should try "" first, before attempting to modify the architecture.
> 
>     That will defeat the purpose of this patch, since you need to be able to
>     "reset" -mfpu by setting it to "auto", much like you need to do
>     "-mcpu=unset" in every alternative here.  So I'll prepend "-mcpu=unset
>     -mfpu=auto" instead of "" to the list and resend as v2, would that be OK
>     with you?
> 

No.  The first pass with "" checks to see if the /default/ flags (from the compiler configuration or the testsuite options) are already suitable for running the test.  We only use it if the test (below) then passes.  We only try to override those flags if the defaults are /not/ sufficient; and we only need -mcpu=unset when setting the architecture (to ensure it doesn't conflict with any existing defaults).



>     >
>     > >> +������� "-mcpu=unset -mfpu=auto -march=armv8.3-a+simd"
>     > >> +������� "-mcpu=unset -mfloat-abi=softfp -mfpu=auto -march=armv8.3-a+simd"
>     > >> +������� "-mcpu=unset -mfloat-abi=hard -mfpu=auto -march=armv8.3-a+simd"
>     > >> +��� }
>     > >> +��� } else {
>     > >> +��� set flag_opts { "" "-march=armv8.3-a" }
>     > >> ����� }
>     > >
>     > > While this had no visible effect with the configurations I/we have tested, I suspect we still want to start with just "-mcpu=unset" on arm. Richard?
>     >
>     > We only want to add -mcpu=unset if we're overriding the defaults.  And since we should try "" before trying anything else, it has to be part of the options where this is needed.
>     >
> 
> Yes, that's what I meant.
> 
> 
>     > AFAIK aarch64 doesn't support -mcpu=unset (yet), so it's correct not to add that for the aarch64 list.
> 
> Yes, I didn't mean to add it to aarch64.
> 
>     >
>     > >
>     > > And on aarch64, dropping +simd seems harmless at the moment, but maybe we want to keep it in order to be more future-proof?
>     >
>     > I'll let Tamar make the call on that one.  But as things stand we always default to having simd on aarch64 and I expect there will be a huge amount of testsuite churn if that ever changes, so I'm not too worried about that.
> 
>     Yeah, every base arch on aarch64 has +simd as per aarch64-arches.def:33,
>     so armv8.3-a here should be enough.
> 
>     Thanks,
>     Artemiy
> 
> Given the patch removes +simd in the aarch64 without mentioning it in the commit message, it will not be clear in the future if this was changed on purpose or not.
> 
>
  
Artemiy Volkov Jan. 9, 2026, 10:52 a.m. UTC | #6
On Fri, Jan 09, 2026 at 10:30:11AM +0000, Richard Earnshaw (foss) wrote:
> On 08/01/2026 17:15, Christophe Lyon wrote:
> > 
> > 
> > Le jeu. 8 janv. 2026, 17:26, Artemiy Volkov <artemiy.volkov@arm.com <mailto:artemiy.volkov@arm.com>> a écrit :
> > 
> >     On Thu, Jan 08, 2026 at 03:19:47PM +0000, Richard Earnshaw (foss) wrote:
> >     > On 08/01/2026 12:35, Christophe Lyon wrote:
> >     > >
> >     > >
> >     > > On 1/8/26 12:53, Artemiy Volkov wrote:
> >     > >> The check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache
> >     > >> procedure in target-supports.exp should return a set of flags providing
> >     > >> all of AdvSIMD, complex numbers, and fp16 capabilities.� However, to
> >     > >> achieve this we have to be able to overwrite the current -mfpu setting.
> >     > >> This means that the current empty string alternative for $flags does not
> >     > >> work for us.� This patch splits sets of options to iterate over
> >     > >> between the arm and the aarch64 backend and prohibits an empty string for
> >     > >> the former.� Moreover, it changes
> >     > >> check_effective_target_arm_v8_3a_complex_neon_ok_nocache in the same way.
> >     > >>
> >     > >> This (fully) fixes the advsimd-intrinsics.exp/vector-complex_f16.c
> >     > >> testcase, which was previously being compiled with the -mfpu=neon-fp16
> >     > >> flag added by the .exp file itself.
> >     > >>
> >     > >> Tested on aarch64 by me and on arm by Christophe.
> >     > >>
> >     > >> Co-authored-by: Richard Earnshaw <rearnsha@arm.com <mailto:rearnsha@arm.com>>
> >     > >>
> >     > >> gcc/testsuite/ChangeLog:
> >     > >>
> >     > >> ����* lib/target-supports.exp:
> >     > >> ����(check_effective_target_arm_v8_3a_complex_neon_ok_nocache):
> >     > >> ����Split and fill in arm and aarch64 compile options.� Remove the
> >     > >> ����cpu_unset variable.
> >     > >> ����(check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache):
> >     > >> ����Likewise.
> >     > >> ---
> >     > >> � gcc/testsuite/lib/target-supports.exp | 31 +++++++++++++++++----------
> >     > >> � 1 file changed, 20 insertions(+), 11 deletions(-)
> >     > >>
> >     > >> diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
> >     > >> index dbcba42629f..210e246c955 100644
> >     > >> --- a/gcc/testsuite/lib/target-supports.exp
> >     > >> +++ b/gcc/testsuite/lib/target-supports.exp
> >     > >> @@ -13717,27 +13717,32 @@ proc check_effective_target_inff { } {
> >     > >> � proc check_effective_target_arm_v8_3a_complex_neon_ok_nocache { } {
> >     > >> ����� global et_arm_v8_3a_complex_neon_flags
> >     > >> ����� set et_arm_v8_3a_complex_neon_flags ""
> >     > >> -��� set cpu_unset ""
> >     > >> � ����� if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
> >     > >> ����� return 0;
> >     > >> ����� }
> >     > >> � ����� if { [istarget arm*-*-*] } {
> >     > >> -��� set cpu_unset "-mcpu=unset"
> >     > >> +��� set flag_opts {
> >     >
> >     > We should try "" first, before attempting to modify the architecture.
> > 
> >     That will defeat the purpose of this patch, since you need to be able to
> >     "reset" -mfpu by setting it to "auto", much like you need to do
> >     "-mcpu=unset" in every alternative here.  So I'll prepend "-mcpu=unset
> >     -mfpu=auto" instead of "" to the list and resend as v2, would that be OK
> >     with you?
> > 
> 
> No.  The first pass with "" checks to see if the /default/ flags (from the compiler configuration or the testsuite options) are already suitable for running the test.  We only use it if the test (below) then passes.  We only try to override those flags if the defaults are /not/ sufficient; and we only need -mcpu=unset when setting the architecture (to ensure it doesn't conflict with any existing defaults).

If you look at the way
check_effective_target_arm_v8_3a_complex_neon_ok_nocache does
check-compile now:

    foreach flags {"" "-mfloat-abi=softfp -mfpu=auto" "-mfloat-abi=hard -mfpu=auto"} {
        if { [check_no_compiler_messages_nocache \
                  arm_v8_3a_complex_neon_ok assembly {
            #if !defined (__ARM_FEATURE_COMPLEX)
            #error "__ARM_FEATURE_COMPLEX not defined"
            #endif
            #include <complex.h>
        } "$flags $cpu_unset -march=armv8.3-a+simd"] } {
            set et_arm_v8_3a_complex_neon_flags "$flags $cpu_unset -march=armv8.3-a+simd"
            return 1;
        }
    }

you'll see that even though $flags is "" on the first iteration of the
foreach loop, the actual compilation is performed with -mcpu=unset
-march=armv8.3-a+simd.  Since the patch moves all flags to the $flags
variable, the base alternative has to have at least -mcpu=unset
-march=armv8.3-a+simd to preserve the current behavior.

Thus, I think the options for arm should start with either "-mcpu=unset
-march=armv8.3-a" (full compatibility with existing behavior) or
"-mcpu=unset" (shorter and also looks correct).  For
check_effective_target_arm_v8_3a_complex_neon_ok_nocache, an additional
"-mfpu=auto" is required for all alternatives to negate the
"-mfpu=neon-fp16" inserted by advsimd-intrinsics.exp.

Hope this clarifies things,
Artemiy

> 
> 
> 
> >     >
> >     > >> +������� "-mcpu=unset -mfpu=auto -march=armv8.3-a+simd"
> >     > >> +������� "-mcpu=unset -mfloat-abi=softfp -mfpu=auto -march=armv8.3-a+simd"
> >     > >> +������� "-mcpu=unset -mfloat-abi=hard -mfpu=auto -march=armv8.3-a+simd"
> >     > >> +��� }
> >     > >> +��� } else {
> >     > >> +��� set flag_opts { "" "-march=armv8.3-a" }
> >     > >> ����� }
> >     > >
> >     > > While this had no visible effect with the configurations I/we have tested, I suspect we still want to start with just "-mcpu=unset" on arm. Richard?
> >     >
> >     > We only want to add -mcpu=unset if we're overriding the defaults.  And since we should try "" before trying anything else, it has to be part of the options where this is needed.
> >     >
> > 
> > Yes, that's what I meant.
> > 
> > 
> >     > AFAIK aarch64 doesn't support -mcpu=unset (yet), so it's correct not to add that for the aarch64 list.
> > 
> > Yes, I didn't mean to add it to aarch64.
> > 
> >     >
> >     > >
> >     > > And on aarch64, dropping +simd seems harmless at the moment, but maybe we want to keep it in order to be more future-proof?
> >     >
> >     > I'll let Tamar make the call on that one.  But as things stand we always default to having simd on aarch64 and I expect there will be a huge amount of testsuite churn if that ever changes, so I'm not too worried about that.
> > 
> >     Yeah, every base arch on aarch64 has +simd as per aarch64-arches.def:33,
> >     so armv8.3-a here should be enough.
> > 
> >     Thanks,
> >     Artemiy
> > 
> > Given the patch removes +simd in the aarch64 without mentioning it in the commit message, it will not be clear in the future if this was changed on purpose or not.
> > 
> > 
>
  

Patch

diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index dbcba42629f..210e246c955 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -13717,27 +13717,32 @@  proc check_effective_target_inff { } {
 proc check_effective_target_arm_v8_3a_complex_neon_ok_nocache { } {
     global et_arm_v8_3a_complex_neon_flags
     set et_arm_v8_3a_complex_neon_flags ""
-    set cpu_unset ""
 
     if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
 	return 0;
     }
 
     if { [istarget arm*-*-*] } {
-	set cpu_unset "-mcpu=unset"
+	set flag_opts {
+	    "-mcpu=unset -mfpu=auto -march=armv8.3-a+simd"
+	    "-mcpu=unset -mfloat-abi=softfp -mfpu=auto -march=armv8.3-a+simd"
+	    "-mcpu=unset -mfloat-abi=hard -mfpu=auto -march=armv8.3-a+simd"
+	}
+    } else {
+	set flag_opts { "" "-march=armv8.3-a" }
     }
 
     # Iterate through sets of options to find the compiler flags that
     # need to be added to the -march option.
-    foreach flags {"" "-mfloat-abi=softfp -mfpu=auto" "-mfloat-abi=hard -mfpu=auto"} {
+    foreach flags $flag_opts {
 	if { [check_no_compiler_messages_nocache \
 		  arm_v8_3a_complex_neon_ok assembly {
 	    #if !defined (__ARM_FEATURE_COMPLEX)
 	    #error "__ARM_FEATURE_COMPLEX not defined"
 	    #endif
 	    #include <complex.h>
-	} "$flags $cpu_unset -march=armv8.3-a+simd"] } {
-	    set et_arm_v8_3a_complex_neon_flags "$flags $cpu_unset -march=armv8.3-a+simd"
+	} "$flags"] } {
+	    set et_arm_v8_3a_complex_neon_flags "$flags"
 	    return 1;
 	}
     }
@@ -13765,19 +13770,24 @@  proc add_options_for_arm_v8_3a_complex_neon { flags } {
 proc check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache { } {
     global et_arm_v8_3a_fp16_complex_neon_flags
     set et_arm_v8_3a_fp16_complex_neon_flags ""
-    set cpu_unset ""
 
     if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
 	return 0;
     }
 
     if { [istarget arm*-*-*] } {
-	set cpu_unset "-mcpu=unset"
+	set flag_opts {
+	    "-mcpu=unset -mfpu=auto -march=armv8.3-a+fp16+simd"
+	    "-mcpu=unset -mfloat-abi=softfp -mfpu=auto -march=armv8.3-a+fp16+simd"
+	    "-mcpu=unset -mfloat-abi=hard -mfpu=auto -march=armv8.3-a+fp16+simd"
+	}
+    } else {
+	set flag_opts { "" "-march=armv8.3-a+fp16" }
     }
 
     # Iterate through sets of options to find the compiler flags that
     # need to be added to the -march option.
-    foreach flags {"" "-mfloat-abi=softfp -mfpu=auto" "-mfloat-abi=hard -mfpu=auto"} {
+    foreach flags $flag_opts {
 	if { [check_no_compiler_messages_nocache \
 		  arm_v8_3a_fp16_complex_neon_ok assembly {
 	    #if !defined (__ARM_FEATURE_COMPLEX)
@@ -13787,9 +13797,8 @@  proc check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache { } {
 	    #error "__ARM_FEATURE_FP16_VECTOR_ARITHMETIC not defined"
 	    #endif
 	    #include <complex.h>
-	} "$flags $cpu_unset -march=armv8.3-a+fp16+simd"] } {
-	    set et_arm_v8_3a_fp16_complex_neon_flags \
-			"$flags $cpu_unset -march=armv8.3-a+fp16+simd"
+	} "$flags"] } {
+	    set et_arm_v8_3a_fp16_complex_neon_flags "$flags"
 	    return 1;
 	}
     }