Hi, On Thu, Mar 12, 2026 at 11:10:51AM -0400, Tom Lane wrote: > Bertrand Drouvot <[email protected]> writes: > > On Wed, Mar 11, 2026 at 01:48:31PM -0400, Andres Freund wrote: > >> On 2026-03-11 12:45:55 -0400, Tom Lane wrote: > >>> So no, I don't wanna support this. But maybe we should move the > >>> code-level tests out of the datetime files and into utils/float.h > >>> or some such place. > > >> I think it's probably better to have it in a .c file (maybe float.c), I > >> could > >> kinda imagine some extension intentionally enabling -ffast-math, because it > >> does something numerically intensive where the incorrectness doesn't > >> matter. > > > I think that you have a good point about the extension. That said a .h file > > could also prevent the extension to make use of -ffast-math "accidentally". > > Yeah, that was my thought too. But I think Andres has a point that in > principle an extension could use -ffast-math intentionally, so I'm > content to just put the test in float.c.
Yeah, I do agree. Something like in the attached? Regards, -- Bertrand Drouvot PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com
>From bbf1c1c9b959444b799e14f0e101636efa38699b Mon Sep 17 00:00:00 2001 From: Bertrand Drouvot <[email protected]> Date: Fri, 13 Mar 2026 07:47:29 +0000 Subject: [PATCH v2] Move -ffast-math defense to float.c and remove the autoconf check Move the defense to float.c, which is a more appropriate place: -ffast-math breaks isnan() and isinf() tests and near-overflow handling, and b6aa17e0ae3 de-supported floating-point timestamps. The check is placed in a .c file rather than a header file to allow third-party extensions to use -ffast-math if they need to. Also remove the check from configure as it is no longer needed (it was added to catch Linux distributions that compiled everything with -ffast-math but those distributions are gone). Author: Bertrand Drouvot <[email protected]> Suggested-by: Tom Lane <[email protected]> Suggested-by: Andres Freund <[email protected]> Suggested-by: Peter Eisentraut <[email protected]> Discussion: https://postgr.es/m/abFXfKC8zR0Oclon%40ip-10-97-1-34.eu-west-3.compute.internal --- configure | 23 ---------------------- configure.ac | 7 ------- src/backend/utils/adt/date.c | 9 --------- src/backend/utils/adt/float.c | 9 +++++++++ src/backend/utils/adt/timestamp.c | 8 -------- src/interfaces/ecpg/pgtypeslib/interval.c | 4 ---- src/interfaces/ecpg/pgtypeslib/timestamp.c | 4 ---- 7 files changed, 9 insertions(+), 55 deletions(-) 50.7% src/backend/utils/adt/ 10.0% src/interfaces/ecpg/pgtypeslib/ diff --git a/configure b/configure index 42621ecd051..af381018201 100755 --- a/configure +++ b/configure @@ -7700,29 +7700,6 @@ fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext -# Defend against gcc -ffast-math -if test "$GCC" = yes; then -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifdef __FAST_MATH__ -choke me -#endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - as_fn_error $? "do not put -ffast-math in CFLAGS" "$LINENO" 5 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - # Defend against clang being used on x86-32 without SSE2 enabled. As current # versions of clang do not understand -fexcess-precision=standard, the use of # x87 floating point operations leads to problems like isinf possibly returning diff --git a/configure.ac b/configure.ac index 61ec895d23c..4e5ee933024 100644 --- a/configure.ac +++ b/configure.ac @@ -786,13 +786,6 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([], [return 0;])], [AC_MSG_RESULT(no) AC_MSG_ERROR([cannot proceed])]) -# Defend against gcc -ffast-math -if test "$GCC" = yes; then -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [@%:@ifdef __FAST_MATH__ -choke me -@%:@endif])], [], [AC_MSG_ERROR([do not put -ffast-math in CFLAGS])]) -fi - # Defend against clang being used on x86-32 without SSE2 enabled. As current # versions of clang do not understand -fexcess-precision=standard, the use of # x87 floating point operations leads to problems like isinf possibly returning diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c index 621b9175c12..933766ef128 100644 --- a/src/backend/utils/adt/date.c +++ b/src/backend/utils/adt/date.c @@ -38,15 +38,6 @@ #include "utils/skipsupport.h" #include "utils/sortsupport.h" -/* - * gcc's -ffast-math switch breaks routines that expect exact results from - * expressions like timeval / SECS_PER_HOUR, where timeval is double. - */ -#ifdef __FAST_MATH__ -#error -ffast-math is known to break this code -#endif - - /* common code for timetypmodin and timetztypmodin */ static int32 anytime_typmodin(bool istz, ArrayType *ta) diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index 641e7de21a0..9a09c27a429 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -28,6 +28,15 @@ #include "utils/fmgrprotos.h" #include "utils/sortsupport.h" +/* + * -ffast-math switch breaks isnan() and isinf() tests and near-overflow + * handling. + * This test is not done in the header file because we still want third-party + * extensions to be able to use -ffast-math if they need to. + */ +#ifdef __FAST_MATH__ +#error -ffast-math is known to break this code +#endif /* * Configurable GUC parameter diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 6f8cf29c910..afa15e8df08 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -40,14 +40,6 @@ #include "utils/skipsupport.h" #include "utils/sortsupport.h" -/* - * gcc's -ffast-math switch breaks routines that expect exact results from - * expressions like timeval / SECS_PER_HOUR, where timeval is double. - */ -#ifdef __FAST_MATH__ -#error -ffast-math is known to break this code -#endif - /* Set at postmaster start */ TimestampTz PgStartTime; diff --git a/src/interfaces/ecpg/pgtypeslib/interval.c b/src/interfaces/ecpg/pgtypeslib/interval.c index e452a088f9e..463455398f1 100644 --- a/src/interfaces/ecpg/pgtypeslib/interval.c +++ b/src/interfaces/ecpg/pgtypeslib/interval.c @@ -6,10 +6,6 @@ #include <math.h> #include <limits.h> -#ifdef __FAST_MATH__ -#error -ffast-math is known to break this code -#endif - #include "common/string.h" #include "dt.h" #include "pgtypes_error.h" diff --git a/src/interfaces/ecpg/pgtypeslib/timestamp.c b/src/interfaces/ecpg/pgtypeslib/timestamp.c index 7cf433266f4..9bf1b914553 100644 --- a/src/interfaces/ecpg/pgtypeslib/timestamp.c +++ b/src/interfaces/ecpg/pgtypeslib/timestamp.c @@ -7,10 +7,6 @@ #include <limits.h> #include <math.h> -#ifdef __FAST_MATH__ -#error -ffast-math is known to break this code -#endif - #include "common/int.h" #include "dt.h" #include "pgtypes_date.h" -- 2.34.1
