[v2,testsuite] xfail pr79004 on longdouble64; drop long_double_64bit (was: ppc: testsuite: pr79004 needs -mlong-double-128)

Message ID ory183eugl.fsf_-_@lxoliva.fsfla.org
State Committed
Commit dbdddc92a3b955fce71af47755c226132559eda2
Headers
Series [v2,testsuite] xfail pr79004 on longdouble64; drop long_double_64bit (was: ppc: testsuite: pr79004 needs -mlong-double-128) |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_gcc_check--master-arm success Testing passed

Commit Message

Alexandre Oliva May 21, 2024, 3:04 a.m. UTC
  On May  8, 2024, "Kewen.Lin" <linkw@linux.ibm.com> wrote:

>>> How about the generic one "longdouble64"?  I did a grep and found it has one
>>> use, I'd expect it can work here. :)
>> 
>> ... since this and longdouble128 exist, maybe we can fix it and leave
>> them all alone, despite the interface oddity.
>> 
> ... personally I'm inclined to drop this 64 bit one. :)

Some of the asm opcodes expected by pr79004 depend on
-mlong-double-128 to be output.  E.g., without this flag, the
conditions of patterns @extenddf<mode>2 and extendsf<mode>2 do not
hold, and so GCC resorts to libcalls instead of even trying
rs6000_expand_float128_convert.

Perhaps the conditions are too strict, and they could enable the use
of conversion insns involving __ieee128/_Float128 even with 64-bit
long doubles.

For now, xfail the opcodes that are not available on longdouble64.

While at that, drop long_double_64bit, since it's broken and sort of
redundant.

Regstrapped on x86_64-linux-gnu, also tested with gcc-13 on ppc64-vx7r2.
Ok to install?


for  gcc/testsuite/ChangeLog

	PR target/105359
	* gcc.target/powerpc/pr79004.c: Xfail opcodes not available on
	longdouble64.
	* lib/target-supports.exp
	(check_effective_target_long_double_64bit): Drop.
	(add_options_for_long_double_64bit): Likewise.
---
 gcc/testsuite/gcc.target/powerpc/pr79004.c |   14 +++++----
 gcc/testsuite/lib/target-supports.exp      |   43 ----------------------------
 2 files changed, 8 insertions(+), 49 deletions(-)
  

Comments

Kewen.Lin May 22, 2024, 3:31 a.m. UTC | #1
Hi,

on 2024/5/21 11:04, Alexandre Oliva wrote:
> On May  8, 2024, "Kewen.Lin" <linkw@linux.ibm.com> wrote:
> 
>>>> How about the generic one "longdouble64"?  I did a grep and found it has one
>>>> use, I'd expect it can work here. :)
>>>
>>> ... since this and longdouble128 exist, maybe we can fix it and leave
>>> them all alone, despite the interface oddity.
>>>
>> ... personally I'm inclined to drop this 64 bit one. :)
> 
> Some of the asm opcodes expected by pr79004 depend on
> -mlong-double-128 to be output.  E.g., without this flag, the
> conditions of patterns @extenddf<mode>2 and extendsf<mode>2 do not
> hold, and so GCC resorts to libcalls instead of even trying
> rs6000_expand_float128_convert.
> 
> Perhaps the conditions are too strict, and they could enable the use
> of conversion insns involving __ieee128/_Float128 even with 64-bit
> long doubles.
> 
> For now, xfail the opcodes that are not available on longdouble64.
> 
> While at that, drop long_double_64bit, since it's broken and sort of
> redundant.
> 
> Regstrapped on x86_64-linux-gnu, also tested with gcc-13 on ppc64-vx7r2.
> Ok to install?

OK for trunk, thanks!

BR,
Kewen

> 
> 
> for  gcc/testsuite/ChangeLog
> 
> 	PR target/105359
> 	* gcc.target/powerpc/pr79004.c: Xfail opcodes not available on
> 	longdouble64.
> 	* lib/target-supports.exp
> 	(check_effective_target_long_double_64bit): Drop.
> 	(add_options_for_long_double_64bit): Likewise.
> ---
>  gcc/testsuite/gcc.target/powerpc/pr79004.c |   14 +++++----
>  gcc/testsuite/lib/target-supports.exp      |   43 ----------------------------
>  2 files changed, 8 insertions(+), 49 deletions(-)
> 
> diff --git a/gcc/testsuite/gcc.target/powerpc/pr79004.c b/gcc/testsuite/gcc.target/powerpc/pr79004.c
> index caf1f6c1eefe4..2cb8bf4bc14bc 100644
> --- a/gcc/testsuite/gcc.target/powerpc/pr79004.c
> +++ b/gcc/testsuite/gcc.target/powerpc/pr79004.c
> @@ -100,10 +100,12 @@ void to_uns_short_store_n (TYPE a, unsigned short *p, long n) { p[n] = (unsigned
>  void to_uns_int_store_n (TYPE a, unsigned int *p, long n) { p[n] = (unsigned int)a; }
>  void to_uns_long_store_n (TYPE a, unsigned long *p, long n) { p[n] = (unsigned long)a; }
>  
> -/* { dg-final { scan-assembler-not {\mbl __}       } } */
> -/* { dg-final { scan-assembler     {\mxscvdpqp\M}  } } */
> -/* { dg-final { scan-assembler     {\mxscvqpdp\M}  } } */
> -/* { dg-final { scan-assembler     {\mxscvqpdpo\M} } } */
> +/* On targets with 64-bit long double, some opcodes to deal with __float128 are
> +   disabled, see PR target/105359.  */
> +/* { dg-final { scan-assembler-not {\mbl __}       { xfail longdouble64 } } } */
> +/* { dg-final { scan-assembler     {\mxscvdpqp\M}  { xfail longdouble64 } } } */
> +/* { dg-final { scan-assembler     {\mxscvqpdp\M}  { xfail longdouble64 } } } */
> +/* { dg-final { scan-assembler     {\mxscvqpdpo\M} { xfail longdouble64 } } } */
>  /* { dg-final { scan-assembler     {\mxscvqpsdz\M} } } */
>  /* { dg-final { scan-assembler     {\mxscvqpswz\M} } } */
>  /* { dg-final { scan-assembler     {\mxscvsdqp\M}  } } */
> @@ -111,7 +113,7 @@ void to_uns_long_store_n (TYPE a, unsigned long *p, long n) { p[n] = (unsigned l
>  /* { dg-final { scan-assembler     {\mlxsd\M}      } } */
>  /* { dg-final { scan-assembler     {\mlxsiwax\M}   } } */
>  /* { dg-final { scan-assembler     {\mlxsiwzx\M}   } } */
> -/* { dg-final { scan-assembler     {\mlxssp\M}     } } */
> +/* { dg-final { scan-assembler     {\mlxssp\M}     { xfail longdouble64 } } } */
>  /* { dg-final { scan-assembler     {\mstxsd\M}     } } */
>  /* { dg-final { scan-assembler     {\mstxsiwx\M}   } } */
> -/* { dg-final { scan-assembler     {\mstxssp\M}    } } */
> +/* { dg-final { scan-assembler     {\mstxssp\M}    { xfail longdouble64 } } } */
> diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
> index ec9baa4f32a30..dc7d4f2b5f39e 100644
> --- a/gcc/testsuite/lib/target-supports.exp
> +++ b/gcc/testsuite/lib/target-supports.exp
> @@ -2930,49 +2930,6 @@ proc add_options_for_long_double_ieee128 { flags } {
>      return "$flags"
>  }
>  
> -# Check if GCC and GLIBC supports explicitly specifying that the long double
> -# format uses the IEEE 64-bit.  Under little endian PowerPC Linux, you need
> -# GLIBC 2.32 or later to be able to use a different long double format for
> -# running a program than the system default.
> -
> -proc check_effective_target_long_double_64bit { } {
> -    return [check_runtime_nocache long_double_64bit {
> -	#include <string.h>
> -	#include <stdio.h>
> -	/* use volatile to prevent optimization.  */
> -	volatile double a = 3.0;
> -	volatile long double one = 1.0L;
> -	volatile long double two = 2.0L;
> -	volatile long double b;
> -	char buffer[20];
> -	int main()
> -	{
> -	  double a2;
> -	  long double b2;
> -	  if (sizeof (long double) != 8)
> -	    return 1;
> -	  b = one + two;
> -	  /* eliminate removing volatile cast warning.  */
> -	  a2 = a;
> -	  b2 = b;
> -	  if (memcmp (&a2, &b2, 16) != 0)
> -	    return 1;
> -	  sprintf (buffer, "%lg", b);
> -	  return strcmp (buffer, "3") != 0;
> -	}
> -    }  [add_options_for_ppc_long_double_override_64bit ""]]
> -}
> -
> -# Return the appropriate options to specify that long double uses the IEEE
> -# 64-bit format on PowerPC.
> -
> -proc add_options_for_long_double_64bit { flags } {
> -    if { [istarget powerpc*-*-*] } {
> -	return "$flags -mlong-double-64"
> -    }
> -    return "$flags"
> -}
> -
>  # Return 1 if the target supports executing VSX instructions, 0
>  # otherwise.  Cache the result.
>  
>
  

Patch

diff --git a/gcc/testsuite/gcc.target/powerpc/pr79004.c b/gcc/testsuite/gcc.target/powerpc/pr79004.c
index caf1f6c1eefe4..2cb8bf4bc14bc 100644
--- a/gcc/testsuite/gcc.target/powerpc/pr79004.c
+++ b/gcc/testsuite/gcc.target/powerpc/pr79004.c
@@ -100,10 +100,12 @@  void to_uns_short_store_n (TYPE a, unsigned short *p, long n) { p[n] = (unsigned
 void to_uns_int_store_n (TYPE a, unsigned int *p, long n) { p[n] = (unsigned int)a; }
 void to_uns_long_store_n (TYPE a, unsigned long *p, long n) { p[n] = (unsigned long)a; }
 
-/* { dg-final { scan-assembler-not {\mbl __}       } } */
-/* { dg-final { scan-assembler     {\mxscvdpqp\M}  } } */
-/* { dg-final { scan-assembler     {\mxscvqpdp\M}  } } */
-/* { dg-final { scan-assembler     {\mxscvqpdpo\M} } } */
+/* On targets with 64-bit long double, some opcodes to deal with __float128 are
+   disabled, see PR target/105359.  */
+/* { dg-final { scan-assembler-not {\mbl __}       { xfail longdouble64 } } } */
+/* { dg-final { scan-assembler     {\mxscvdpqp\M}  { xfail longdouble64 } } } */
+/* { dg-final { scan-assembler     {\mxscvqpdp\M}  { xfail longdouble64 } } } */
+/* { dg-final { scan-assembler     {\mxscvqpdpo\M} { xfail longdouble64 } } } */
 /* { dg-final { scan-assembler     {\mxscvqpsdz\M} } } */
 /* { dg-final { scan-assembler     {\mxscvqpswz\M} } } */
 /* { dg-final { scan-assembler     {\mxscvsdqp\M}  } } */
@@ -111,7 +113,7 @@  void to_uns_long_store_n (TYPE a, unsigned long *p, long n) { p[n] = (unsigned l
 /* { dg-final { scan-assembler     {\mlxsd\M}      } } */
 /* { dg-final { scan-assembler     {\mlxsiwax\M}   } } */
 /* { dg-final { scan-assembler     {\mlxsiwzx\M}   } } */
-/* { dg-final { scan-assembler     {\mlxssp\M}     } } */
+/* { dg-final { scan-assembler     {\mlxssp\M}     { xfail longdouble64 } } } */
 /* { dg-final { scan-assembler     {\mstxsd\M}     } } */
 /* { dg-final { scan-assembler     {\mstxsiwx\M}   } } */
-/* { dg-final { scan-assembler     {\mstxssp\M}    } } */
+/* { dg-final { scan-assembler     {\mstxssp\M}    { xfail longdouble64 } } } */
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index ec9baa4f32a30..dc7d4f2b5f39e 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -2930,49 +2930,6 @@  proc add_options_for_long_double_ieee128 { flags } {
     return "$flags"
 }
 
-# Check if GCC and GLIBC supports explicitly specifying that the long double
-# format uses the IEEE 64-bit.  Under little endian PowerPC Linux, you need
-# GLIBC 2.32 or later to be able to use a different long double format for
-# running a program than the system default.
-
-proc check_effective_target_long_double_64bit { } {
-    return [check_runtime_nocache long_double_64bit {
-	#include <string.h>
-	#include <stdio.h>
-	/* use volatile to prevent optimization.  */
-	volatile double a = 3.0;
-	volatile long double one = 1.0L;
-	volatile long double two = 2.0L;
-	volatile long double b;
-	char buffer[20];
-	int main()
-	{
-	  double a2;
-	  long double b2;
-	  if (sizeof (long double) != 8)
-	    return 1;
-	  b = one + two;
-	  /* eliminate removing volatile cast warning.  */
-	  a2 = a;
-	  b2 = b;
-	  if (memcmp (&a2, &b2, 16) != 0)
-	    return 1;
-	  sprintf (buffer, "%lg", b);
-	  return strcmp (buffer, "3") != 0;
-	}
-    }  [add_options_for_ppc_long_double_override_64bit ""]]
-}
-
-# Return the appropriate options to specify that long double uses the IEEE
-# 64-bit format on PowerPC.
-
-proc add_options_for_long_double_64bit { flags } {
-    if { [istarget powerpc*-*-*] } {
-	return "$flags -mlong-double-64"
-    }
-    return "$flags"
-}
-
 # Return 1 if the target supports executing VSX instructions, 0
 # otherwise.  Cache the result.