https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71276
Bug ID: 71276 Summary: frndint generation should not depend on flag_unsafe_math_optimizations Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: jsm28 at gcc dot gnu.org Target Milestone: --- Target: i?86-*-* x86_64-*-* When using x87 floating point, the x86 back end supports generating inline code sequences using the frndint instruction for the rint / ceil / floor / trunc built-in functions (for SFmode, DFmode and XFmode). But those are conditioned on flag_unsafe_math_optimizations. There is no need for them to be conditioned on flag_unsafe_math_optimizations. For rint, frndint is fully correct. For the others, the only issue is that it raises "inexact" for non-integer operands, whereas TS 18661-1 specifies that these functions should not raise "inexact". But: (a) We don't have any options to select TS 18661-1 requirements, and C99 and C11 leave it unspecified whether "inexact" is raised, so raising it is OK for currently supported standards. (b) Even with TS 18661-1 requirements, it would be OK to use this instruction if !flag_trapping_math. (c) The documentation of the .md file patterns for ceil / floor / trunc says nothing about whether "inexact" is raised or not. So these inlines should be enabled whenever x87 floating point is in use (maybe subject to code size considerations; you'd need to check how long the sequences setting / restoring the rounding mode are compared to a call). And future TS 18661-1 support could disable those for ceil / floor / trunc if flag_ts_18661_1 && flag_trapping_math.