Skip to content

Commit b5e93e3

Browse files
committed
[flang] Add -f[no-]honor-nans and -menable-no-nans
Only add the option processing and store the result. No attributes are added to FIR yet. Differential Revision: https://reviews.llvm.org/D137325
1 parent a7fa5fe commit b5e93e3

File tree

7 files changed

+30
-4
lines changed

7 files changed

+30
-4
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5444,9 +5444,6 @@ def mframe_pointer_EQ : Joined<["-"], "mframe-pointer=">,
54445444
HelpText<"Specify which frame pointers to retain.">, Values<"all,non-leaf,none">,
54455445
NormalizedValuesScope<"CodeGenOptions::FramePointerKind">, NormalizedValues<["All", "NonLeaf", "None"]>,
54465446
MarshallingInfoEnum<CodeGenOpts<"FramePointer">, "None">;
5447-
def menable_no_nans : Flag<["-"], "menable-no-nans">,
5448-
HelpText<"Allow optimization to assume there are no NaNs.">,
5449-
MarshallingInfoFlag<LangOpts<"NoHonorNaNs">>, ImpliedByAnyOf<[ffinite_math_only.KeyPath]>;
54505447
def mreassociate : Flag<["-"], "mreassociate">,
54515448
HelpText<"Allow reassociation transformations for floating-point instructions">,
54525449
MarshallingInfoFlag<LangOpts<"AllowFPReassoc">>, ImpliedByAnyOf<[funsafe_math_optimizations.KeyPath]>;
@@ -6057,6 +6054,9 @@ def split_dwarf_output : Separate<["-"], "split-dwarf-output">,
60576054

60586055
let Flags = [CC1Option, FC1Option, NoDriverOption] in {
60596056

6057+
def menable_no_nans : Flag<["-"], "menable-no-nans">,
6058+
HelpText<"Allow optimization to assume there are no NaNs.">,
6059+
MarshallingInfoFlag<LangOpts<"NoHonorNaNs">>, ImpliedByAnyOf<[ffinite_math_only.KeyPath]>;
60606060
def menable_no_infinities : Flag<["-"], "menable-no-infs">,
60616061
HelpText<"Allow optimization to assume there are no infinities.">,
60626062
MarshallingInfoFlag<LangOpts<"NoHonorInfs">>, ImpliedByAnyOf<[ffinite_math_only.KeyPath]>;

clang/lib/Driver/ToolChains/Flang.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ static void addFloatingPointOptions(const Driver &D, const ArgList &Args,
8484
ArgStringList &CmdArgs) {
8585
StringRef FPContract;
8686
bool HonorINFs = true;
87+
bool HonorNaNs = true;
8788

8889
if (const Arg *A = Args.getLastArg(options::OPT_ffp_contract)) {
8990
const StringRef Val = A->getValue();
@@ -115,6 +116,12 @@ static void addFloatingPointOptions(const Driver &D, const ArgList &Args,
115116
case options::OPT_fno_honor_infinities:
116117
HonorINFs = false;
117118
break;
119+
case options::OPT_fhonor_nans:
120+
HonorNaNs = true;
121+
break;
122+
case options::OPT_fno_honor_nans:
123+
HonorNaNs = false;
124+
break;
118125
}
119126

120127
// If we handled this option claim it
@@ -126,6 +133,9 @@ static void addFloatingPointOptions(const Driver &D, const ArgList &Args,
126133

127134
if (!HonorINFs)
128135
CmdArgs.push_back("-menable-no-infs");
136+
137+
if (!HonorNaNs)
138+
CmdArgs.push_back("-menable-no-nans");
129139
}
130140

131141
void Flang::ConstructJob(Compilation &C, const JobAction &JA,

flang/include/flang/Frontend/LangOptions.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ ENUM_LANGOPT(FPContractMode, FPModeKind, 2, FPM_Off) ///< FP Contract Mode (off/
2323

2424
/// Permit floating point optimization without regard to infinities
2525
LANGOPT(NoHonorInfs, 1, false)
26+
/// Permit floating point optimization without regard to NaN
27+
LANGOPT(NoHonorNaNs, 1, false)
2628

2729
#undef LANGOPT
2830
#undef ENUM_LANGOPT

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,12 @@ static bool parseFloatingPointArgs(CompilerInvocation &invoc,
702702
opts.NoHonorInfs = true;
703703
}
704704

705+
if (const llvm::opt::Arg *a =
706+
args.getLastArg(clang::driver::options::OPT_menable_no_nans)) {
707+
diags.Report(diagUnimplemented) << a->getOption().getName();
708+
opts.NoHonorNaNs = true;
709+
}
710+
705711
return true;
706712
}
707713

flang/test/Driver/driver-help.f90

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@
131131
! HELP-FC1-NEXT: -I <dir> Add directory to the end of the list of include search paths
132132
! HELP-FC1-NEXT: -load <dsopath> Load the named plugin (dynamic shared object)
133133
! HELP-FC1-NEXT: -menable-no-infs Allow optimization to assume there are no infinities.
134+
! HELP-FC1-NEXT: -menable-no-nans Allow optimization to assume there are no NaNs.
134135
! HELP-FC1-NEXT: -mllvm <value> Additional arguments to forward to LLVM's option processing
135136
! HELP-FC1-NEXT: -mmlir <value> Additional arguments to forward to MLIR's option processing
136137
! HELP-FC1-NEXT: -module-dir <dir> Put MODULE files in <dir>

flang/test/Driver/flang_fp_opts.f90

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
! Test for handling of floating point options within the frontend driver
22

3-
! RUN: %flang_fc1 -ffp-contract=fast -menable-no-infs %s 2>&1 | FileCheck %s
3+
! RUN: %flang_fc1 \
4+
! RUN: -ffp-contract=fast \
5+
! RUN: -menable-no-infs \
6+
! RUN: -menable-no-nans \
7+
! RUN: %s 2>&1 | FileCheck %s
48
! CHECK: ffp-contract= is not currently implemented
59
! CHECK: menable-no-infs is not currently implemented
10+
! CHECK: menable-no-nans is not currently implemented

flang/test/Driver/frontend-forwarding.f90

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
! RUN: -fconvert=little-endian \
1111
! RUN: -ffp-contract=fast \
1212
! RUN: -fno-honor-infinities \
13+
! RUN: -fno-honor-nans \
1314
! RUN: -mllvm -print-before-all\
1415
! RUN: -P \
1516
! RUN: | FileCheck %s
@@ -22,5 +23,6 @@
2223
! CHECK: "-flarge-sizes"
2324
! CHECK: "-ffp-contract=fast"
2425
! CHECK: "-menable-no-infs"
26+
! CHECK: "-menable-no-nans"
2527
! CHECK: "-fconvert=little-endian"
2628
! CHECK: "-mllvm" "-print-before-all"

0 commit comments

Comments
 (0)