From jeroen.ooms at stat.ucla.edu  Mon Sep 14 23:19:58 2015
From: jeroen.ooms at stat.ucla.edu (Jeroen Ooms)
Date: Mon, 14 Sep 2015 23:19:58 +0200
Subject: [Rd] Optimization bug when byte compiling with gcc 5.2.0 on
	windows
In-Reply-To: <CABFfbXtsZwUhQGdVG-3OAq_bReZGNkSJ2SRVpXkrFT06a7AuYg@mail.gmail.com>
References: <CABFfbXsdT2-jBdaqr4oCtZ2AvBWZ++tQHa49DyWc=m3G_qE7bw@mail.gmail.com>
	<alpine.LFD.2.20.1509140826370.19382@itasca.stat.uiowa.edu>
	<55F6D6A7.3060603@gmail.com>
	<CABFfbXtsZwUhQGdVG-3OAq_bReZGNkSJ2SRVpXkrFT06a7AuYg@mail.gmail.com>
Message-ID: <CABFfbXtcL-Lv=yJwSQeoZs5BxHsSfLen8tE1j2dDe2zSHYYzQw@mail.gmail.com>

On Mon, Sep 14, 2015 at 8:49 PM, Jeroen Ooms <jeroen.ooms at stat.ucla.edu> wrote:

> I tested this hypothesis by replacing '__GNUC__ <= 4' with '__GNUC__
> <= 5' and rebuilding R, but this introduces a whole lot of problems
> that were not there before. In particular R crashes when using the
> graphics device, which it did not without this fix.

I found that the problem goes away when we use isnanl() instead of
isnan(). This is very similar to the problem we have for R_pow() where
we need to use powl() instead of pow() for recent versions mingw-w64
(this still needs to be patched in r-devel).

So the full solution is:

#if (defined(_WIN32) || defined(_WIN64)) && defined(__GNUC__)
# define R_sqrt(x) (isnanl(x) ? x : sqrt(x))
#else
# define R_sqrt sqrt
#endif

Below the relevant mingw-w64 sources:

https://github.com/Alexpux/mingw-w64/blob/master/mingw-w64-crt/math/isnan.c
https://github.com/Alexpux/mingw-w64/blob/master/mingw-w64-crt/math/isnanf.c
https://github.com/Alexpux/mingw-w64/blob/master/mingw-w64-crt/math/isnanl.c

I think mingw-w64 takes powl from glibc.



[Rd] Optimization bug when byte compiling with gcc 5.2.0 on windows
Jeroen Ooms