diff options
author | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2020-11-24 19:30:01 +0100 |
---|---|---|
committer | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2020-11-24 19:30:01 +0100 |
commit | ce2d9549f2b2bcb70a1a6f8f4e776e1ed427546b (patch) | |
tree | 10849b39b5d59c00436188bd9cc475390b66a5ba /gcc/opts.c | |
parent | 1805dbc58bac78a823e9cff075b9dc993f29c360 (diff) | |
download | gcc-ce2d9549f2b2bcb70a1a6f8f4e776e1ed427546b.zip gcc-ce2d9549f2b2bcb70a1a6f8f4e776e1ed427546b.tar.gz gcc-ce2d9549f2b2bcb70a1a6f8f4e776e1ed427546b.tar.bz2 |
Revert: "Fix -ffast-math flags handling inconsistencies"
This reverts commit c4fa3728ab4f78984a549894e0e8c4d6a253e540,
which caused a regression in the default for flag_excess_precision.
2020-11-24 Ulrich Weigand <uweigand@de.ibm.com>
gcc/
PR tree-optimization/97970
* doc/invoke.texi (-ffast-math): Revert last change.
* opts.c: Revert last change.
Diffstat (limited to 'gcc/opts.c')
-rw-r--r-- | gcc/opts.c | 58 |
1 files changed, 26 insertions, 32 deletions
@@ -193,12 +193,10 @@ static void set_debug_level (enum debug_info_type type, int extended, const char *arg, struct gcc_options *opts, struct gcc_options *opts_set, location_t loc); -static void set_fast_math_flags (struct gcc_options *opts, - struct gcc_options *opts_set, int set); +static void set_fast_math_flags (struct gcc_options *opts, int set); static void decode_d_option (const char *arg, struct gcc_options *opts, location_t loc, diagnostic_context *dc); static void set_unsafe_math_optimizations_flags (struct gcc_options *opts, - struct gcc_options *opts_set, int set); static void enable_warning_as_error (const char *arg, int value, unsigned int lang_mask, @@ -2493,11 +2491,11 @@ common_handle_option (struct gcc_options *opts, break; case OPT_ffast_math: - set_fast_math_flags (opts, opts_set, value); + set_fast_math_flags (opts, value); break; case OPT_funsafe_math_optimizations: - set_unsafe_math_optimizations_flags (opts, opts_set, value); + set_unsafe_math_optimizations_flags (opts, value); break; case OPT_ffixed_: @@ -2878,44 +2876,44 @@ set_Wstrict_aliasing (struct gcc_options *opts, int onoff) /* The following routines are useful in setting all the flags that -ffast-math and -fno-fast-math imply. */ static void -set_fast_math_flags (struct gcc_options *opts, - struct gcc_options *opts_set, int set) +set_fast_math_flags (struct gcc_options *opts, int set) { - if (!opts->frontend_set_flag_unsafe_math_optimizations - && !opts_set->x_flag_unsafe_math_optimizations) + if (!opts->frontend_set_flag_unsafe_math_optimizations) { opts->x_flag_unsafe_math_optimizations = set; - set_unsafe_math_optimizations_flags (opts, opts_set, set); + set_unsafe_math_optimizations_flags (opts, set); } if (!opts->frontend_set_flag_finite_math_only) - SET_OPTION_IF_UNSET (opts, opts_set, flag_finite_math_only, set); + opts->x_flag_finite_math_only = set; if (!opts->frontend_set_flag_errno_math) - SET_OPTION_IF_UNSET (opts, opts_set, flag_errno_math, !set); - if (!opts->frontend_set_flag_cx_limited_range) - SET_OPTION_IF_UNSET (opts, opts_set, flag_cx_limited_range, set); - if (!opts->frontend_set_flag_excess_precision) - SET_OPTION_IF_UNSET (opts, opts_set, flag_excess_precision, - set ? EXCESS_PRECISION_FAST - : EXCESS_PRECISION_DEFAULT); - - // -ffast-math should also reset -frounding-math, but since this - // is off by default, there's nothing to do for now. + opts->x_flag_errno_math = !set; + if (set) + { + if (opts->frontend_set_flag_excess_precision == EXCESS_PRECISION_DEFAULT) + opts->x_flag_excess_precision + = 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) + opts->x_flag_rounding_math = 0; + if (!opts->frontend_set_flag_cx_limited_range) + opts->x_flag_cx_limited_range = 1; + } } /* When -funsafe-math-optimizations is set the following flags are set as well. */ static void -set_unsafe_math_optimizations_flags (struct gcc_options *opts, - struct gcc_options *opts_set, int set) +set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set) { if (!opts->frontend_set_flag_trapping_math) - SET_OPTION_IF_UNSET (opts, opts_set, flag_trapping_math, !set); + opts->x_flag_trapping_math = !set; if (!opts->frontend_set_flag_signed_zeros) - SET_OPTION_IF_UNSET (opts, opts_set, flag_signed_zeros, !set); + opts->x_flag_signed_zeros = !set; if (!opts->frontend_set_flag_associative_math) - SET_OPTION_IF_UNSET (opts, opts_set, flag_associative_math, set); + opts->x_flag_associative_math = set; if (!opts->frontend_set_flag_reciprocal_math) - SET_OPTION_IF_UNSET (opts, opts_set, flag_reciprocal_math, set); + opts->x_flag_reciprocal_math = set; } /* Return true iff flags in OPTS are set as if -ffast-math. */ @@ -2923,14 +2921,10 @@ bool fast_math_flags_set_p (const struct gcc_options *opts) { return (!opts->x_flag_trapping_math - && !opts->x_flag_signed_zeros - && opts->x_flag_associative_math - && opts->x_flag_reciprocal_math && 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_rounding_math - && opts->x_flag_cx_limited_range && opts->x_flag_excess_precision == EXCESS_PRECISION_FAST); } |