From: Daniel Dunbar Date: Fri, 9 Dec 2011 23:41:18 +0000 (+0000) Subject: Driver: Handle -f{no-}honor-infinities, -f{no-}honor-nans, and X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=001f628a693960380e37c2b58a1009da77d7e425;p=clang Driver: Handle -f{no-}honor-infinities, -f{no-}honor-nans, and -ffinite-math-only. - No test case yet, I don't know how to construct a situation where this matters. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146297 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/CC1Options.td b/include/clang/Driver/CC1Options.td index 172424e1e3..c1c88cdf31 100644 --- a/include/clang/Driver/CC1Options.td +++ b/include/clang/Driver/CC1Options.td @@ -166,6 +166,10 @@ def mdebug_pass : Separate<"-mdebug-pass">, HelpText<"Enable additional debug output">; def mdisable_fp_elim : Flag<"-mdisable-fp-elim">, HelpText<"Disable frame pointer elimination optimization">; +def menable_no_infinities : Flag<"-menable-no-infs">, + HelpText<"Allow optimization to assume there are no infinities.">; +def menable_no_nans : Flag<"-menable-no-nans">, + HelpText<"Allow optimization to assume there are no NaNs.">; def mfloat_abi : Separate<"-mfloat-abi">, HelpText<"The float ABI to use">; def mno_global_merge : Flag<"-mno-global-merge">, diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 41240273e0..5edf9e8117 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -315,7 +315,16 @@ def fexceptions : Flag<"-fexceptions">, Group; def fextdirs_EQ : Joined<"-fextdirs=">, Group; def fhosted : Flag<"-fhosted">, Group; def ffast_math : Flag<"-ffast-math">, Group; -def ffinite_math_only : Flag<"-ffinite-math-only">, Group; +def ffinite_math_only : Flag<"-ffinite-math-only">, Group; +def fhonor_nans : Flag<"-fhonor-nans">, Group; +def fno_honor_nans : Flag<"-fno-honor-nans">, Group; +def fhonor_infinities : Flag<"-fhonor-infinities">, Group; +def fno_honor_infinities : Flag<"-fno-honor-infinities">, Group; +// Sic. This option was misspelled originally. +def fhonor_infinites : Flag<"-fhonor-infinites">, Group, + Alias; +def fno_honor_infinites : Flag<"-fno-honor-infinites">, Group, + Alias; def ffor_scope : Flag<"-ffor-scope">, Group; def fno_for_scope : Flag<"-fno-for-scope">, Group; diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 9d8effb710..f410848cc7 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1345,6 +1345,18 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, getToolChain().IsStrictAliasingDefault())) CmdArgs.push_back("-relaxed-aliasing"); + // Handle -f{no-}honor-infinities, -f{no-}honor-nans, and -ffinite-math-only. + bool HonorInfinities = Args.hasFlag(options::OPT_fhonor_infinities, + options::OPT_fno_honor_infinities); + bool HonorNaNs = Args.hasFlag(options::OPT_fhonor_nans, + options::OPT_fno_honor_nans); + if (Args.hasArg(options::OPT_ffinite_math_only)) + HonorInfinities = HonorNaNs = false; + if (!HonorInfinities) + CmdArgs.push_back("-menable-no-infs"); + if (!HonorNaNs) + CmdArgs.push_back("-menable-no-nans"); + // Decide whether to use verbose asm. Verbose assembly is the default on // toolchains which have the integrated assembler on by default. bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault(); diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 2de9e8068c..0fd0a5aff7 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -183,6 +183,10 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts, Res.push_back("-main-file-name"); Res.push_back(Opts.MainFileName); } + if (Opts.NoInfsFPMath) + Res.push_back("-menable-no-infinities"); + if (Opts.NoNaNsFPMath) + Res.push_back("-menable-no-nans"); // SimplifyLibCalls is only derived. // TimePasses is only derived. // UnitAtATime is unused. @@ -1083,8 +1087,12 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, Opts.HiddenWeakVTables = Args.hasArg(OPT_fhidden_weak_vtables); Opts.LessPreciseFPMAD = Args.hasArg(OPT_cl_mad_enable); Opts.LimitFloatPrecision = Args.getLastArgValue(OPT_mlimit_float_precision); - Opts.NoInfsFPMath = Opts.NoNaNsFPMath = Args.hasArg(OPT_cl_finite_math_only)|| - Args.hasArg(OPT_cl_fast_relaxed_math); + Opts.NoInfsFPMath = (Args.hasArg(OPT_menable_no_infinities) || + Args.hasArg(OPT_cl_finite_math_only)|| + Args.hasArg(OPT_cl_fast_relaxed_math)); + Opts.NoNaNsFPMath = (Args.hasArg(OPT_menable_no_nans) || + Args.hasArg(OPT_cl_finite_math_only)|| + Args.hasArg(OPT_cl_fast_relaxed_math)); Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss); Opts.BackendOptions = Args.getAllArgValues(OPT_backend_option); Opts.NumRegisterParameters = Args.getLastArgIntValue(OPT_mregparm, 0, Diags);