https://gcc.gnu.org/g:459d3cb9b8b96555a9a815f2306bfc8e5d2085f8
commit r17-5263-g459d3cb9b8b96555a9a815f2306bfc8e5d2085f8 Author: Konstantinos Eleftheriou <[email protected]> Date: Wed Oct 14 07:03:08 2026 -0700 c-family: Add __UNSAFE_MATH_OPTIMIZATIONS__ predefined macro GCC predefines macros for the flags that -funsafe-math-optimizations enables, but not for the option itself. Headers that offer less accurate implementations, such as glibc's vector math declarations, need to know whether it is in effect. Define __UNSAFE_MATH_OPTIMIZATIONS__ when -funsafe-math-optimizations is in effect, and update it for #pragma GCC optimize like the other math macros. Joe Ramsay asked for such a macro in the review of the glibc patch: https://inbox.sourceware.org/libc-alpha/[email protected]/ gcc/c-family/ChangeLog: * c-cppbuiltin.cc (c_cpp_builtins_optimize_pragma): Define or undefine __UNSAFE_MATH_OPTIMIZATIONS__. gcc/ChangeLog: * cppbuiltin.cc (define_builtin_macros_for_compilation_flags): Define __UNSAFE_MATH_OPTIMIZATIONS__. * doc/cpp.texi (Common Predefined Macros): Document __UNSAFE_MATH_OPTIMIZATIONS__. gcc/testsuite/ChangeLog: * gcc.dg/unsafe-math-optimizations-1.c: New test. * gcc.dg/unsafe-math-optimizations-2.c: New test. Diff: --- gcc/c-family/c-cppbuiltin.cc | 7 +++++++ gcc/cppbuiltin.cc | 2 ++ gcc/doc/cpp.texi | 4 ++++ gcc/testsuite/gcc.dg/unsafe-math-optimizations-1.c | 17 +++++++++++++++++ gcc/testsuite/gcc.dg/unsafe-math-optimizations-2.c | 17 +++++++++++++++++ 5 files changed, 47 insertions(+) diff --git a/gcc/c-family/c-cppbuiltin.cc b/gcc/c-family/c-cppbuiltin.cc index 3f27f77a2265..2c68681a3684 100644 --- a/gcc/c-family/c-cppbuiltin.cc +++ b/gcc/c-family/c-cppbuiltin.cc @@ -645,6 +645,13 @@ c_cpp_builtins_optimize_pragma (cpp_reader *pfile, tree prev_tree, else if (prev->x_flag_rounding_math && !cur->x_flag_rounding_math) cpp_undef (pfile, "__ROUNDING_MATH__"); + if (!prev->x_flag_unsafe_math_optimizations + && cur->x_flag_unsafe_math_optimizations) + cpp_define_unused (pfile, "__UNSAFE_MATH_OPTIMIZATIONS__"); + else if (prev->x_flag_unsafe_math_optimizations + && !cur->x_flag_unsafe_math_optimizations) + cpp_undef (pfile, "__UNSAFE_MATH_OPTIMIZATIONS__"); + cpp_stop_forcing_token_locations (parse_in); } diff --git a/gcc/cppbuiltin.cc b/gcc/cppbuiltin.cc index 911975fd78bc..0dbe2591178c 100644 --- a/gcc/cppbuiltin.cc +++ b/gcc/cppbuiltin.cc @@ -120,6 +120,8 @@ define_builtin_macros_for_compilation_flags (cpp_reader *pfile) cpp_define (pfile, "__ASSOCIATIVE_MATH__"); if (flag_rounding_math) cpp_define (pfile, "__ROUNDING_MATH__"); + if (flag_unsafe_math_optimizations) + cpp_define (pfile, "__UNSAFE_MATH_OPTIMIZATIONS__"); cpp_define_formatted (pfile, "__FINITE_MATH_ONLY__=%d", flag_finite_math_only); diff --git a/gcc/doc/cpp.texi b/gcc/doc/cpp.texi index 859b5395047a..7694bb651a41 100644 --- a/gcc/doc/cpp.texi +++ b/gcc/doc/cpp.texi @@ -2485,6 +2485,10 @@ by another option such as @option{-ffast-math} or by default. @item __ROUNDING_MATH__ This macro is defined if @option{-frounding-math} is used. +@item __UNSAFE_MATH_OPTIMIZATIONS__ +This macro is defined if @option{-funsafe-math-optimizations} is used, +or enabled by another option such as @option{-ffast-math}. + @item __GNUC_EXECUTION_CHARSET_NAME @itemx __GNUC_WIDE_EXECUTION_CHARSET_NAME These macros are defined to expand to a narrow string literal of diff --git a/gcc/testsuite/gcc.dg/unsafe-math-optimizations-1.c b/gcc/testsuite/gcc.dg/unsafe-math-optimizations-1.c new file mode 100644 index 000000000000..00fb497b1c85 --- /dev/null +++ b/gcc/testsuite/gcc.dg/unsafe-math-optimizations-1.c @@ -0,0 +1,17 @@ +/* Test __UNSAFE_MATH_OPTIMIZATIONS__ with -funsafe-math-optimizations. */ +/* { dg-do compile } */ +/* { dg-options "-funsafe-math-optimizations" } */ + +#ifndef __UNSAFE_MATH_OPTIMIZATIONS__ +#error "__UNSAFE_MATH_OPTIMIZATIONS__ not defined" +#endif + +#pragma GCC optimize "-fno-unsafe-math-optimizations" +#ifdef __UNSAFE_MATH_OPTIMIZATIONS__ +#error "__UNSAFE_MATH_OPTIMIZATIONS__ defined" +#endif + +#pragma GCC optimize "-funsafe-math-optimizations" +#ifndef __UNSAFE_MATH_OPTIMIZATIONS__ +#error "__UNSAFE_MATH_OPTIMIZATIONS__ not defined" +#endif diff --git a/gcc/testsuite/gcc.dg/unsafe-math-optimizations-2.c b/gcc/testsuite/gcc.dg/unsafe-math-optimizations-2.c new file mode 100644 index 000000000000..8916bc544553 --- /dev/null +++ b/gcc/testsuite/gcc.dg/unsafe-math-optimizations-2.c @@ -0,0 +1,17 @@ +/* Test __UNSAFE_MATH_OPTIMIZATIONS__ with -fno-unsafe-math-optimizations. */ +/* { dg-do compile } */ +/* { dg-options "-fno-unsafe-math-optimizations" } */ + +#ifdef __UNSAFE_MATH_OPTIMIZATIONS__ +#error "__UNSAFE_MATH_OPTIMIZATIONS__ defined" +#endif + +#pragma GCC optimize "-funsafe-math-optimizations" +#ifndef __UNSAFE_MATH_OPTIMIZATIONS__ +#error "__UNSAFE_MATH_OPTIMIZATIONS__ not defined" +#endif + +#pragma GCC optimize "-fno-unsafe-math-optimizations" +#ifdef __UNSAFE_MATH_OPTIMIZATIONS__ +#error "__UNSAFE_MATH_OPTIMIZATIONS__ defined" +#endif
