On 32-bit x86, using a sNaN value as a function call argument may turn it into a qNaN (whilst raising an INVALID exception) already at the call site, which is unexpected. This is due to using a flds, fstps sequence (which according to my old Intel manuals correctly processes a float and double sNaN value in this way), instead of just using a movl for pushing the sNaN value onto the stack. This only happens for some optimization flags together with volatile declaration of the variable keeping the sNaN value; see the discussion in <http://news.gmane.org/find-root.php?message_id=%3c87txonzdtd.fsf%40kepler.schwinge.homeip.net%3e> and thereabouts, and the SNAN_TESTS_float and SNAN_TESTS_double usage in glibc commit 5aa4a1a1fd742479818a668d42d91ca9ec4a6318, <http://sourceware.org/git/?p=glibc.git;a=commitdiff;h=5aa4a1a1fd742479818a668d42d91ca9ec4a6318>.
Dup of bug 57484. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57484#c12 . *** This bug has been marked as a duplicate of bug 57484 ***
In my view, this is a valid quality-of-implementation bug that should be fixed: SFmode and DFmode values should only be loaded into x87 FPRs when arithmetic is to be carried out on them.