testsuite: Sanitize fails for SP FPU on Arm

This patch stops reporting fails for Arm targets with single
precision floating point unit for types wider than 32 bits (the width
of float on arm-none-eabi).

As reported in PR102017, fenv is reported as supported in recent
versions of newlib. At the same time, for some Arm targets, the
implementation in libgcc does not support exceptions and thus, the
test fails with a call to abort().

gcc/testsuite/ChangeLog:

	* lib/target-supports.exp
	(check_effective_target_fenv_exceptions_double): New.
	(check_effective_target_fenv_exceptions_long_double): New.
	* gcc.dg/c2x-float-7.c: Split into 3 tests...
	* gcc.dg/c2x-float-7a.c: Float part of c2x-float-7.c.
	* gcc.dg/c2x-float-7b.c: Double part of c2x-float-7.c.
	* gcc.dg/c2x-float-7c.c: Long double part of c2x-float-7.c.
	* gcc.dg/pr95115.c: Switch to fenv_exceptions_double.
	* gcc.dg/torture/float32x-nan-floath.c: Likewise.
	* gcc.dg/torture/float32x-nan.c: Likewise.
	* gcc.dg/torture/float64-nan-floath.c: Likewise.
	* gcc.dg/torture/float64-nan.c: Likewise.
	* gcc.dg/torture/inf-compare-1.c: Likewise.
	* gcc.dg/torture/inf-compare-2.c: Likewise.
	* gcc.dg/torture/inf-compare-3.c: Likewise.
	* gcc.dg/torture/inf-compare-4.c: Likewise.
	* gcc.dg/torture/inf-compare-5.c: Likewise.
	* gcc.dg/torture/inf-compare-6.c: Likewise.
	* gcc.dg/torture/inf-compare-7.c: Likewise.
	* gcc.dg/torture/inf-compare-8.c: Likewise.
	* gcc.dg/torture/pr52451.c: Likewise.
	* gcc.dg/torture/pr82692.c: Likewise.
	* gcc.dg/torture/inf-compare-1-float.c: New test.
	* gcc.dg/torture/inf-compare-2-float.c: New test.
	* gcc.dg/torture/inf-compare-3-float.c: New test.
	* gcc.dg/torture/inf-compare-4-float.c: New test.
	* gcc.dg/torture/inf-compare-5-float.c: New test.
	* gcc.dg/torture/inf-compare-6-float.c: New test.
	* gcc.dg/torture/inf-compare-7-float.c: New test.
	* gcc.dg/torture/inf-compare-8-float.c: New test.

Co-Authored-By: Yvan ROUX <yvan.roux@foss.st.com>
Signed-off-by: Torbjörn SVENSSON <torbjorn.svensson@foss.st.com>
This commit is contained in:
Torbjörn SVENSSON 2022-09-23 19:08:30 +02:00
parent 14272aec22
commit ecaa9ca6a8
28 changed files with 345 additions and 64 deletions

View File

@ -1,49 +0,0 @@
/* Test SNAN macros. Runtime exceptions test, to verify NaN is
signaling. */
/* { dg-do run } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-options "-std=c2x -pedantic-errors -fsignaling-nans" } */
/* { dg-add-options ieee } */
#include <fenv.h>
#include <float.h>
/* These should be defined if and only if signaling NaNs are supported
for the given types. If the testsuite gains effective-target
support for targets not supporting signaling NaNs, or not
supporting them for all types, this test should be made
appropriately conditional. */
#ifndef FLT_SNAN
#error "FLT_SNAN undefined"
#endif
#ifndef DBL_SNAN
#error "DBL_SNAN undefined"
#endif
#ifndef LDBL_SNAN
#error "LDBL_SNAN undefined"
#endif
volatile float f = FLT_SNAN;
volatile double d = DBL_SNAN;
volatile long double ld = LDBL_SNAN;
extern void abort (void);
extern void exit (int);
int
main (void)
{
feclearexcept (FE_ALL_EXCEPT);
f += f;
if (!fetestexcept (FE_INVALID))
abort ();
feclearexcept (FE_ALL_EXCEPT);
d += d;
if (!fetestexcept (FE_INVALID))
abort ();
feclearexcept (FE_ALL_EXCEPT);
ld += ld;
if (!fetestexcept (FE_INVALID))
abort ();
exit (0);
}

View File

@ -0,0 +1,32 @@
/* Test SNAN macros. Runtime exceptions test, to verify NaN is
signaling. */
/* { dg-do run } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-options "-std=c2x -pedantic-errors -fsignaling-nans" } */
/* { dg-add-options ieee } */
#include <fenv.h>
#include <float.h>
/* This should be defined if and only if signaling NaNs is supported
for the given type. If the testsuite gains effective-target
support for targets not supporting signaling NaNs, this test
should be made appropriately conditional. */
#ifndef FLT_SNAN
#error "FLT_SNAN undefined"
#endif
volatile float f = FLT_SNAN;
extern void abort (void);
extern void exit (int);
int
main (void)
{
feclearexcept (FE_ALL_EXCEPT);
f += f;
if (!fetestexcept (FE_INVALID))
abort ();
exit (0);
}

View File

@ -0,0 +1,32 @@
/* Test SNAN macros. Runtime exceptions test, to verify NaN is
signaling. */
/* { dg-do run } */
/* { dg-require-effective-target fenv_exceptions_double } */
/* { dg-options "-std=c2x -pedantic-errors -fsignaling-nans" } */
/* { dg-add-options ieee } */
#include <fenv.h>
#include <float.h>
/* This should be defined if and only if signaling NaNs is supported
for the given type. If the testsuite gains effective-target
support for targets not supporting signaling NaNs, this test
should be made appropriately conditional. */
#ifndef DBL_SNAN
#error "DBL_SNAN undefined"
#endif
volatile double d = DBL_SNAN;
extern void abort (void);
extern void exit (int);
int
main (void)
{
feclearexcept (FE_ALL_EXCEPT);
d += d;
if (!fetestexcept (FE_INVALID))
abort ();
exit (0);
}

View File

@ -0,0 +1,32 @@
/* Test SNAN macros. Runtime exceptions test, to verify NaN is
signaling. */
/* { dg-do run } */
/* { dg-require-effective-target fenv_exceptions_long_double } */
/* { dg-options "-std=c2x -pedantic-errors -fsignaling-nans" } */
/* { dg-add-options ieee } */
#include <fenv.h>
#include <float.h>
/* This should be defined if and only if signaling NaNs is supported
for the given type. If the testsuite gains effective-target
support for targets not supporting signaling NaNs, this test
should be made appropriately conditional. */
#ifndef LDBL_SNAN
#error "LDBL_SNAN undefined"
#endif
volatile long double ld = LDBL_SNAN;
extern void abort (void);
extern void exit (int);
int
main (void)
{
feclearexcept (FE_ALL_EXCEPT);
ld += ld;
if (!fetestexcept (FE_INVALID))
abort ();
exit (0);
}

View File

@ -1,7 +1,7 @@
/* { dg-do run } */
/* { dg-options "-O2 -ftrapping-math" } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_double } */
#include <fenv.h>
#include <stdlib.h>

View File

@ -4,7 +4,7 @@
/* { dg-add-options float32x } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target float32x_runtime } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_double } */
#define WIDTH 32
#define EXT 1

View File

@ -4,7 +4,7 @@
/* { dg-add-options float32x } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target float32x_runtime } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_double } */
#define WIDTH 32
#define EXT 1

View File

@ -4,7 +4,7 @@
/* { dg-add-options float64 } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target float64_runtime } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_double } */
#define WIDTH 64
#define EXT 0

View File

@ -4,7 +4,7 @@
/* { dg-add-options float64 } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target float64_runtime } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_double } */
#define WIDTH 64
#define EXT 0

View File

@ -0,0 +1,21 @@
/* { dg-do run { xfail { powerpc*-*-* } } } */
/* remove the xfail for powerpc when pr58684 is fixed */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-skip-if "fenv" { powerpc-ibm-aix* } } */
#include <fenv.h>
extern void abort (void);
extern void exit (int);
volatile float x = __builtin_nan ("");
volatile int i;
int
main (void)
{
i = x > __builtin_inf ();
if (i != 0 || !fetestexcept (FE_INVALID))
abort ();
}

View File

@ -1,7 +1,7 @@
/* { dg-do run { xfail { powerpc*-*-* } } } */
/* remove the xfail for powerpc when pr58684 is fixed */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_double } */
/* { dg-skip-if "fenv" { powerpc-ibm-aix* } } */
#include <fenv.h>

View File

@ -0,0 +1,21 @@
/* { dg-do run { xfail { powerpc*-*-* } } } */
/* remove the xfail for powerpc when pr58684 is fixed */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-skip-if "fenv" { powerpc-ibm-aix* } } */
#include <fenv.h>
extern void abort (void);
extern void exit (int);
volatile float x = __builtin_nan ("");
volatile int i;
int
main (void)
{
i = x < -__builtin_inf ();
if (i != 0 || !fetestexcept (FE_INVALID))
abort ();
}

View File

@ -1,7 +1,7 @@
/* { dg-do run { xfail { powerpc*-*-* } } } */
/* remove the xfail for powerpc when pr58684 is fixed */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_double } */
/* { dg-skip-if "fenv" { powerpc-ibm-aix* } } */
#include <fenv.h>

View File

@ -0,0 +1,21 @@
/* { dg-do run { xfail { powerpc*-*-* } } } */
/* remove the xfail for powerpc when pr58684 is fixed */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-skip-if "fenv" { powerpc-ibm-aix* } } */
#include <fenv.h>
extern void abort (void);
extern void exit (int);
volatile float x = __builtin_nan ("");
volatile int i;
int
main (void)
{
i = x <= __builtin_inf ();
if (i != 0 || !fetestexcept (FE_INVALID))
abort ();
}

View File

@ -1,7 +1,7 @@
/* { dg-do run { xfail { powerpc*-*-* } } } */
/* remove the xfail for powerpc when pr58684 is fixed */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_double } */
/* { dg-skip-if "fenv" { powerpc-ibm-aix* } } */
#include <fenv.h>

View File

@ -0,0 +1,21 @@
/* { dg-do run { xfail { powerpc*-*-* } } } */
/* remove the xfail for powerpc when pr58684 is fixed */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-skip-if "fenv" { powerpc-ibm-aix* } } */
#include <fenv.h>
extern void abort (void);
extern void exit (int);
volatile float x = __builtin_nan ("");
volatile int i;
int
main (void)
{
i = x >= -__builtin_inf ();
if (i != 0 || !fetestexcept (FE_INVALID))
abort ();
}

View File

@ -1,7 +1,7 @@
/* { dg-do run { xfail { powerpc*-*-* } } } */
/* remove the xfail for powerpc when pr58684 is fixed */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_double } */
/* { dg-skip-if "fenv" { powerpc-ibm-aix* } } */
#include <fenv.h>

View File

@ -0,0 +1,19 @@
/* { dg-do run } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
#include <fenv.h>
extern void abort (void);
extern void exit (int);
volatile float x = __builtin_nan ("");
volatile int i;
int
main (void)
{
i = x == __builtin_inf ();
if (i != 0 || fetestexcept (FE_INVALID))
abort ();
}

View File

@ -1,6 +1,6 @@
/* { dg-do run } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_double } */
#include <fenv.h>

View File

@ -0,0 +1,19 @@
/* { dg-do run } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
#include <fenv.h>
extern void abort (void);
extern void exit (int);
volatile float x = __builtin_nan ("");
volatile int i;
int
main (void)
{
i = x == -__builtin_inf ();
if (i != 0 || fetestexcept (FE_INVALID))
abort ();
}

View File

@ -1,6 +1,6 @@
/* { dg-do run } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_double } */
#include <fenv.h>

View File

@ -0,0 +1,19 @@
/* { dg-do run } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
#include <fenv.h>
extern void abort (void);
extern void exit (int);
volatile float x = __builtin_nan ("");
volatile int i;
int
main (void)
{
i = x != __builtin_inf ();
if (i != 1 || fetestexcept (FE_INVALID))
abort ();
}

View File

@ -1,6 +1,6 @@
/* { dg-do run } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_double } */
#include <fenv.h>

View File

@ -0,0 +1,19 @@
/* { dg-do run } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
#include <fenv.h>
extern void abort (void);
extern void exit (int);
volatile float x = __builtin_nan ("");
volatile int i;
int
main (void)
{
i = x != -__builtin_inf ();
if (i != 1 || fetestexcept (FE_INVALID))
abort ();
}

View File

@ -1,6 +1,6 @@
/* { dg-do run } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_double } */
#include <fenv.h>

View File

@ -1,6 +1,6 @@
/* { dg-do run } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_long_double } */
/* { dg-skip-if "fenv" { powerpc-ibm-aix* } } */
#include <fenv.h>

View File

@ -1,6 +1,6 @@
/* { dg-do run } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target fenv_exceptions } */
/* { dg-require-effective-target fenv_exceptions_double } */
#include <fenv.h>

View File

@ -10852,6 +10852,80 @@ proc check_effective_target_fenv_exceptions_dfp {} {
} [add_options_for_ieee "-std=gnu99"]]
}
# Return 1 if <fenv.h> is available with all the standard IEEE
# exceptions and floating-point exceptions are raised by arithmetic
# operations. (If the target requires special options for "inexact"
# exceptions, those need to be specified in the testcases.)
proc check_effective_target_fenv_exceptions_double {} {
return [check_runtime fenv_exceptions_double {
#include <fenv.h>
#include <stdlib.h>
#ifndef FE_DIVBYZERO
# error Missing FE_DIVBYZERO
#endif
#ifndef FE_INEXACT
# error Missing FE_INEXACT
#endif
#ifndef FE_INVALID
# error Missing FE_INVALID
#endif
#ifndef FE_OVERFLOW
# error Missing FE_OVERFLOW
#endif
#ifndef FE_UNDERFLOW
# error Missing FE_UNDERFLOW
#endif
volatile double a = 0.0f, r;
int
main (void)
{
r = a / a;
if (fetestexcept (FE_INVALID))
exit (0);
else
abort ();
}
} [add_options_for_ieee "-std=gnu99"]]
}
# Return 1 if <fenv.h> is available with all the standard IEEE
# exceptions and floating-point exceptions are raised by arithmetic
# operations. (If the target requires special options for "inexact"
# exceptions, those need to be specified in the testcases.)
proc check_effective_target_fenv_exceptions_long_double {} {
return [check_runtime fenv_exceptions_long_double {
#include <fenv.h>
#include <stdlib.h>
#ifndef FE_DIVBYZERO
# error Missing FE_DIVBYZERO
#endif
#ifndef FE_INEXACT
# error Missing FE_INEXACT
#endif
#ifndef FE_INVALID
# error Missing FE_INVALID
#endif
#ifndef FE_OVERFLOW
# error Missing FE_OVERFLOW
#endif
#ifndef FE_UNDERFLOW
# error Missing FE_UNDERFLOW
#endif
volatile long double a = 0.0f, r;
int
main (void)
{
r = a / a;
if (fetestexcept (FE_INVALID))
exit (0);
else
abort ();
}
} [add_options_for_ieee "-std=gnu99"]]
}
# Return 1 if -fexceptions is supported.
proc check_effective_target_exceptions {} {