From c2e413b77ea5432de1bef665f0b888f5544107eb Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Mon, 5 Oct 2026 22:11:25 +0200 Subject: [PATCH 01/10] Use F2003 ieee_arithmetic module instead of live division-by-zero (Reference-LAPACK PR 1168) --- lapack-netlib/SRC/ieeeck.f | 95 +++----------------------------------- 1 file changed, 7 insertions(+), 88 deletions(-) diff --git a/lapack-netlib/SRC/ieeeck.f b/lapack-netlib/SRC/ieeeck.f index f9f6332ecf..d62415f3c5 100644 --- a/lapack-netlib/SRC/ieeeck.f +++ b/lapack-netlib/SRC/ieeeck.f @@ -5,7 +5,6 @@ * Online html documentation available at * http://www.netlib.org/lapack/explore-html/ * -*> \htmlonly *> Download IEEECK + dependencies *> *> [TGZ] @@ -13,7 +12,6 @@ *> [ZIP] *> *> [TXT] -*> \endhtmlonly * * Definition: * =========== @@ -75,10 +73,14 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup OTHERauxiliary +*> \ingroup ieeeck * * ===================================================================== INTEGER FUNCTION IEEECK( ISPEC, ZERO, ONE ) + USE, INTRINSIC :: IEEE_ARITHMETIC, ONLY: + & IEEE_SUPPORT_INF, + & IEEE_SUPPORT_NAN + IMPLICIT NONE * * -- LAPACK auxiliary routine -- * -- LAPACK is a software package provided by Univ. of Tennessee, -- @@ -91,57 +93,11 @@ INTEGER FUNCTION IEEECK( ISPEC, ZERO, ONE ) * * ===================================================================== * -* .. Local Scalars .. - REAL NAN1, NAN2, NAN3, NAN4, NAN5, NAN6, NEGINF, - $ NEGZRO, NEWZRO, POSINF * .. * .. Executable Statements .. IEEECK = 1 * - POSINF = ONE / ZERO - IF( POSINF.LE.ONE ) THEN - IEEECK = 0 - RETURN - END IF -* - NEGINF = -ONE / ZERO - IF( NEGINF.GE.ZERO ) THEN - IEEECK = 0 - RETURN - END IF -* - NEGZRO = ONE / ( NEGINF+ONE ) - IF( NEGZRO.NE.ZERO ) THEN - IEEECK = 0 - RETURN - END IF -* - NEGINF = ONE / NEGZRO - IF( NEGINF.GE.ZERO ) THEN - IEEECK = 0 - RETURN - END IF -* - NEWZRO = NEGZRO + ZERO - IF( NEWZRO.NE.ZERO ) THEN - IEEECK = 0 - RETURN - END IF -* - POSINF = ONE / NEWZRO - IF( POSINF.LE.ONE ) THEN - IEEECK = 0 - RETURN - END IF -* - NEGINF = NEGINF*POSINF - IF( NEGINF.GE.ZERO ) THEN - IEEECK = 0 - RETURN - END IF -* - POSINF = POSINF*POSINF - IF( POSINF.LE.ONE ) THEN + IF ( .NOT.IEEE_SUPPORT_INF(ONE) ) THEN IEEECK = 0 RETURN END IF @@ -154,44 +110,7 @@ INTEGER FUNCTION IEEECK( ISPEC, ZERO, ONE ) IF( ISPEC.EQ.0 ) $ RETURN * - NAN1 = POSINF + NEGINF -* - NAN2 = POSINF / NEGINF -* - NAN3 = POSINF / POSINF -* - NAN4 = POSINF*ZERO -* - NAN5 = NEGINF*NEGZRO -* - NAN6 = NAN5*ZERO -* - IF( NAN1.EQ.NAN1 ) THEN - IEEECK = 0 - RETURN - END IF -* - IF( NAN2.EQ.NAN2 ) THEN - IEEECK = 0 - RETURN - END IF -* - IF( NAN3.EQ.NAN3 ) THEN - IEEECK = 0 - RETURN - END IF -* - IF( NAN4.EQ.NAN4 ) THEN - IEEECK = 0 - RETURN - END IF -* - IF( NAN5.EQ.NAN5 ) THEN - IEEECK = 0 - RETURN - END IF -* - IF( NAN6.EQ.NAN6 ) THEN + IF( .NOT.IEEE_SUPPORT_NAN(ONE) ) THEN IEEECK = 0 RETURN END IF From 1a30725dac9c942acc5ba4bf4dfe5c2e19d38406 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Tue, 6 Oct 2026 17:56:48 +0200 Subject: [PATCH 02/10] Move the old, pre-F2003 ieeeck.f to DEPRECATED --- lapack-netlib/SRC/DEPRECATED/ieeeck.f | 200 ++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 lapack-netlib/SRC/DEPRECATED/ieeeck.f diff --git a/lapack-netlib/SRC/DEPRECATED/ieeeck.f b/lapack-netlib/SRC/DEPRECATED/ieeeck.f new file mode 100644 index 0000000000..f9f6332ecf --- /dev/null +++ b/lapack-netlib/SRC/DEPRECATED/ieeeck.f @@ -0,0 +1,200 @@ +*> \brief \b IEEECK +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download IEEECK + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* INTEGER FUNCTION IEEECK( ISPEC, ZERO, ONE ) +* +* .. Scalar Arguments .. +* INTEGER ISPEC +* REAL ONE, ZERO +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> IEEECK is called from the ILAENV to verify that Infinity and +*> possibly NaN arithmetic is safe (i.e. will not trap). +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] ISPEC +*> \verbatim +*> ISPEC is INTEGER +*> Specifies whether to test just for infinity arithmetic +*> or whether to test for infinity and NaN arithmetic. +*> = 0: Verify infinity arithmetic only. +*> = 1: Verify infinity and NaN arithmetic. +*> \endverbatim +*> +*> \param[in] ZERO +*> \verbatim +*> ZERO is REAL +*> Must contain the value 0.0 +*> This is passed to prevent the compiler from optimizing +*> away this code. +*> \endverbatim +*> +*> \param[in] ONE +*> \verbatim +*> ONE is REAL +*> Must contain the value 1.0 +*> This is passed to prevent the compiler from optimizing +*> away this code. +*> +*> RETURN VALUE: INTEGER +*> = 0: Arithmetic failed to produce the correct answers +*> = 1: Arithmetic produced the correct answers +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \ingroup OTHERauxiliary +* +* ===================================================================== + INTEGER FUNCTION IEEECK( ISPEC, ZERO, ONE ) +* +* -- LAPACK auxiliary routine -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* +* .. Scalar Arguments .. + INTEGER ISPEC + REAL ONE, ZERO +* .. +* +* ===================================================================== +* +* .. Local Scalars .. + REAL NAN1, NAN2, NAN3, NAN4, NAN5, NAN6, NEGINF, + $ NEGZRO, NEWZRO, POSINF +* .. +* .. Executable Statements .. + IEEECK = 1 +* + POSINF = ONE / ZERO + IF( POSINF.LE.ONE ) THEN + IEEECK = 0 + RETURN + END IF +* + NEGINF = -ONE / ZERO + IF( NEGINF.GE.ZERO ) THEN + IEEECK = 0 + RETURN + END IF +* + NEGZRO = ONE / ( NEGINF+ONE ) + IF( NEGZRO.NE.ZERO ) THEN + IEEECK = 0 + RETURN + END IF +* + NEGINF = ONE / NEGZRO + IF( NEGINF.GE.ZERO ) THEN + IEEECK = 0 + RETURN + END IF +* + NEWZRO = NEGZRO + ZERO + IF( NEWZRO.NE.ZERO ) THEN + IEEECK = 0 + RETURN + END IF +* + POSINF = ONE / NEWZRO + IF( POSINF.LE.ONE ) THEN + IEEECK = 0 + RETURN + END IF +* + NEGINF = NEGINF*POSINF + IF( NEGINF.GE.ZERO ) THEN + IEEECK = 0 + RETURN + END IF +* + POSINF = POSINF*POSINF + IF( POSINF.LE.ONE ) THEN + IEEECK = 0 + RETURN + END IF +* +* +* +* +* Return if we were only asked to check infinity arithmetic +* + IF( ISPEC.EQ.0 ) + $ RETURN +* + NAN1 = POSINF + NEGINF +* + NAN2 = POSINF / NEGINF +* + NAN3 = POSINF / POSINF +* + NAN4 = POSINF*ZERO +* + NAN5 = NEGINF*NEGZRO +* + NAN6 = NAN5*ZERO +* + IF( NAN1.EQ.NAN1 ) THEN + IEEECK = 0 + RETURN + END IF +* + IF( NAN2.EQ.NAN2 ) THEN + IEEECK = 0 + RETURN + END IF +* + IF( NAN3.EQ.NAN3 ) THEN + IEEECK = 0 + RETURN + END IF +* + IF( NAN4.EQ.NAN4 ) THEN + IEEECK = 0 + RETURN + END IF +* + IF( NAN5.EQ.NAN5 ) THEN + IEEECK = 0 + RETURN + END IF +* + IF( NAN6.EQ.NAN6 ) THEN + IEEECK = 0 + RETURN + END IF +* + RETURN + END From 24584df7fe1b6083e44e1cc1da7a977220d52b3d Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Tue, 6 Oct 2026 17:58:48 +0200 Subject: [PATCH 03/10] Conditionally compile the old or new ieeeck.f --- lapack-netlib/SRC/Makefile | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/lapack-netlib/SRC/Makefile b/lapack-netlib/SRC/Makefile index 5abcae99f5..91694e1336 100644 --- a/lapack-netlib/SRC/Makefile +++ b/lapack-netlib/SRC/Makefile @@ -79,11 +79,37 @@ else $(CC) $(filter-out -fvisibility=hidden, $(CFLAGS)) -c -o $@ $< endif -ALLAUX_O = ilaenv.o ilaenv2stage.o ieeeck.o lsamen.o xerbla.o xerbla_array.o \ +ALLAUX_O = ilaenv.o ilaenv2stage.o lsamen.o xerbla.o xerbla_array.o \ iparmq.o iparam2stage.o \ ilaprec.o ilatrans.o ilauplo.o iladiag.o chla_transtype.o la_xisnan.o \ ../INSTALL/ilaver.o ../INSTALL/lsame.o ../INSTALL/slamch.o +ifneq ($(C_LAPACK), 1) + ifeq($(F_COMPILER), GFORTRAN) + FCVERSIONGT4 := $(shell expr `$(FC) -dumpversion | cut -f1 -d.` \> 4) + ifeq ($(FCVERSIONGT4), 1) + ALLAUX_O += DEPRECATED/ieeeck.o + else + OLDBSD=0 + ifeq($(OSNAME), FreeBSD) + OLDBSD=$(shell expr `uname -r | cut -f1 -d.` \>= 16) + ifneq ($(ARCH), $(filter $(ARCH),arm arm64 power)) + OLDBSD=0 + endif + endif + ifeq ($(OLDBSD), 1) + ALLAUX_O += DEPRECATED/ieeeck.o + else + ALLAUX_O += ieeeck.o + endif + endif +else +ALLAUX_O += ieeeck.o +endif +else +ALLAUX_O += ieeeck.o +endif + ifneq "$(or $(BUILD_SINGLE),$(BUILD_COMPLEX))" "" SCLAUX_O = la_constants.o \ sbdsvdx.o sstevx.o sstein.o \ From 8470e8a2c3d56246ed69cb248dc1c1daceab8300 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Tue, 6 Oct 2026 20:05:51 +0200 Subject: [PATCH 04/10] Fix missing space after ifeq --- lapack-netlib/SRC/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lapack-netlib/SRC/Makefile b/lapack-netlib/SRC/Makefile index 91694e1336..ad19816c2c 100644 --- a/lapack-netlib/SRC/Makefile +++ b/lapack-netlib/SRC/Makefile @@ -85,13 +85,13 @@ ALLAUX_O = ilaenv.o ilaenv2stage.o lsamen.o xerbla.o xerbla_array.o \ ../INSTALL/ilaver.o ../INSTALL/lsame.o ../INSTALL/slamch.o ifneq ($(C_LAPACK), 1) - ifeq($(F_COMPILER), GFORTRAN) + ifeq ($(F_COMPILER), GFORTRAN) FCVERSIONGT4 := $(shell expr `$(FC) -dumpversion | cut -f1 -d.` \> 4) ifeq ($(FCVERSIONGT4), 1) ALLAUX_O += DEPRECATED/ieeeck.o else OLDBSD=0 - ifeq($(OSNAME), FreeBSD) + ifeq ($(OSNAME), FreeBSD) OLDBSD=$(shell expr `uname -r | cut -f1 -d.` \>= 16) ifneq ($(ARCH), $(filter $(ARCH),arm arm64 power)) OLDBSD=0 From 856ef291db90ef58a3a8acbbbb3fbb6d5e200ede Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Tue, 6 Oct 2026 21:04:24 +0200 Subject: [PATCH 05/10] Invert conditional --- lapack-netlib/SRC/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lapack-netlib/SRC/Makefile b/lapack-netlib/SRC/Makefile index ad19816c2c..673fa1ec25 100644 --- a/lapack-netlib/SRC/Makefile +++ b/lapack-netlib/SRC/Makefile @@ -87,7 +87,7 @@ ALLAUX_O = ilaenv.o ilaenv2stage.o lsamen.o xerbla.o xerbla_array.o \ ifneq ($(C_LAPACK), 1) ifeq ($(F_COMPILER), GFORTRAN) FCVERSIONGT4 := $(shell expr `$(FC) -dumpversion | cut -f1 -d.` \> 4) - ifeq ($(FCVERSIONGT4), 1) + ifneq ($(FCVERSIONGT4), 1) ALLAUX_O += DEPRECATED/ieeeck.o else OLDBSD=0 From 9228350ff4ce348b2ab6ff328709f1ef741b1c2a Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Wed, 7 Oct 2026 10:14:57 +0200 Subject: [PATCH 06/10] Fix BSD version check --- lapack-netlib/SRC/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lapack-netlib/SRC/Makefile b/lapack-netlib/SRC/Makefile index 673fa1ec25..7f04542556 100644 --- a/lapack-netlib/SRC/Makefile +++ b/lapack-netlib/SRC/Makefile @@ -92,7 +92,7 @@ ifneq ($(C_LAPACK), 1) else OLDBSD=0 ifeq ($(OSNAME), FreeBSD) - OLDBSD=$(shell expr `uname -r | cut -f1 -d.` \>= 16) + OLDBSD=$(shell expr `uname -r | cut -f1 -d.` \<= 15) ifneq ($(ARCH), $(filter $(ARCH),arm arm64 power)) OLDBSD=0 endif From e00d90a040ab71fdb905e3974cf0b96c620439d3 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Wed, 7 Oct 2026 18:06:25 +0200 Subject: [PATCH 07/10] Conditionally compile the new F2003 ieeeck or its deprecated earlier version --- cmake/lapack.cmake | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cmake/lapack.cmake b/cmake/lapack.cmake index ab98c93648..8f71948dce 100644 --- a/cmake/lapack.cmake +++ b/cmake/lapack.cmake @@ -1,11 +1,21 @@ # Sources for compiling lapack-netlib. Can't use CMakeLists.txt because lapack-netlib already has its own cmake files. if (NOT C_LAPACK) message (STATUS "fortran lapack") -set(ALLAUX ilaenv.f ilaenv2stage.f ieeeck.f lsamen.f iparmq.f iparam2stage.F +set(ALLAUX ilaenv.f ilaenv2stage.f lsamen.f iparmq.f iparam2stage.F ilaprec.f ilatrans.f ilauplo.f iladiag.f chla_transtype.f dlaset.f la_xisnan.F90 ../INSTALL/ilaver.f xerbla_array.f ../INSTALL/slamch.f) +if (${CMAKE_Fortran_COMPILER} MATCHES GFORTRAN) +if (${CMAKE_Fortran_COMPILER_VERSION} VERSION_LESS 5.0) OR (${CMAKE_SYSTEM_NAME} MATCHES FreeBSD AND ${CMAKE_SYSTEM_VERSION} VERSION_LESS 16.0 AND ${CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86|x86_64)") + set (ALLAUX "${ALLAUX} DEPRECATED/ieeeck.f") +else + set (ALLAUX "${ALLAUX} ieeeck.f") +endif +else + set (ALLAUX "${ALLAUX} ieeeck.f") +endif + set(SCLAUX scombssq.f sbdsvdx.f sstevx.f sstein.f la_constants.f90 From c3c0db8f7a6d011a72f0b3f8a24cae53cbf1fbe7 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Wed, 7 Oct 2026 19:10:47 +0200 Subject: [PATCH 08/10] fix missing braces --- cmake/lapack.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/lapack.cmake b/cmake/lapack.cmake index 8f71948dce..cdb642ea67 100644 --- a/cmake/lapack.cmake +++ b/cmake/lapack.cmake @@ -7,7 +7,7 @@ set(ALLAUX ilaenv.f ilaenv2stage.f lsamen.f iparmq.f iparam2stage.F ../INSTALL/slamch.f) if (${CMAKE_Fortran_COMPILER} MATCHES GFORTRAN) -if (${CMAKE_Fortran_COMPILER_VERSION} VERSION_LESS 5.0) OR (${CMAKE_SYSTEM_NAME} MATCHES FreeBSD AND ${CMAKE_SYSTEM_VERSION} VERSION_LESS 16.0 AND ${CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86|x86_64)") +if ((${CMAKE_Fortran_COMPILER_VERSION} VERSION_LESS 5.0) OR (${CMAKE_SYSTEM_NAME} MATCHES FreeBSD AND ${CMAKE_SYSTEM_VERSION} VERSION_LESS 16.0 AND ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(x86|x86_64)")) set (ALLAUX "${ALLAUX} DEPRECATED/ieeeck.f") else set (ALLAUX "${ALLAUX} ieeeck.f") From 20dc5e0b2ada9d740988fc428cc4e3d5bad8af3c Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Wed, 7 Oct 2026 19:15:18 +0200 Subject: [PATCH 09/10] Update lapack.cmake --- cmake/lapack.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/lapack.cmake b/cmake/lapack.cmake index cdb642ea67..4f2c39af80 100644 --- a/cmake/lapack.cmake +++ b/cmake/lapack.cmake @@ -9,12 +9,12 @@ set(ALLAUX ilaenv.f ilaenv2stage.f lsamen.f iparmq.f iparam2stage.F if (${CMAKE_Fortran_COMPILER} MATCHES GFORTRAN) if ((${CMAKE_Fortran_COMPILER_VERSION} VERSION_LESS 5.0) OR (${CMAKE_SYSTEM_NAME} MATCHES FreeBSD AND ${CMAKE_SYSTEM_VERSION} VERSION_LESS 16.0 AND ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(x86|x86_64)")) set (ALLAUX "${ALLAUX} DEPRECATED/ieeeck.f") -else +else() set (ALLAUX "${ALLAUX} ieeeck.f") -endif -else +endif() +else() set (ALLAUX "${ALLAUX} ieeeck.f") -endif +endif() set(SCLAUX scombssq.f sbdsvdx.f sstevx.f sstein.f From cdade2dee2760b2ffbec3ec78ff6f6254a25d511 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Wed, 7 Oct 2026 21:07:18 +0200 Subject: [PATCH 10/10] Use list append --- cmake/lapack.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/lapack.cmake b/cmake/lapack.cmake index 4f2c39af80..47289d5744 100644 --- a/cmake/lapack.cmake +++ b/cmake/lapack.cmake @@ -8,12 +8,12 @@ set(ALLAUX ilaenv.f ilaenv2stage.f lsamen.f iparmq.f iparam2stage.F if (${CMAKE_Fortran_COMPILER} MATCHES GFORTRAN) if ((${CMAKE_Fortran_COMPILER_VERSION} VERSION_LESS 5.0) OR (${CMAKE_SYSTEM_NAME} MATCHES FreeBSD AND ${CMAKE_SYSTEM_VERSION} VERSION_LESS 16.0 AND ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(x86|x86_64)")) - set (ALLAUX "${ALLAUX} DEPRECATED/ieeeck.f") + list (APPEND ALLAUX DEPRECATED/ieeeck.f) else() - set (ALLAUX "${ALLAUX} ieeeck.f") + list (APPEND ALLAUX ieeeck.f) endif() else() - set (ALLAUX "${ALLAUX} ieeeck.f") + list (APPEND ALLAUX ieeeck.f) endif() set(SCLAUX