From murdoch.duncan at gmail.com  Mon Sep 14 16:16:07 2015
From: murdoch.duncan at gmail.com (Duncan Murdoch)
Date: Mon, 14 Sep 2015 10:16:07 -0400
Subject: [Rd] Optimization bug when byte compiling with gcc 5.2.0 on
 windows
In-Reply-To: <alpine.LFD.2.20.1509140826370.19382@itasca.stat.uiowa.edu>
References: <CABFfbXsdT2-jBdaqr4oCtZ2AvBWZ++tQHa49DyWc=m3G_qE7bw@mail.gmail.com>
	<alpine.LFD.2.20.1509140826370.19382@itasca.stat.uiowa.edu>
Message-ID: <55F6D6A7.3060603@gmail.com>

On 14/09/2015 9:36 AM, luke-tierney at uiowa.edu wrote:
> I believe the issue is that on Windows the sqrt function when called
> with a NaN does not return the same NaN, as it does on other platforms.
> We have
>
> #if (defined(_WIN32) || defined(_WIN64)) && defined(__GNUC__) && \
>       __GNUC__ <= 4
> # define R_sqrt(x) (ISNAN(x) ? x : sqrt(x))
> #else
> # define R_sqrt sqrt
> #endif
>
> for implementing the SQRT opcode. I suspect this came from Duncan
> Murdoch; I don't know the reason for restricting to __GNUC__ <= 4.

That was an update to keep the workaround for gcc 4.9.2.  The previous 
code restricted the change to 4.6.x or earlier.

I think the reason for the earlier restriction is the assumption that 
eventually gcc will be fixed and this workaround won't be necessary, but 
apparently 5.2.0 still has the same problem.

Duncan Murdoch

>   I
> seem to recall that there are other places in the code where we have
> similar workarounds but I can't find them at the moment.
>
> The builtin sqrt always pretests with ISNAN.
>
> Best,
>
> luke
>
>
>
> On Mon, 14 Sep 2015, Jeroen Ooms wrote:
>
> > When building R-devel with gcc 5.2.0 (mingw-w64 v4) on Windows, make
> > check fails reg-tests-1b.R at the following check:
> >
> >  x <- c(1:2, NA)
> >  sx <- sd(x)
> >  !is.nan(sx)
> >
> > Here 'sx' should be 'NA' but it is 'NaN'. It turns out this problem
> > only appears when the function is byte compiled with optimization
> > level 3:
> >
> >  mysd <- function (x, na.rm = FALSE)
> >    sqrt(var(if (is.vector(x)) x else as.double(x), na.rm = na.rm))
> >
> >  mysd(x)
> >  # [1] NA
> >  compiler::cmpfun(mysd, list(optimize = 1L))(x)
> >  # [1] NA
> >  compiler::cmpfun(mysd, list(optimize = 2L))(x)
> >  # [1] NA
> >  compiler::cmpfun(mysd, list(optimize = 3L))(x)
> >  # [1] NaN
> >
> > The problem does not appear with gcc 5.2.0 on Debian, and also not
> > with gcc 4.9.3 on Windows. Where do I start debugging this? The
> > disassembled output from the compiled functions is here:
> > https://gist.github.com/jeroenooms/3206945a6db6680a9c5c
> >
> > ______________________________________________
> > R-devel at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> >
>



[Rd] Optimization bug when byte compiling with gcc 5.2.0 on windows
Duncan Murdoch