[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
This commit is contained in:
James Greenhalgh 2016-12-20 16:17:27 +00:00 committed by James Greenhalgh
parent aa90531ea4
commit 314e1b47dc
4 changed files with 25 additions and 6 deletions

View File

@ -1,3 +1,15 @@
2016-12-20 James Greenhalgh <james.greenhalghj@arm.com>
* 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 <rguenther@suse.de>
* passes.c (execute_one_pass): Handle going out of SSA w/o

View File

@ -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

View File

@ -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.

View File

@ -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