Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[flang] Warn when F128 is unsupported #102147

Merged
merged 5 commits into from
Aug 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion flang/include/flang/Tools/TargetSetup.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#include "flang/Evaluate/target.h"
#include "llvm/Target/TargetMachine.h"
#include <cfloat>

namespace Fortran::tools {

Expand All @@ -21,9 +22,25 @@ namespace Fortran::tools {

const llvm::Triple &targetTriple{targetMachine.getTargetTriple()};
// FIXME: Handle real(3) ?
if (targetTriple.getArch() != llvm::Triple::ArchType::x86_64)
if (targetTriple.getArch() != llvm::Triple::ArchType::x86_64) {
targetCharacteristics.DisableType(
Fortran::common::TypeCategory::Real, /*kind=*/10);
}

// Figure out if we can support F128: see
// flang/runtime/Float128Math/math-entries.h
#ifdef FLANG_RUNTIME_F128_MATH_LIB
// we can use libquadmath wrappers
constexpr bool f128Support = true;
#elif LDBL_MANT_DIG == 113
// we can use libm wrappers
constexpr bool f128Support = true;
#else
constexpr bool f128Support = false;
#endif

if constexpr (!f128Support)
targetCharacteristics.DisableType(Fortran::common::TypeCategory::Real, 16);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment as below. Some basic real*16 operations may still work, but math may not. I think it may be too much to disable it all.


targetCharacteristics.set_compilerOptionsString(compilerOptions)
.set_compilerVersionString(compilerVersion);
Expand Down
49 changes: 49 additions & 0 deletions flang/module/ieee_arithmetic.f90
Original file line number Diff line number Diff line change
Expand Up @@ -161,19 +161,33 @@ end function ieee_round_ne
G(1) G(2) G(4) G(8) G(16)
#define SPECIFICS_L(G) \
G(1) G(2) G(4) G(8)

#if FLANG_SUPPORT_R16
#if __x86_64__
#define SPECIFICS_R(G) \
G(2) G(3) G(4) G(8) G(10) G(16)
#else
#define SPECIFICS_R(G) \
G(2) G(3) G(4) G(8) G(16)
#endif
#else
#if __x86_64__
#define SPECIFICS_R(G) \
G(2) G(3) G(4) G(8) G(10)
#else
#define SPECIFICS_R(G) \
G(2) G(3) G(4) G(8)
#endif
#endif

#define SPECIFICS_II(G) \
G(1,1) G(1,2) G(1,4) G(1,8) G(1,16) \
G(2,1) G(2,2) G(2,4) G(2,8) G(2,16) \
G(4,1) G(4,2) G(4,4) G(4,8) G(4,16) \
G(8,1) G(8,2) G(8,4) G(8,8) G(8,16) \
G(16,1) G(16,2) G(16,4) G(16,8) G(16,16)

#if FLANG_SUPPORT_R16
#if __x86_64__
#define SPECIFICS_RI(G) \
G(2,1) G(2,2) G(2,4) G(2,8) G(2,16) \
Expand All @@ -190,7 +204,24 @@ end function ieee_round_ne
G(8,1) G(8,2) G(8,4) G(8,8) G(8,16) \
G(16,1) G(16,2) G(16,4) G(16,8) G(16,16)
#endif
#else
#if __x86_64__
#define SPECIFICS_RI(G) \
G(2,1) G(2,2) G(2,4) G(2,8) \
G(3,1) G(3,2) G(3,4) G(3,8) \
G(4,1) G(4,2) G(4,4) G(4,8) \
G(8,1) G(8,2) G(8,4) G(8,8) \
G(10,1) G(10,2) G(10,4) G(10,8)
#else
#define SPECIFICS_RI(G) \
G(2,1) G(2,2) G(2,4) G(2,8) \
G(3,1) G(3,2) G(3,4) G(3,8) \
G(4,1) G(4,2) G(4,4) G(4,8) \
G(8,1) G(8,2) G(8,4) G(8,8)
#endif
#endif

#if FLANG_SUPPORT_R16
#if __x86_64__
#define SPECIFICS_RR(G) \
G(2,2) G(2,3) G(2,4) G(2,8) G(2,10) G(2,16) \
Expand All @@ -207,6 +238,22 @@ end function ieee_round_ne
G(8,2) G(8,3) G(8,4) G(8,8) G(8,16) \
G(16,2) G(16,3) G(16,4) G(16,8) G(16,16)
#endif
#else
#if __x86_64__
#define SPECIFICS_RR(G) \
G(2,2) G(2,3) G(2,4) G(2,8) G(2,10) \
G(3,2) G(3,3) G(3,4) G(3,8) G(3,10) \
G(4,2) G(4,3) G(4,4) G(4,8) G(4,10) \
G(8,2) G(8,3) G(8,4) G(8,8) G(8,10) \
G(10,2) G(10,3) G(10,4) G(10,8) G(10,10)
#else
#define SPECIFICS_RR(G) \
G(2,2) G(2,3) G(2,4) G(2,8) \
G(3,2) G(3,3) G(3,4) G(3,8) \
G(4,2) G(4,3) G(4,4) G(4,8) \
G(8,2) G(8,3) G(8,4) G(8,8)
#endif
#endif

#define IEEE_CLASS_R(XKIND) \
elemental type(ieee_class_type) function ieee_class_a##XKIND(x); \
Expand Down Expand Up @@ -462,8 +509,10 @@ end function ieee_real_a##AKIND##_i##KKIND;
interface ieee_real
SPECIFICS_I(IEEE_REAL_I)
SPECIFICS_R(IEEE_REAL_R)
#if FLANG_SUPPORT_R16
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe these intrinsics may work for targets where LDBL_MANT_DIG != 113 (e.g. x86). They can be folded by Flang given that libquadmath is linked to the compiler itself. They can also execute in runtime, because they will be lowered to "basic" float128 operations that LLVM backend may support for the target (e.g. x86).

Maybe we can just issue a warning about incomplete real*16 support and do not change the module file?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I disabled these parts of the library when REAL16 is unsupported because we also disable REAL10 on unsupported machines. Is something different about REAL16 that means we should just build with warnings?

SPECIFICS_II(IEEE_REAL_II)
SPECIFICS_RI(IEEE_REAL_RI)
#endif
end interface ieee_real
public :: ieee_real
#undef IEEE_REAL_I
Expand Down
10 changes: 10 additions & 0 deletions flang/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ llvm_canonicalize_cmake_booleans(

set(FLANG_TOOLS_DIR ${FLANG_BINARY_DIR}/bin)

# Check if 128-bit float computations can be done via long double
check_cxx_source_compiles(
"#include <cfloat>
#if LDBL_MANT_DIG != 113
#error LDBL_MANT_DIG != 113
#endif
int main() { return 0; }
"
HAVE_LDBL_MANT_DIG_113)

# FIXME In out-of-tree builds, "SHLIBDIR" is undefined and passing it to
# `configure_lit_site_cfg` leads to a configuration error. This is currently
# only required by plugins/examples, which are not supported in out-of-tree
Expand Down
1 change: 1 addition & 0 deletions flang/test/Evaluate/fold-out_of_range.f90
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
! RUN: %python %S/test_folding.py %s %flang_fc1 -pedantic -triple x86_64-unknown-linux-gnu
! UNSUPPORTED: system-windows
! REQUIRES: target=x86_64{{.*}}
! REQUIRES: flang-supports-f128-math
! Tests folding of OUT_OF_RANGE().
module m
integer(1), parameter :: i1v(*) = [ -huge(1_1) - 1_1, huge(1_1) ]
Expand Down
1 change: 1 addition & 0 deletions flang/test/Evaluate/folding07.f90
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
! REQUIRES: flang-supports-f128-math
! RUN: %python %S/test_folding.py %s %flang_fc1
! Test numeric model inquiry intrinsics

Expand Down
1 change: 1 addition & 0 deletions flang/test/Lower/Intrinsics/ieee_class_queries.f90
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
! REQUIRES: flang-supports-f128-math
! RUN: bbc -emit-fir -o - %s | FileCheck %s

! CHECK-LABEL: func @_QQmain
Expand Down
1 change: 1 addition & 0 deletions flang/test/Lower/Intrinsics/ieee_unordered.f90
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
! REQUIRES: flang-supports-f128-math
! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s

! CHECK-LABEL: func @_QQmain
Expand Down
2 changes: 1 addition & 1 deletion flang/test/Lower/common-block.f90
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
! REQUIRES: flang-supports-f128-math
! RUN: bbc %s -o - | tco | FileCheck %s
! RUN: %flang -emit-llvm -S -mmlir -disable-external-name-interop %s -o - | FileCheck %s

Expand Down Expand Up @@ -78,4 +79,3 @@ subroutine s7()
real(16) r16
common /co1/ r16
end subroutine

1 change: 1 addition & 0 deletions flang/test/Semantics/kinds03.f90
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
! REQUIRES: flang-supports-f128-math
! RUN: %python %S/test_symbols.py %s %flang_fc1
!DEF: /MainProgram1/ipdt DerivedType
!DEF: /MainProgram1/ipdt/k TypeParam INTEGER(4)
Expand Down
1 change: 1 addition & 0 deletions flang/test/Semantics/modfile26.f90
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
! REQUIRES: flang-supports-f128-math
! RUN: %python %S/test_modfile.py %s %flang_fc1
! Intrinsics SELECTED_INT_KIND, SELECTED_REAL_KIND, PRECISION, RANGE,
! RADIX, DIGITS
Expand Down
1 change: 1 addition & 0 deletions flang/test/Semantics/realkinds-aarch64-01.f90
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
! REQUIRES: aarch64-registered-target
! REQUIRES: flang-supports-f128-math
! RUN: %python %S/test_modfile.py %s %flang_fc1 -triple aarch64-unknown-linux-gnu

module m1
Expand Down
3 changes: 2 additions & 1 deletion flang/test/lit.cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,9 @@
# Add features and substitutions to test F128 math support.
# %f128-lib substitution may be used to generate check prefixes
# for LIT tests checking for F128 library support.
if config.flang_runtime_f128_math_lib:
if config.flang_runtime_f128_math_lib or config.have_ldbl_mant_dig_113:
config.available_features.add("flang-supports-f128-math")
if config.flang_runtime_f128_math_lib:
config.available_features.add(
"flang-f128-math-lib-" + config.flang_runtime_f128_math_lib
)
Expand Down
1 change: 1 addition & 0 deletions flang/test/lit.site.cfg.py.in
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ if "openmp" in "@LLVM_ENABLE_RUNTIMES@".lower().split(";"):
else:
config.openmp_module_dir = None
config.flang_runtime_f128_math_lib = "@FLANG_RUNTIME_F128_MATH_LIB@"
config.have_ldbl_mant_dig_113 = "@HAVE_LDBL_MANT_DIG_113@"

import lit.llvm
lit.llvm.initialize(lit_config, config)
Expand Down
25 changes: 24 additions & 1 deletion flang/tools/f18/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,25 @@ set(MODULES_WITHOUT_IMPLEMENTATION

set(MODULES ${MODULES_WITH_IMPLEMENTATION} ${MODULES_WITHOUT_IMPLEMENTATION})

# Check if 128-bit float computations can be done via long double.
check_cxx_source_compiles(
"#include <cfloat>
#if LDBL_MANT_DIG != 113
#error LDBL_MANT_DIG != 113
#endif
int main() { return 0; }
"
HAVE_LDBL_MANT_DIG_113)

# Figure out whether we can support REAL(KIND=16)
if (FLANG_RUNTIME_F128_MATH_LIB)
set(FLANG_SUPPORT_R16 "1")
elseif (HAVE_LDBL_MANT_DIG_113)
set(FLANG_SUPPORT_R16 "1")
else()
set(FLANG_SUPPORT_R16 "0")
endif()

# Init variable to hold extra object files coming from the Fortran modules;
# these module files will be contributed from the CMakeLists in flang/tools/f18.
set(module_objects "")
Expand Down Expand Up @@ -76,6 +95,10 @@ if (NOT CMAKE_CROSSCOMPILING)
endif()
endif()

set(decls "")
if (FLANG_SUPPORT_R16)
set(decls "-DFLANG_SUPPORT_R16")
endif()

# Some modules have an implementation part that needs to be added to the
# FortranRuntime library.
Expand All @@ -92,7 +115,7 @@ if (NOT CMAKE_CROSSCOMPILING)
# TODO: We may need to flag this with conditional, in case Flang is built w/o OpenMP support
add_custom_command(OUTPUT ${base}.mod ${object_output}
COMMAND ${CMAKE_COMMAND} -E make_directory ${FLANG_INTRINSIC_MODULES_DIR}
COMMAND flang-new ${opts} -cpp ${compile_with} -module-dir ${FLANG_INTRINSIC_MODULES_DIR}
COMMAND flang-new ${opts} ${decls} -cpp ${compile_with} -module-dir ${FLANG_INTRINSIC_MODULES_DIR}
${FLANG_SOURCE_DIR}/module/${filename}.f90
DEPENDS flang-new ${FLANG_SOURCE_DIR}/module/${filename}.f90 ${FLANG_SOURCE_DIR}/module/__fortran_builtins.f90 ${depends}
)
Expand Down
Loading