[Rd] R 4.0.1-4.0.5 built with Intel Composer 19.0-19.1.1, error in "make check" on CentOS 7.7-7.9
Tomas Kalibera
tom@@@k@||ber@ @end|ng |rom gm@||@com
Sat Apr 17 18:55:00 CEST 2021
Thank you Ryan and Ivan for reporting and debugging this. Godbolt.org
shows that icc 19.0.1 with -O2 -ipo (inter-procedural optimizations) is
too smart and optimizes this stack growth detection code so that it
returns incorrect result on x86_64. Detecting stack growth from C is
tricky - in principle, it cannot be done correctly in a portable way. As
the compilers are getting more sophisticated, it is increasingly more
difficult. We'll have to improve the test, perhaps re-using some or
completely remove it and assume stack grows down. I doubt anyone today
would run a real, non-emulated, system running R where stack would grow up.
(and yes, the elif conditional should use 255)
Tomas
On 4/17/21 11:40 AM, Ivan Krylov wrote:
> On Fri, 16 Apr 2021 18:39:04 +0000
> Ryan Novosielski <novosirj using rutgers.edu> wrote:
>
>> I guess there’s probably some mode of m4 I could run against that and
>> see if there’s any indication?
> Here's a shell script that should be doing the same thing that
> R's .../configure does, but a bit more verbose:
>
> -----------------------------------8<-----------------------------------
> #!/bin/sh
> cat > conftest1.c <<EOF
> #include <stdint.h>
> uintptr_t dummy_ii(void)
> {
> int ii;
>
> /* This is intended to return a local address. We could just return
> (uintptr_t) &ii, but doing it indirectly through ii_addr avoids
> a compiler warning (-Wno-return-local-addr would do as well).
> */
> volatile uintptr_t ii_addr = (uintptr_t) ⅈ
> return ii_addr;
> }
> EOF
> cat > conftest.c <<EOF
> #include <stdio.h>
> #include <stdint.h>
> extern uintptr_t dummy_ii(void);
>
> typedef uintptr_t (*dptr_type)(void);
> volatile dptr_type dummy_ii_ptr;
>
> int main(int ac, char **av)
> {
> int i;
> dummy_ii_ptr = dummy_ii;
>
> /* call dummy_ii via a volatile function pointer to prevent
> inlinining in case the tests are accidentally built with
> LTO */
> uintptr_t ii = dummy_ii_ptr();
> #ifndef EXACTLY_AS_R_CONFIGURE
> printf(
> "main = %p, sub = %p, main %c sub, ret = %d\n",
> &i, (void*)ii,
> ((uintptr_t)&i > ii) ? '>' : ((uintptr_t)&i < ii) ? '<' : '=',
> ((uintptr_t)&i > ii) ? 1 : -1
> );
> #endif
> /* 1 is downwards */
> return ((uintptr_t)&i > ii) ? 1 : -1;
> }
> EOF
> echo "${CC:=cc} ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} ${MAIN_LDFLAGS}" \
> "-o conftest conftest.c conftest1.c"
> ${CC} ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} ${MAIN_LDFLAGS} -o conftest \
> conftest.c conftest1.c || exit $?
> echo ./conftest
> ./conftest
> ret=$?
> echo "./conftest exited with $ret"
> if test ${ret} = 1; then
> echo r_cv_cstack_direction=down
> elif test ${ret} = 1; then
> echo r_cv_cstack_direction=up
> fi
> exit 0
> -----------------------------------8<-----------------------------------
>
> Please run it similarly to the way you run .../configure:
>
> export CC=icc
> export CFLAGS="-O3 -ipo -qopenmp -axAVX,CORE-AVX2,CORE-AVX512"
> sh .../runme.sh
>
> Does it give the right answer, that is, r_cv_cstack_direction=down?
> Does the answer change if you add -DEXACTLY_AS_R_CONFIGURE to CFLAGS?
> If the answer is always "down" and you have reused the build directory
> (keeping the config.site file between .../configure runs), this is going
> to be hard to track down. If you manage to get the "up" answer, it
> should be possible to tweak the test until ICC doesn't optimise it to
> the point of confusing the stack growth direction.
>
> Either way, I think that the elif branch in the R_STACK_DIRECTION test
> should be testing for $? = 255, not 1. I'm almost convinced that the
> behaviour would be incorrect on platforms where the test exits with -1.
>
More information about the R-devel
mailing list