[Rd] Build failure on powerpc64
Martin Maechler
m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Wed Mar 25 10:00:52 CET 2020
>>>>> Martin Maechler
>>>>> on Tue, 17 Dec 2019 11:25:31 +0100 writes:
>>>>> Tom Callaway
>>>>> on Fri, 13 Dec 2019 11:06:25 -0500 writes:
>> An excellent question. It is important to remember two key
>> facts:
>> 1. With gcc on ppc64, long doubles exist, they can
>> be used, just not safely as constants (and maybe they
>> still can be used safely under specific conditions?).
>> 2. I am not an expert in either PowerPC64 or gcc. :)
>> Looking at connections.c, we have (in order):
>> * handling long double as a valid case in a switch statement checking size
>> * adding long double as a field in the u union define
>> * handling long double as a valid case in a switch statement checking size
>> * handling long double as a valid case in a switch statement checking size
>> * memcpy from the address of a long double
>> In format.c, we have (in order):
>> * conditionally creating private_nearbyintl for R_nearbyintl
>> * defining a static const long double tbl[]
>> * use exact scaling factor in long double precision
>> For most of these, it seems safe to leave them as is for ppc64. I would
>> have thought that the gcc compiler might have had issue with:
>> connections.c:
>> static long double ld1;
>> for (i = 0, j = 0; i < len; i++, j += size) {
>> ld1 = (long double) REAL(object)[i];
>> format.c:
>> static const long double tbl[] =
>> ... but it doesn't. Perhaps the original code at issue:
>> arithmetic.c:
>> static LDOUBLE q_1_eps = 1 / LDBL_EPSILON;
>> only makes gcc unhappy because of the very large value trying to be stored
>> in the static long double, which would make it span the "folded double" on
>> that architecture.
>> *****
>> It seems that the options are:
>> A) Patch the one place where the compiler determines it is not safe to use
>> a static long double on ppc64.
>> B) Treat PPC64 as a platform where it is never safe to use a static long
>> double
>> FWIW, I did run the test suite after applying my patch and all of the tests
>> pass on ppc64.
>> Tom
> Thank you, Tom.
> You were right... and only A) is needed.
> In the mean time I've also been CC'ed in a corresponding debian
> bug report on the exact same architecture.
> In the end, after explanation and recommendation by Tomas
> Kalibera, I've committed a slightly better change to R's
> sources, both in the R-devel (trunk) and the "R-3.6.x patched"
> branch: Via a macro, it continues to use long double also for
> the PPC 64 in this case:
> $ svn diff -c77587
> Index: src/main/arithmetic.c
> ===================================================================
> --- src/main/arithmetic.c (Revision 77586)
> +++ src/main/arithmetic.c (Revision 77587)
> @@ -176,8 +176,14 @@
> #endif
> }
> +
> #if HAVE_LONG_DOUBLE && (SIZEOF_LONG_DOUBLE > SIZEOF_DOUBLE)
> +# ifdef __PPC64__
> + // PowerPC 64 (when gcc has -mlong-double-128) fails constant folding with LDOUBLE
> +# define q_1_eps (1 / LDBL_EPSILON)
> +# else
> static LDOUBLE q_1_eps = 1 / LDBL_EPSILON;
> +# endif
> #else
> static double q_1_eps = 1 / DBL_EPSILON;
> #endif
> ------------- ------------- -------------
Now, Debian Bug#946836 has been reopened,
because __PPC64__ does not cover all powerpc architectures
and in their build farm they found non-PPC64 cases which also
needed to switch from a static variable to a macro,
the suggestion being to replace __PPC64__ by __powerpc__
which is what I'm going to commit now (for R-3.6.x patched and
for R-devel !).
I hope that these macros are +- universally working and not too
much depending on the exact compiler flavor.
Martin Maechler
ETH Zurich and R Core team
More information about the R-devel
mailing list