From 314e1b47dceafda7a52650915648703236bc4f23 Mon Sep 17 00:00:00 2001 From: James Greenhalgh Date: Tue, 20 Dec 2016 16:17:27 +0000 Subject: [PATCH] [Patch] Turn -fexcess-precision=fast on when in -ffast-math * common.opt (excess_precision): Tag as SetByCombined. * opts.c (set_fast_math_flags): Also set flag_excess_precision_cmdline. (fast_math_flags_set_p): Also check flag_excess_precision_cmdline. * doc/invoke.texi (-fexcess-precision): Drop text saying the option has no effect under -ffast-math, make it clear that -ffast-math will cause -fexcess-precision=fast by default even for standards compliant modes. (-ffast-math): Document that this sets -fexcess-precision=fast. From-SVN: r243824 --- gcc/ChangeLog | 12 ++++++++++++ gcc/common.opt | 2 +- gcc/doc/invoke.texi | 9 +++++---- gcc/opts.c | 8 +++++++- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d22e948fe1..156408f2f10 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2016-12-20 James Greenhalgh + + * common.opt (excess_precision): Tag as SetByCombined. + * opts.c (set_fast_math_flags): Also set + flag_excess_precision_cmdline. + (fast_math_flags_set_p): Also check flag_excess_precision_cmdline. + * doc/invoke.texi (-fexcess-precision): Drop text saying the + option has no effect under -ffast-math, make it clear that + -ffast-math will cause -fexcess-precision=fast by default even for + standards compliant modes. + (-ffast-math): Document that this sets -fexcess-precision=fast. + 2016-12-20 Richard Biener * passes.c (execute_one_pass): Handle going out of SSA w/o diff --git a/gcc/common.opt b/gcc/common.opt index de068447d31..6ebaf9ca672 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -1317,7 +1317,7 @@ Common Report Var(flag_expensive_optimizations) Optimization Perform a number of minor, expensive optimizations. fexcess-precision= -Common Joined RejectNegative Enum(excess_precision) Var(flag_excess_precision_cmdline) Init(EXCESS_PRECISION_DEFAULT) +Common Joined RejectNegative Enum(excess_precision) Var(flag_excess_precision_cmdline) Init(EXCESS_PRECISION_DEFAULT) SetByCombined -fexcess-precision=[fast|standard] Specify handling of excess floating-point precision. Enum diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index b7299648879..5c92fe69335 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -9109,12 +9109,12 @@ both casts and assignments cause values to be rounded to their semantic types (whereas @option{-ffloat-store} only affects assignments). This option is enabled by default for C if a strict conformance option such as @option{-std=c99} is used. +@option{-ffast-math} enables @option{-fexcess-precision=fast} by default +regardless of whether a strict conformance option is used. @opindex mfpmath @option{-fexcess-precision=standard} is not implemented for languages -other than C, and has no effect if -@option{-funsafe-math-optimizations} or @option{-ffast-math} is -specified. On the x86, it also has no effect if @option{-mfpmath=sse} +other than C. On the x86, it has no effect if @option{-mfpmath=sse} or @option{-mfpmath=sse+387} is specified; in the former case, IEEE semantics apply without excess precision, and in the latter, rounding is unpredictable. @@ -9123,7 +9123,8 @@ is unpredictable. @opindex ffast-math Sets the options @option{-fno-math-errno}, @option{-funsafe-math-optimizations}, @option{-ffinite-math-only}, @option{-fno-rounding-math}, -@option{-fno-signaling-nans} and @option{-fcx-limited-range}. +@option{-fno-signaling-nans}, @option{-fcx-limited-range} and +@option{-fexcess-precision=fast}. This option causes the preprocessor macro @code{__FAST_MATH__} to be defined. diff --git a/gcc/opts.c b/gcc/opts.c index 890da03e6a1..58441908d11 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -2342,6 +2342,10 @@ set_fast_math_flags (struct gcc_options *opts, int set) opts->x_flag_errno_math = !set; if (set) { + if (opts->frontend_set_flag_excess_precision_cmdline + == EXCESS_PRECISION_DEFAULT) + opts->x_flag_excess_precision_cmdline + = set ? EXCESS_PRECISION_FAST : EXCESS_PRECISION_DEFAULT; if (!opts->frontend_set_flag_signaling_nans) opts->x_flag_signaling_nans = 0; if (!opts->frontend_set_flag_rounding_math) @@ -2374,7 +2378,9 @@ fast_math_flags_set_p (const struct gcc_options *opts) && opts->x_flag_unsafe_math_optimizations && opts->x_flag_finite_math_only && !opts->x_flag_signed_zeros - && !opts->x_flag_errno_math); + && !opts->x_flag_errno_math + && opts->x_flag_excess_precision_cmdline + == EXCESS_PRECISION_FAST); } /* Return true iff flags are set as if -ffast-math but using the flags stored -- 2.30.2