https://github.com/zahiraam updated https://github.com/llvm/llvm-project/pull/97342
>From aea6519809340024226d587303e26c800c1a3756 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Mon, 1 Jul 2024 12:56:07 -0700 Subject: [PATCH 01/15] [NFC] Add assertion to ensure that FiniteMathOnly toggles with the values of HonorINFs and HonorNANs. --- clang/include/clang/Basic/LangOptions.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index 91f1c2f2e6239..e866902743d2d 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -816,6 +816,11 @@ class FPOptions { setAllowFPReassociate(LO.AllowFPReassoc); setNoHonorNaNs(LO.NoHonorNaNs); setNoHonorInfs(LO.NoHonorInfs); + // Ensure that if FiniteMathOnly is enabled, NoHonorNaNs and NoHonorInfs are + // also enabled. This is because FiniteMathOnly mode assumes no NaNs or Infs + // are present in computations. + if (!LO.NoHonorInfs || !LO.NoHonorInfs) + assert(!LO.FiniteMathOnly && "FiniteMathOnly implies NoHonorInfs"); setNoSignedZero(LO.NoSignedZero); setAllowReciprocal(LO.AllowRecip); setAllowApproxFunc(LO.ApproxFunc); >From 3a6cc060a0b91e2d960ea92a1d307a0bae3893f4 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Mon, 8 Jul 2024 13:42:57 -0700 Subject: [PATCH 02/15] Fixed assertion as recommeded by reviwer and fix LIT tests. --- clang/include/clang/Basic/LangOptions.h | 4 ++-- clang/lib/Driver/ToolChains/Clang.cpp | 12 +++++++++++- clang/test/CodeGen/fp-floatcontrol-stack.cpp | 2 +- clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp | 9 +++++---- clang/test/Sema/warn-infinity-nan-disabled-win.cpp | 9 +++++---- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index e866902743d2d..e1adcb3a95f18 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -819,8 +819,8 @@ class FPOptions { // Ensure that if FiniteMathOnly is enabled, NoHonorNaNs and NoHonorInfs are // also enabled. This is because FiniteMathOnly mode assumes no NaNs or Infs // are present in computations. - if (!LO.NoHonorInfs || !LO.NoHonorInfs) - assert(!LO.FiniteMathOnly && "FiniteMathOnly implies NoHonorInfs"); + assert((LO.FiniteMathOnly == (LO.NoHonorInfs && LO.NoHonorNaNs)) && + "inf/nan inconsistent internal state"); setNoSignedZero(LO.NoSignedZero); setAllowReciprocal(LO.AllowRecip); setAllowApproxFunc(LO.ApproxFunc); diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index aa285c39f14b4..1b799fb31bb7f 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3295,7 +3295,17 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, } // Handle __FINITE_MATH_ONLY__ similarly. - if (!HonorINFs && !HonorNaNs) + bool InfValues, NanValues = true; + auto processArg = [&](const auto *Arg) { + if (StringRef(Arg->getValue()) == "-menable-no-nans") + NanValues = false; + if (StringRef(Arg->getValue()) == "-menable-no-infs") + InfValues = false; + }; + for (auto *Arg : Args.filtered(options::OPT_Xclang)) { + processArg(Arg); + } + if ((!HonorINFs && !HonorNaNs) || (!NanValues && !InfValues)) CmdArgs.push_back("-ffinite-math-only"); if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) { diff --git a/clang/test/CodeGen/fp-floatcontrol-stack.cpp b/clang/test/CodeGen/fp-floatcontrol-stack.cpp index 090da25d21207..237c9d4f9a37e 100644 --- a/clang/test/CodeGen/fp-floatcontrol-stack.cpp +++ b/clang/test/CodeGen/fp-floatcontrol-stack.cpp @@ -1,7 +1,7 @@ // RUN: %clang_cc1 -triple x86_64-linux-gnu -ffp-contract=on -DDEFAULT=1 -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-DDEFAULT %s // RUN: %clang_cc1 -triple x86_64-linux-gnu -ffp-contract=on -DEBSTRICT=1 -ffp-exception-behavior=strict -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-DEBSTRICT %s // RUN: %clang_cc1 -triple x86_64-linux-gnu -DFAST=1 -ffast-math -ffp-contract=fast -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-FAST %s -// RUN: %clang_cc1 -triple x86_64-linux-gnu -ffp-contract=on -DNOHONOR=1 -menable-no-infs -menable-no-nans -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-NOHONOR %s +// RUN: %clang_cc1 -triple x86_64-linux-gnu -ffp-contract=on -DNOHONOR=1 -ffinite-math-only -menable-no-infs -menable-no-nans -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-NOHONOR %s #define FUN(n) \ (float z) { return n * z + n; } diff --git a/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp b/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp index 03a432e05851d..a4ba1fd0c97d3 100644 --- a/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp +++ b/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp @@ -1,10 +1,11 @@ // RUN: %clang_cc1 -x c++ -verify=no-inf-no-nan \ -// RUN: -triple powerpc64le-unknown-unknown %s -menable-no-infs \ -// RUN: -menable-no-nans -std=c++23 +// RUN: -triple powerpc64le-unknown-unknown %s -ffinite-math-only \ +// RUN: -menable-no-infs -menable-no-nans -std=c++23 // RUN: %clang_cc1 -x c++ -verify=no-inf-no-nan \ -// RUN: -triple powerpc64le-unknown-unknown %s -menable-no-infs \ -// RUN: -menable-no-nans -funsafe-math-optimizations -std=c++23 +// RUN: -triple powerpc64le-unknown-unknown %s -ffinite-math-only \ +// RUN: -menable-no-infs -menable-no-nans -funsafe-math-optimizations \ +// RUN: -std=c++23 // RUN: %clang_cc1 -x c++ -verify=no-fast -triple powerpc64le-unknown-unknown \ // RUN: %s -std=c++23 diff --git a/clang/test/Sema/warn-infinity-nan-disabled-win.cpp b/clang/test/Sema/warn-infinity-nan-disabled-win.cpp index 51f9d325619ba..9248ee4c2e72a 100644 --- a/clang/test/Sema/warn-infinity-nan-disabled-win.cpp +++ b/clang/test/Sema/warn-infinity-nan-disabled-win.cpp @@ -2,12 +2,13 @@ // on Windows the NAN macro is defined using INFINITY. See below. // RUN: %clang_cc1 -x c++ -verify=no-inf-no-nan \ -// RUN: -triple powerpc64le-unknown-unknown %s -menable-no-infs \ -// RUN: -menable-no-nans -std=c++23 +// RUN: -triple powerpc64le-unknown-unknown %s -ffinite-math-only \ +// RUN: -menable-no-infs -menable-no-nans -std=c++23 // RUN: %clang_cc1 -x c++ -verify=no-inf-no-nan \ -// RUN: -triple powerpc64le-unknown-unknown %s -menable-no-infs \ -// RUN: -menable-no-nans -funsafe-math-optimizations -std=c++23 +// RUN: -triple powerpc64le-unknown-unknown %s -ffinite-math-only \ +// RUN: -menable-no-infs -menable-no-nans -funsafe-math-optimizations \ +// RUN: -std=c++23 // RUN: %clang_cc1 -x c++ -verify=no-fast -triple powerpc64le-unknown-unknown \ // RUN: %s -std=c++23 >From 1363e32f3d119f1e23911704325126edc6ddddaf Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Tue, 9 Jul 2024 12:17:16 -0700 Subject: [PATCH 03/15] Removed FiniteMathOnly and fixed LIT tests. --- clang/lib/Driver/ToolChains/Clang.cpp | 2 +- clang/lib/Frontend/InitPreprocessor.cpp | 2 +- clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp | 8 ++++---- clang/test/Sema/warn-infinity-nan-disabled-win.cpp | 7 +++---- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 1b799fb31bb7f..65257e3c4c9d9 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3305,7 +3305,7 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, for (auto *Arg : Args.filtered(options::OPT_Xclang)) { processArg(Arg); } - if ((!HonorINFs && !HonorNaNs) || (!NanValues && !InfValues)) + if ((!HonorINFs && !HonorNaNs) || (!NanValues && !InfValues)) CmdArgs.push_back("-ffinite-math-only"); if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) { diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 5e52555c6fee9..e7e02e9ddf96e 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -1311,7 +1311,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI, if (!LangOpts.MathErrno) Builder.defineMacro("__NO_MATH_ERRNO__"); - if (LangOpts.FastMath || LangOpts.FiniteMathOnly) + if (LangOpts.FastMath || (LangOpts.NoHonorInfs && LangOpts.NoHonorNaNs)) Builder.defineMacro("__FINITE_MATH_ONLY__", "1"); else Builder.defineMacro("__FINITE_MATH_ONLY__", "0"); diff --git a/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp b/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp index a4ba1fd0c97d3..cb719c3a519da 100644 --- a/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp +++ b/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp @@ -1,10 +1,10 @@ // RUN: %clang_cc1 -x c++ -verify=no-inf-no-nan \ -// RUN: -triple powerpc64le-unknown-unknown %s -ffinite-math-only \ -// RUN: -menable-no-infs -menable-no-nans -std=c++23 +// RUN: -triple powerpc64le-unknown-unknown %s \ +// RUN: -ffinite-math-only -std=c++23 // RUN: %clang_cc1 -x c++ -verify=no-inf-no-nan \ -// RUN: -triple powerpc64le-unknown-unknown %s -ffinite-math-only \ -// RUN: -menable-no-infs -menable-no-nans -funsafe-math-optimizations \ +// RUN: -triple powerpc64le-unknown-unknown %s \ +// RUN: -ffinite-math-only -funsafe-math-optimizations \ // RUN: -std=c++23 // RUN: %clang_cc1 -x c++ -verify=no-fast -triple powerpc64le-unknown-unknown \ diff --git a/clang/test/Sema/warn-infinity-nan-disabled-win.cpp b/clang/test/Sema/warn-infinity-nan-disabled-win.cpp index 9248ee4c2e72a..4bf3355926634 100644 --- a/clang/test/Sema/warn-infinity-nan-disabled-win.cpp +++ b/clang/test/Sema/warn-infinity-nan-disabled-win.cpp @@ -2,12 +2,11 @@ // on Windows the NAN macro is defined using INFINITY. See below. // RUN: %clang_cc1 -x c++ -verify=no-inf-no-nan \ -// RUN: -triple powerpc64le-unknown-unknown %s -ffinite-math-only \ -// RUN: -menable-no-infs -menable-no-nans -std=c++23 +// RUN: -triple powerpc64le-unknown-unknown %s -ffinite-math-only -std=c++23 // RUN: %clang_cc1 -x c++ -verify=no-inf-no-nan \ -// RUN: -triple powerpc64le-unknown-unknown %s -ffinite-math-only \ -// RUN: -menable-no-infs -menable-no-nans -funsafe-math-optimizations \ +// RUN: -triple powerpc64le-unknown-unknown %s \ +// RUN: -ffinite-math-only -funsafe-math-optimizations \ // RUN: -std=c++23 // RUN: %clang_cc1 -x c++ -verify=no-fast -triple powerpc64le-unknown-unknown \ >From 81f66be65f82727274ca47e0b05cfcc25bcf8942 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Thu, 11 Jul 2024 06:47:34 -0700 Subject: [PATCH 04/15] Remove FiniteMathOnly. --- clang/include/clang/Basic/LangOptions.def | 2 -- clang/include/clang/Basic/LangOptions.h | 5 ----- clang/include/clang/Driver/Options.td | 12 +++++------- clang/lib/Basic/LangOptions.cpp | 4 ++-- clang/lib/Basic/Targets/OSTargets.cpp | 7 ++++--- clang/test/CodeGen/finite-math.c | 2 +- clang/test/CodeGen/fp-options-to-fast-math-flags.c | 2 +- clang/test/CodeGen/nofpclass.c | 4 ++-- clang/test/CodeGenOpenCL/relaxed-fpmath.cl | 4 ++-- clang/test/Headers/float.c | 2 +- clang/test/Preprocessor/predefined-macros.c | 4 ++-- 11 files changed, 20 insertions(+), 28 deletions(-) diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 491759e2fcdbb..8939a4b4b1698 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -220,7 +220,6 @@ COMPATIBLE_LANGOPT(GNUInline , 1, 0, "GNU inline semantics") COMPATIBLE_LANGOPT(NoInlineDefine , 1, 0, "__NO_INLINE__ predefined macro") COMPATIBLE_LANGOPT(Deprecated , 1, 0, "__DEPRECATED predefined macro") COMPATIBLE_LANGOPT(FastMath , 1, 0, "fast FP math optimizations, and __FAST_MATH__ predefined macro") -COMPATIBLE_LANGOPT(FiniteMathOnly , 1, 0, "__FINITE_MATH_ONLY__ predefined macro") COMPATIBLE_LANGOPT(UnsafeFPMath , 1, 0, "Unsafe Floating Point Math") COMPATIBLE_LANGOPT(ProtectParens , 1, 0, "optimizer honors parentheses " "when floating-point expressions are evaluated") @@ -336,7 +335,6 @@ LANGOPT(SinglePrecisionConstants , 1, 0, "treating double-precision floating poi LANGOPT(FastRelaxedMath , 1, 0, "OpenCL fast relaxed math") BENIGN_LANGOPT(CLNoSignedZero , 1, 0, "Permit Floating Point optimization without regard to signed zeros") COMPATIBLE_LANGOPT(CLUnsafeMath , 1, 0, "Unsafe Floating Point Math") -COMPATIBLE_LANGOPT(CLFiniteMathOnly , 1, 0, "__FINITE_MATH_ONLY__ predefined macro") /// FP_CONTRACT mode (on/off/fast). BENIGN_ENUM_LANGOPT(DefaultFPContractMode, FPModeKind, 2, FPM_Off, "FP contraction type") COMPATIBLE_LANGOPT(ExpStrictFP, 1, false, "Enable experimental strict floating point") diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index e1adcb3a95f18..91f1c2f2e6239 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -816,11 +816,6 @@ class FPOptions { setAllowFPReassociate(LO.AllowFPReassoc); setNoHonorNaNs(LO.NoHonorNaNs); setNoHonorInfs(LO.NoHonorInfs); - // Ensure that if FiniteMathOnly is enabled, NoHonorNaNs and NoHonorInfs are - // also enabled. This is because FiniteMathOnly mode assumes no NaNs or Infs - // are present in computations. - assert((LO.FiniteMathOnly == (LO.NoHonorInfs && LO.NoHonorNaNs)) && - "inf/nan inconsistent internal state"); setNoSignedZero(LO.NoSignedZero); setAllowReciprocal(LO.AllowRecip); setAllowApproxFunc(LO.ApproxFunc); diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 58ca6f2bea9e4..1e1ba90b72deb 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1115,8 +1115,7 @@ def cl_single_precision_constant : Flag<["-"], "cl-single-precision-constant">, MarshallingInfoFlag<LangOpts<"SinglePrecisionConstants">>; def cl_finite_math_only : Flag<["-"], "cl-finite-math-only">, Group<opencl_Group>, Visibility<[ClangOption, CC1Option]>, - HelpText<"OpenCL only. Allow floating-point optimizations that assume arguments and results are not NaNs or +-Inf.">, - MarshallingInfoFlag<LangOpts<"CLFiniteMathOnly">>; + HelpText<"OpenCL only. Allow floating-point optimizations that assume arguments and results are not NaNs or +-Inf.">; def cl_kernel_arg_info : Flag<["-"], "cl-kernel-arg-info">, Group<opencl_Group>, Visibility<[ClangOption, CC1Option]>, HelpText<"OpenCL only. Generate kernel argument metadata.">, @@ -2598,13 +2597,12 @@ defm approx_func : BoolFOption<"approx-func", LangOpts<"ApproxFunc">, DefaultFal "with an approximately equivalent calculation", [funsafe_math_optimizations.KeyPath]>, NegFlag<SetFalse, [], [ClangOption, CC1Option, FC1Option, FlangOption]>>; -defm finite_math_only : BoolFOption<"finite-math-only", - LangOpts<"FiniteMathOnly">, DefaultFalse, +defm finite_math_only : BoolOptionWithoutMarshalling<"f", "finite-math-only", PosFlag<SetTrue, [], [ClangOption, CC1Option], "Allow floating-point optimizations that " "assume arguments and results are not NaNs or +-inf. This defines " "the \\_\\_FINITE\\_MATH\\_ONLY\\_\\_ preprocessor macro.", - [cl_finite_math_only.KeyPath, ffast_math.KeyPath]>, + [ffast_math.KeyPath]>, NegFlag<SetFalse>>; defm signed_zeros : BoolFOption<"signed-zeros", LangOpts<"NoSignedZero">, DefaultFalse, @@ -7740,10 +7738,10 @@ def mreassociate : Flag<["-"], "mreassociate">, MarshallingInfoFlag<LangOpts<"AllowFPReassoc">>, ImpliedByAnyOf<[funsafe_math_optimizations.KeyPath]>; def menable_no_nans : Flag<["-"], "menable-no-nans">, HelpText<"Allow optimization to assume there are no NaNs.">, - MarshallingInfoFlag<LangOpts<"NoHonorNaNs">>, ImpliedByAnyOf<[ffinite_math_only.KeyPath]>; + MarshallingInfoFlag<LangOpts<"NoHonorNaNs">>, ImpliedByAnyOf<[ffast_math.KeyPath]>; def menable_no_infinities : Flag<["-"], "menable-no-infs">, HelpText<"Allow optimization to assume there are no infinities.">, - MarshallingInfoFlag<LangOpts<"NoHonorInfs">>, ImpliedByAnyOf<[ffinite_math_only.KeyPath]>; + MarshallingInfoFlag<LangOpts<"NoHonorInfs">>, ImpliedByAnyOf<[ffast_math.KeyPath]>; def pic_level : Separate<["-"], "pic-level">, HelpText<"Value for __PIC__">, diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp index 61072b7b81bff..7bad07ad8e3c1 100644 --- a/clang/lib/Basic/LangOptions.cpp +++ b/clang/lib/Basic/LangOptions.cpp @@ -34,8 +34,8 @@ void LangOptions::resetNonModularOptions() { // invocations that cannot be round-tripped to arguments. // FIXME: we should derive this automatically from ImpliedBy in tablegen. AllowFPReassoc = UnsafeFPMath; - NoHonorNaNs = FiniteMathOnly; - NoHonorInfs = FiniteMathOnly; + NoHonorNaNs = 0; + NoHonorInfs = 0; // These options do not affect AST generation. NoSanitizeFiles.clear(); diff --git a/clang/lib/Basic/Targets/OSTargets.cpp b/clang/lib/Basic/Targets/OSTargets.cpp index 899aefa6173ac..146257a7d5c16 100644 --- a/clang/lib/Basic/Targets/OSTargets.cpp +++ b/clang/lib/Basic/Targets/OSTargets.cpp @@ -174,9 +174,10 @@ static void addVisualCDefines(const LangOptions &Opts, MacroBuilder &Builder) { // transformation unless the transformation is guaranteed to produce a bitwise // identical result." const bool any_imprecise_flags = - Opts.FastMath || Opts.FiniteMathOnly || Opts.UnsafeFPMath || - Opts.AllowFPReassoc || Opts.NoHonorNaNs || Opts.NoHonorInfs || - Opts.NoSignedZero || Opts.AllowRecip || Opts.ApproxFunc; + Opts.FastMath || (Opts.NoHonorInfs && Opts.NoHonorNaNs) || + Opts.UnsafeFPMath || Opts.AllowFPReassoc || Opts.NoHonorNaNs || + Opts.NoHonorInfs || Opts.NoSignedZero || Opts.AllowRecip || + Opts.ApproxFunc; // "Under both /fp:precise and /fp:fast, the compiler generates code intended // to run in the default floating-point environment." diff --git a/clang/test/CodeGen/finite-math.c b/clang/test/CodeGen/finite-math.c index d1a2956b69feb..9cddba99ddf63 100644 --- a/clang/test/CodeGen/finite-math.c +++ b/clang/test/CodeGen/finite-math.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -ffinite-math-only -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=FINITE +// RUN: %clang_cc1 -menable-no-infs -menable-no-nans -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=FINITE // RUN: %clang_cc1 -fno-signed-zeros -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=NSZ // RUN: %clang_cc1 -freciprocal-math -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=RECIP // RUN: %clang_cc1 -mreassociate -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=REASSOC diff --git a/clang/test/CodeGen/fp-options-to-fast-math-flags.c b/clang/test/CodeGen/fp-options-to-fast-math-flags.c index abdcf8541f225..6aa62266d9898 100644 --- a/clang/test/CodeGen/fp-options-to-fast-math-flags.c +++ b/clang/test/CodeGen/fp-options-to-fast-math-flags.c @@ -1,7 +1,7 @@ // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck -check-prefix CHECK-PRECISE %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -menable-no-nans -emit-llvm -o - %s | FileCheck -check-prefix CHECK-NO-NANS %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -menable-no-infs -emit-llvm -o - %s | FileCheck -check-prefix CHECK-NO-INFS %s -// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ffinite-math-only -emit-llvm -o - %s | FileCheck -check-prefix CHECK-FINITE %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -menable-no-infs -menable-no-nans -emit-llvm -o - %s | FileCheck -check-prefix CHECK-FINITE %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -fno-signed-zeros -emit-llvm -o - %s | FileCheck -check-prefix CHECK-NO-SIGNED-ZEROS %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -mreassociate -emit-llvm -o - %s | FileCheck -check-prefix CHECK-REASSOC %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -freciprocal-math -emit-llvm -o - %s | FileCheck -check-prefix CHECK-RECIP %s diff --git a/clang/test/CodeGen/nofpclass.c b/clang/test/CodeGen/nofpclass.c index fc4c64f9b921b..23470914d0ab4 100644 --- a/clang/test/CodeGen/nofpclass.c +++ b/clang/test/CodeGen/nofpclass.c @@ -1,7 +1,7 @@ // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-attributes --version 2 // REQUIRES: x86-registered-target -// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-feature +avx -fenable-matrix -ffinite-math-only -emit-llvm -o - %s | FileCheck -check-prefixes=CFINITEONLY %s -// RUN: %clang_cc1 -x cl -triple x86_64-unknown-unknown -target-feature +avx -fenable-matrix -cl-finite-math-only -emit-llvm -o - %s | FileCheck -check-prefixes=CLFINITEONLY %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-feature +avx -fenable-matrix -menable-no-infs -menable-no-nans -emit-llvm -o - %s | FileCheck -check-prefixes=CFINITEONLY %s +// RUN: %clang_cc1 -x cl -triple x86_64-unknown-unknown -target-feature +avx -fenable-matrix -menable-no-nans -menable-no-infs -emit-llvm -o - %s | FileCheck -check-prefixes=CLFINITEONLY %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-feature +avx -fenable-matrix -menable-no-nans -emit-llvm -o - %s | FileCheck -check-prefixes=NONANS %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-feature +avx -fenable-matrix -menable-no-infs -emit-llvm -o - %s | FileCheck -check-prefixes=NOINFS %s diff --git a/clang/test/CodeGenOpenCL/relaxed-fpmath.cl b/clang/test/CodeGenOpenCL/relaxed-fpmath.cl index 2751caa973072..6f75ee28b6c63 100644 --- a/clang/test/CodeGenOpenCL/relaxed-fpmath.cl +++ b/clang/test/CodeGenOpenCL/relaxed-fpmath.cl @@ -1,6 +1,6 @@ // RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s -check-prefix=NORMAL // RUN: %clang_cc1 %s -emit-llvm -cl-fast-relaxed-math -o - | FileCheck %s -check-prefix=FAST -// RUN: %clang_cc1 %s -emit-llvm -cl-finite-math-only -o - | FileCheck %s -check-prefix=FINITE +// RUN: %clang_cc1 %s -emit-llvm -menable-no-nans -menable-no-infs -o - | FileCheck %s -check-prefix=FINITE // RUN: %clang_cc1 %s -emit-llvm -cl-unsafe-math-optimizations -o - | FileCheck %s -check-prefix=UNSAFE // RUN: %clang_cc1 %s -emit-llvm -cl-mad-enable -o - | FileCheck %s -check-prefix=MAD // RUN: %clang_cc1 %s -emit-llvm -cl-no-signed-zeros -o - | FileCheck %s -check-prefix=NOSIGNED @@ -9,7 +9,7 @@ // RUN: %clang_cc1 %s -DGEN_PCH=1 -finclude-default-header -triple spir-unknown-unknown -emit-pch -o %t.pch // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -o - | FileCheck %s -check-prefix=NORMAL // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-fast-relaxed-math -o - | FileCheck %s -check-prefix=FAST -// RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-finite-math-only -o - | FileCheck %s -check-prefix=FINITE +// RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -menable-no-nans -menable-no-infs -o - | FileCheck %s -check-prefix=FINITE // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-unsafe-math-optimizations -o - | FileCheck %s -check-prefix=UNSAFE // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-mad-enable -o - | FileCheck %s -check-prefix=MAD // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-no-signed-zeros -o - | FileCheck %s -check-prefix=NOSIGNED diff --git a/clang/test/Headers/float.c b/clang/test/Headers/float.c index 218ab58ba62ef..caf9f47e2d694 100644 --- a/clang/test/Headers/float.c +++ b/clang/test/Headers/float.c @@ -2,7 +2,7 @@ // RUN: %clang_cc1 -fsyntax-only -verify -std=c99 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c23 -ffreestanding %s -// RUN: %clang_cc1 -fsyntax-only -verify=finite -std=c23 -ffreestanding -ffinite-math-only %s +// RUN: %clang_cc1 -fsyntax-only -verify=finite -std=c23 -ffreestanding -menable-no-nans -menable-no-infs %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++11 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++14 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++17 -ffreestanding %s diff --git a/clang/test/Preprocessor/predefined-macros.c b/clang/test/Preprocessor/predefined-macros.c index 7f036bff401ca..633ba4681ac52 100644 --- a/clang/test/Preprocessor/predefined-macros.c +++ b/clang/test/Preprocessor/predefined-macros.c @@ -70,7 +70,7 @@ // RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-NO-MATH-ERRNO // CHECK-NO-MATH-ERRNO: #define __NO_MATH_ERRNO__ 1 // -// RUN: %clang_cc1 %s -E -dM -ffinite-math-only -o - \ +// RUN: %clang_cc1 %s -E -dM -menable-no-nans -menable-no-infs -o - \ // RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-FINITE-MATH-ONLY // CHECK-FINITE-MATH-ONLY: #define __FINITE_MATH_ONLY__ 1 // @@ -316,4 +316,4 @@ // RUN: -triple amdgcn-amd-amdhsa -fcuda-is-device | FileCheck -match-full-lines \ // RUN: %s --check-prefix=CHECK-HIPSTDPAR-INTERPOSE-DEV-NEG // CHECK-HIPSTDPAR-INTERPOSE-DEV-NEG: #define __HIPSTDPAR__ 1 -// CHECK-HIPSTDPAR-INTERPOSE-DEV-NEG-NOT: #define __HIPSTDPAR_INTERPOSE_ALLOC__ 1 \ No newline at end of file +// CHECK-HIPSTDPAR-INTERPOSE-DEV-NEG-NOT: #define __HIPSTDPAR_INTERPOSE_ALLOC__ 1 >From e8b63a949004a36da002bcb7ec40fc6cbd2781e0 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Fri, 12 Jul 2024 10:14:19 -0700 Subject: [PATCH 05/15] Responded to review comments. --- clang/lib/Driver/ToolChains/Clang.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 65257e3c4c9d9..d010579b0254f 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3295,16 +3295,17 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, } // Handle __FINITE_MATH_ONLY__ similarly. - bool InfValues, NanValues = true; + bool InfValues = true; + bool NanValues = true; auto processArg = [&](const auto *Arg) { if (StringRef(Arg->getValue()) == "-menable-no-nans") NanValues = false; if (StringRef(Arg->getValue()) == "-menable-no-infs") InfValues = false; }; - for (auto *Arg : Args.filtered(options::OPT_Xclang)) { + for (auto *Arg : Args.filtered(options::OPT_Xclang)) processArg(Arg); - } + if ((!HonorINFs && !HonorNaNs) || (!NanValues && !InfValues)) CmdArgs.push_back("-ffinite-math-only"); >From 60d338644511d4f57f5e882d486dbfa0fadb6ebd Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Mon, 15 Jul 2024 05:56:42 -0700 Subject: [PATCH 06/15] Fix LIT tests. --- clang/test/Headers/__clang_hip_cmath.hip | 3 ++- clang/test/Headers/__clang_hip_math.hip | 3 ++- clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp | 4 ++-- clang/test/Sema/warn-infinity-nan-disabled-win.cpp | 5 +++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/clang/test/Headers/__clang_hip_cmath.hip b/clang/test/Headers/__clang_hip_cmath.hip index cd085fdb5039a..bd76303860172 100644 --- a/clang/test/Headers/__clang_hip_cmath.hip +++ b/clang/test/Headers/__clang_hip_cmath.hip @@ -13,7 +13,8 @@ // RUN: -internal-isystem %S/../../lib/Headers/cuda_wrappers \ // RUN: -internal-isystem %S/Inputs/include \ // RUN: -triple amdgcn-amd-amdhsa -aux-triple x86_64-unknown-unknown \ -// RUN: -target-cpu gfx906 -emit-llvm %s -fcuda-is-device -O1 -ffinite-math-only -o - \ +// RUN: -target-cpu gfx906 -emit-llvm %s -fcuda-is-device -O1 meanble-no-infs \ +// RUN: -menable-no-nans -o - \ // RUN: -D__HIPCC_RTC__ | FileCheck -check-prefix=FINITEONLY %s // DEFAULT-LABEL: @test_fma_f16( diff --git a/clang/test/Headers/__clang_hip_math.hip b/clang/test/Headers/__clang_hip_math.hip index 26da82843c512..6ee10976f1207 100644 --- a/clang/test/Headers/__clang_hip_math.hip +++ b/clang/test/Headers/__clang_hip_math.hip @@ -14,7 +14,8 @@ // RUN: -internal-isystem %S/../../lib/Headers/cuda_wrappers \ // RUN: -internal-isystem %S/Inputs/include \ // RUN: -triple amdgcn-amd-amdhsa -aux-triple x86_64-unknown-unknown \ -// RUN: -target-cpu gfx906 -emit-llvm %s -fcuda-is-device -O1 -ffinite-math-only -o - \ +// RUN: -target-cpu gfx906 -emit-llvm %s -fcuda-is-device -O1 -menable-no-infs \ +// RUN: -menable-no-nans -o - \ // RUN: -D__HIPCC_RTC__ | FileCheck -check-prefixes=CHECK,FINITEONLY %s // Check that we end up with -fapprox-func set on intrinsic calls diff --git a/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp b/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp index cb719c3a519da..ebcb2b225f3df 100644 --- a/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp +++ b/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp @@ -1,10 +1,10 @@ // RUN: %clang_cc1 -x c++ -verify=no-inf-no-nan \ // RUN: -triple powerpc64le-unknown-unknown %s \ -// RUN: -ffinite-math-only -std=c++23 +// RUN: -menable-no-infs -menable-no-nans -std=c++23 // RUN: %clang_cc1 -x c++ -verify=no-inf-no-nan \ // RUN: -triple powerpc64le-unknown-unknown %s \ -// RUN: -ffinite-math-only -funsafe-math-optimizations \ +// RUN: -menable-no-infs -menable-no-nans -funsafe-math-optimizations \ // RUN: -std=c++23 // RUN: %clang_cc1 -x c++ -verify=no-fast -triple powerpc64le-unknown-unknown \ diff --git a/clang/test/Sema/warn-infinity-nan-disabled-win.cpp b/clang/test/Sema/warn-infinity-nan-disabled-win.cpp index 4bf3355926634..ee4eb33a16e44 100644 --- a/clang/test/Sema/warn-infinity-nan-disabled-win.cpp +++ b/clang/test/Sema/warn-infinity-nan-disabled-win.cpp @@ -2,11 +2,12 @@ // on Windows the NAN macro is defined using INFINITY. See below. // RUN: %clang_cc1 -x c++ -verify=no-inf-no-nan \ -// RUN: -triple powerpc64le-unknown-unknown %s -ffinite-math-only -std=c++23 +// RUN: -triple powerpc64le-unknown-unknown %s -menable-no-infs \ +// RUN: -menable-no-nans -std=c++23 // RUN: %clang_cc1 -x c++ -verify=no-inf-no-nan \ // RUN: -triple powerpc64le-unknown-unknown %s \ -// RUN: -ffinite-math-only -funsafe-math-optimizations \ +// RUN: -menable-no-infs -menable-no-nans -funsafe-math-optimizations \ // RUN: -std=c++23 // RUN: %clang_cc1 -x c++ -verify=no-fast -triple powerpc64le-unknown-unknown \ >From 68532bbcb6e0182158ba4e3def71c13ec7bcbc5c Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Mon, 15 Jul 2024 08:35:14 -0700 Subject: [PATCH 07/15] Addressed review comments. --- clang/lib/Basic/LangOptions.cpp | 2 -- clang/test/Headers/__clang_hip_cmath.hip | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp index 83b7e865d346b..20b962728110d 100644 --- a/clang/lib/Basic/LangOptions.cpp +++ b/clang/lib/Basic/LangOptions.cpp @@ -34,8 +34,6 @@ void LangOptions::resetNonModularOptions() { // invocations that cannot be round-tripped to arguments. // FIXME: we should derive this automatically from ImpliedBy in tablegen. AllowFPReassoc = UnsafeFPMath; - NoHonorNaNs = 0; - NoHonorInfs = 0; // These options do not affect AST generation. NoSanitizeFiles.clear(); diff --git a/clang/test/Headers/__clang_hip_cmath.hip b/clang/test/Headers/__clang_hip_cmath.hip index bd76303860172..697ceeddf8cc4 100644 --- a/clang/test/Headers/__clang_hip_cmath.hip +++ b/clang/test/Headers/__clang_hip_cmath.hip @@ -13,7 +13,7 @@ // RUN: -internal-isystem %S/../../lib/Headers/cuda_wrappers \ // RUN: -internal-isystem %S/Inputs/include \ // RUN: -triple amdgcn-amd-amdhsa -aux-triple x86_64-unknown-unknown \ -// RUN: -target-cpu gfx906 -emit-llvm %s -fcuda-is-device -O1 meanble-no-infs \ +// RUN: -target-cpu gfx906 -emit-llvm %s -fcuda-is-device -O1 menable-no-infs \ // RUN: -menable-no-nans -o - \ // RUN: -D__HIPCC_RTC__ | FileCheck -check-prefix=FINITEONLY %s >From 12baac51ef2657f441108affbc7c5d6754b907d0 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Mon, 15 Jul 2024 10:30:13 -0700 Subject: [PATCH 08/15] Fix LIT test. --- clang/test/Headers/__clang_hip_cmath.hip | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Headers/__clang_hip_cmath.hip b/clang/test/Headers/__clang_hip_cmath.hip index 697ceeddf8cc4..ed1030b820627 100644 --- a/clang/test/Headers/__clang_hip_cmath.hip +++ b/clang/test/Headers/__clang_hip_cmath.hip @@ -13,7 +13,7 @@ // RUN: -internal-isystem %S/../../lib/Headers/cuda_wrappers \ // RUN: -internal-isystem %S/Inputs/include \ // RUN: -triple amdgcn-amd-amdhsa -aux-triple x86_64-unknown-unknown \ -// RUN: -target-cpu gfx906 -emit-llvm %s -fcuda-is-device -O1 menable-no-infs \ +// RUN: -target-cpu gfx906 -emit-llvm %s -fcuda-is-device -O1 -menable-no-infs \ // RUN: -menable-no-nans -o - \ // RUN: -D__HIPCC_RTC__ | FileCheck -check-prefix=FINITEONLY %s >From bb7f7ece9a193a0a3884264dac4c1e8f7ea208a5 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Mon, 15 Jul 2024 11:18:19 -0700 Subject: [PATCH 09/15] Avoid processing Xclang args when we are in finite math mode. --- clang/lib/Driver/ToolChains/Clang.cpp | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 3e2f6666ccfd7..0ff26318a6a9c 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3298,20 +3298,23 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, } // Handle __FINITE_MATH_ONLY__ similarly. - bool InfValues = true; - bool NanValues = true; - auto processArg = [&](const auto *Arg) { - if (StringRef(Arg->getValue()) == "-menable-no-nans") - NanValues = false; - if (StringRef(Arg->getValue()) == "-menable-no-infs") - InfValues = false; - }; - for (auto *Arg : Args.filtered(options::OPT_Xclang)) - processArg(Arg); - - if ((!HonorINFs && !HonorNaNs) || (!NanValues && !InfValues)) + if (!HonorINFs && !HonorNaNs) CmdArgs.push_back("-ffinite-math-only"); + else { + bool InfValues = true; + bool NanValues = true; + auto processArg = [&](const auto *Arg) { + if (StringRef(Arg->getValue()) == "-menable-no-nans") + NanValues = false; + if (StringRef(Arg->getValue()) == "-menable-no-infs") + InfValues = false; + }; + for (auto *Arg : Args.filtered(options::OPT_Xclang)) + processArg(Arg); + if (!NanValues && !InfValues) + CmdArgs.push_back("-ffinite-math-only"); + } if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) { CmdArgs.push_back("-mfpmath"); CmdArgs.push_back(A->getValue()); >From 6ce6bc7b7f2d8b8fa8339371358a99dd36b85b47 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Mon, 15 Jul 2024 11:52:00 -0700 Subject: [PATCH 10/15] Rewrite code as proposed in review comment. --- clang/lib/Driver/ToolChains/Clang.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 0ff26318a6a9c..f6395aa6ad14d 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3298,9 +3298,10 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, } // Handle __FINITE_MATH_ONLY__ similarly. - if (!HonorINFs && !HonorNaNs) - CmdArgs.push_back("-ffinite-math-only"); - else { + // The -ffinite-math-only is added to CmdArgs when !HonorINFs && !HonorNaNs. + // Otherwise process the Xclang arguments to determine if -menable-no-infs and + // -menable-no-nans are set by the user. + auto NaNsAndInfs = [&] { bool InfValues = true; bool NanValues = true; auto processArg = [&](const auto *Arg) { @@ -3309,12 +3310,15 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, if (StringRef(Arg->getValue()) == "-menable-no-infs") InfValues = false; }; + for (auto *Arg : Args.filtered(options::OPT_Xclang)) processArg(Arg); - if (!NanValues && !InfValues) - CmdArgs.push_back("-ffinite-math-only"); - } + return InfValues && NanValues; + }; + + if ((!HonorINFs && !HonorNaNs) || !NaNsAndInfs()) + CmdArgs.push_back("-ffinite-math-only"); if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) { CmdArgs.push_back("-mfpmath"); CmdArgs.push_back(A->getValue()); >From 1d463332144d6c3d6456929b52850220fd0f8276 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Mon, 15 Jul 2024 12:21:27 -0700 Subject: [PATCH 11/15] Simplified the addition of -ffinite-math-only to CmdArgs. --- clang/lib/Driver/ToolChains/Clang.cpp | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index f6395aa6ad14d..ac5dbe278144d 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3301,24 +3301,25 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, // The -ffinite-math-only is added to CmdArgs when !HonorINFs && !HonorNaNs. // Otherwise process the Xclang arguments to determine if -menable-no-infs and // -menable-no-nans are set by the user. - auto NaNsAndInfs = [&] { + bool shouldAddFiniteMathOnly = false; + if (!HonorINFs && !HonorNaNs) { + shouldAddFiniteMathOnly = true; + } else { bool InfValues = true; bool NanValues = true; - auto processArg = [&](const auto *Arg) { - if (StringRef(Arg->getValue()) == "-menable-no-nans") + for (const auto *Arg : Args.filtered(options::OPT_Xclang)) { + StringRef ArgValue = Arg->getValue(); + if (ArgValue == "-menable-no-nans") NanValues = false; - if (StringRef(Arg->getValue()) == "-menable-no-infs") + else if (ArgValue == "-menable-no-infs") InfValues = false; - }; - - for (auto *Arg : Args.filtered(options::OPT_Xclang)) - processArg(Arg); - - return InfValues && NanValues; - }; - - if ((!HonorINFs && !HonorNaNs) || !NaNsAndInfs()) + } + if (!NanValues && !InfValues) + shouldAddFiniteMathOnly = true; + } + if (shouldAddFiniteMathOnly) { CmdArgs.push_back("-ffinite-math-only"); + } if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) { CmdArgs.push_back("-mfpmath"); CmdArgs.push_back(A->getValue()); >From 4e0afa2dbbbf53287620461951c012545ab98381 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Wed, 17 Jul 2024 11:03:02 -0700 Subject: [PATCH 12/15] Addressed review comments and fixed the -menable_no_infs option. --- clang/include/clang/Driver/Options.td | 2 +- clang/lib/Basic/Targets/OSTargets.cpp | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 512eb93f65e67..6c72bf149157c 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -7762,7 +7762,7 @@ def mreassociate : Flag<["-"], "mreassociate">, def menable_no_nans : Flag<["-"], "menable-no-nans">, HelpText<"Allow optimization to assume there are no NaNs.">, MarshallingInfoFlag<LangOpts<"NoHonorNaNs">>, ImpliedByAnyOf<[ffast_math.KeyPath]>; -def menable_no_infinities : Flag<["-"], "menable-no-infs">, +def menable_no_infs : Flag<["-"], "menable-no-infs">, HelpText<"Allow optimization to assume there are no infinities.">, MarshallingInfoFlag<LangOpts<"NoHonorInfs">>, ImpliedByAnyOf<[ffast_math.KeyPath]>; diff --git a/clang/lib/Basic/Targets/OSTargets.cpp b/clang/lib/Basic/Targets/OSTargets.cpp index 146257a7d5c16..b56e2c7ca9c49 100644 --- a/clang/lib/Basic/Targets/OSTargets.cpp +++ b/clang/lib/Basic/Targets/OSTargets.cpp @@ -173,11 +173,10 @@ static void addVisualCDefines(const LangOptions &Opts, MacroBuilder &Builder) { // "Under /fp:precise and /fp:strict, the compiler doesn't do any mathematical // transformation unless the transformation is guaranteed to produce a bitwise // identical result." - const bool any_imprecise_flags = - Opts.FastMath || (Opts.NoHonorInfs && Opts.NoHonorNaNs) || - Opts.UnsafeFPMath || Opts.AllowFPReassoc || Opts.NoHonorNaNs || - Opts.NoHonorInfs || Opts.NoSignedZero || Opts.AllowRecip || - Opts.ApproxFunc; + const bool any_imprecise_flags = Opts.FastMath || Opts.UnsafeFPMath || + Opts.AllowFPReassoc || Opts.NoHonorNaNs || + Opts.NoHonorInfs || Opts.NoSignedZero || + Opts.AllowRecip || Opts.ApproxFunc; // "Under both /fp:precise and /fp:fast, the compiler generates code intended // to run in the default floating-point environment." >From 50b2a87754fbdc0c078a412e2b70e126168f440d Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Wed, 17 Jul 2024 14:28:38 -0700 Subject: [PATCH 13/15] Fix issue with modules-implied-args. --- clang/lib/Basic/LangOptions.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp index 20b962728110d..9331a63d91b17 100644 --- a/clang/lib/Basic/LangOptions.cpp +++ b/clang/lib/Basic/LangOptions.cpp @@ -34,6 +34,8 @@ void LangOptions::resetNonModularOptions() { // invocations that cannot be round-tripped to arguments. // FIXME: we should derive this automatically from ImpliedBy in tablegen. AllowFPReassoc = UnsafeFPMath; + NoHonorInfs = FastMath; + NoHonorNaNs = FastMath; // These options do not affect AST generation. NoSanitizeFiles.clear(); >From 7a474e42c656f2133ed9e09f48ad00b4f92bf328 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Wed, 24 Jul 2024 04:35:43 -0700 Subject: [PATCH 14/15] Have the OpenCL test used the -cl-finite-math-only. --- clang/test/CodeGenOpenCL/relaxed-fpmath.cl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/test/CodeGenOpenCL/relaxed-fpmath.cl b/clang/test/CodeGenOpenCL/relaxed-fpmath.cl index 6f75ee28b6c63..2751caa973072 100644 --- a/clang/test/CodeGenOpenCL/relaxed-fpmath.cl +++ b/clang/test/CodeGenOpenCL/relaxed-fpmath.cl @@ -1,6 +1,6 @@ // RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s -check-prefix=NORMAL // RUN: %clang_cc1 %s -emit-llvm -cl-fast-relaxed-math -o - | FileCheck %s -check-prefix=FAST -// RUN: %clang_cc1 %s -emit-llvm -menable-no-nans -menable-no-infs -o - | FileCheck %s -check-prefix=FINITE +// RUN: %clang_cc1 %s -emit-llvm -cl-finite-math-only -o - | FileCheck %s -check-prefix=FINITE // RUN: %clang_cc1 %s -emit-llvm -cl-unsafe-math-optimizations -o - | FileCheck %s -check-prefix=UNSAFE // RUN: %clang_cc1 %s -emit-llvm -cl-mad-enable -o - | FileCheck %s -check-prefix=MAD // RUN: %clang_cc1 %s -emit-llvm -cl-no-signed-zeros -o - | FileCheck %s -check-prefix=NOSIGNED @@ -9,7 +9,7 @@ // RUN: %clang_cc1 %s -DGEN_PCH=1 -finclude-default-header -triple spir-unknown-unknown -emit-pch -o %t.pch // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -o - | FileCheck %s -check-prefix=NORMAL // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-fast-relaxed-math -o - | FileCheck %s -check-prefix=FAST -// RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -menable-no-nans -menable-no-infs -o - | FileCheck %s -check-prefix=FINITE +// RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-finite-math-only -o - | FileCheck %s -check-prefix=FINITE // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-unsafe-math-optimizations -o - | FileCheck %s -check-prefix=UNSAFE // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-mad-enable -o - | FileCheck %s -check-prefix=MAD // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-no-signed-zeros -o - | FileCheck %s -check-prefix=NOSIGNED >From 045d80c3cb8880f2e9f4dbfd5e42f1b0f4f02856 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat <zahira.ammarguel...@intel.com> Date: Wed, 24 Jul 2024 09:24:54 -0700 Subject: [PATCH 15/15] Fixed issue with -cl-fininte-math-only. --- clang/lib/Driver/ToolChains/Clang.cpp | 5 +++++ clang/test/CodeGenOpenCL/relaxed-fpmath.cl | 4 ++-- clang/test/Driver/opencl.cl | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index ac5dbe278144d..1427558d47697 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3688,6 +3688,11 @@ static void RenderOpenCLOptions(const ArgList &Args, ArgStringList &CmdArgs, CmdArgs.push_back(Args.MakeArgString(CLExtStr)); } + if (Arg* A = Args.getLastArg(options::OPT_cl_finite_math_only)) { + CmdArgs.push_back("-menable-no-infs"); + CmdArgs.push_back("-menable-no-nans"); + } + for (const auto &Arg : ForwardedArguments) if (const auto *A = Args.getLastArg(Arg)) CmdArgs.push_back(Args.MakeArgString(A->getOption().getPrefixedName())); diff --git a/clang/test/CodeGenOpenCL/relaxed-fpmath.cl b/clang/test/CodeGenOpenCL/relaxed-fpmath.cl index 2751caa973072..a5f0019dbc1e5 100644 --- a/clang/test/CodeGenOpenCL/relaxed-fpmath.cl +++ b/clang/test/CodeGenOpenCL/relaxed-fpmath.cl @@ -1,6 +1,6 @@ // RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s -check-prefix=NORMAL // RUN: %clang_cc1 %s -emit-llvm -cl-fast-relaxed-math -o - | FileCheck %s -check-prefix=FAST -// RUN: %clang_cc1 %s -emit-llvm -cl-finite-math-only -o - | FileCheck %s -check-prefix=FINITE +// RUN: %clang_cc1 %s -emit-llvm -menable-no-infs -menable-no-nans -cl-finite-math-only -o - | FileCheck %s -check-prefix=FINITE // RUN: %clang_cc1 %s -emit-llvm -cl-unsafe-math-optimizations -o - | FileCheck %s -check-prefix=UNSAFE // RUN: %clang_cc1 %s -emit-llvm -cl-mad-enable -o - | FileCheck %s -check-prefix=MAD // RUN: %clang_cc1 %s -emit-llvm -cl-no-signed-zeros -o - | FileCheck %s -check-prefix=NOSIGNED @@ -9,7 +9,7 @@ // RUN: %clang_cc1 %s -DGEN_PCH=1 -finclude-default-header -triple spir-unknown-unknown -emit-pch -o %t.pch // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -o - | FileCheck %s -check-prefix=NORMAL // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-fast-relaxed-math -o - | FileCheck %s -check-prefix=FAST -// RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-finite-math-only -o - | FileCheck %s -check-prefix=FINITE +// RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -menable-no-infs -menable-no-nans -cl-finite-math-only -o - | FileCheck %s -check-prefix=FINITE // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-unsafe-math-optimizations -o - | FileCheck %s -check-prefix=UNSAFE // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-mad-enable -o - | FileCheck %s -check-prefix=MAD // RUN: %clang_cc1 %s -include-pch %t.pch -fno-validate-pch -emit-llvm -cl-no-signed-zeros -o - | FileCheck %s -check-prefix=NOSIGNED diff --git a/clang/test/Driver/opencl.cl b/clang/test/Driver/opencl.cl index aba37fc328fbb..3b0b191827b4c 100644 --- a/clang/test/Driver/opencl.cl +++ b/clang/test/Driver/opencl.cl @@ -35,7 +35,7 @@ // CHECK-OPT-DISABLE: "-cc1" {{.*}} "-cl-opt-disable" // CHECK-STRICT-ALIASING: "-cc1" {{.*}} "-cl-strict-aliasing" // CHECK-SINGLE-PRECISION-CONST: "-cc1" {{.*}} "-cl-single-precision-constant" -// CHECK-FINITE-MATH-ONLY: "-cc1" {{.*}} "-cl-finite-math-only" +// CHECK-FINITE-MATH-ONLY: "-cc1" {{.*}} "-menable-no-infs" "-menable-no-nans" "-cl-finite-math-only" // CHECK-KERNEL-ARG-INFO: "-cc1" {{.*}} "-cl-kernel-arg-info" // CHECK-UNSAFE-MATH-OPT: "-cc1" {{.*}} "-cl-unsafe-math-optimizations" // CHECK-FAST-RELAXED-MATH: "-cc1" {{.*}} "-cl-fast-relaxed-math" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits