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

Reply via email to