scalapack
scalapack copied to clipboard
Build fails with strict-aliasing violations.
I tried building with these flags to optimize my build using LTO: -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing
I got these errors:
[1/887] Building C object CMakeFiles/scalapack.dir/SRC/pdlaiect.c.o
FAILED: CMakeFiles/scalapack.dir/SRC/pdlaiect.c.o
/usr/bin/mpicc -DAdd_ -Dscalapack_EXPORTS -march=native -fstack-protector-all -O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 -fstack-clash-protection -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wformat -Werror=format-security -fPIC -MD -MT CMakeFiles/scalapack.dir/SRC/pdlaiect.c.o -MF CMakeFiles/scalapack.dir/SRC/pdlaiect.c.o.d -o CMakeFiles/scalapack.dir/SRC/pdlaiect.c.o -c /var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c: In function ‘pdlaiectb_’:
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c:142:16: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
142 | *count = (*((int *)&tmp) >> 31) & 1;
| ~^~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c:146:21: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
146 | *count += ((*((int *)&tmp)) >> 31) & 1;
| ~^~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c: In function ‘pdlachkieee_’:
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c:270:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
270 | sbit1 = (*((int *)&pzero) >> 31) & 1;
| ~^~~~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c:271:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
271 | sbit2 = (*((int *)&pinf) >> 31) & 1;
| ~^~~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c:294:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
294 | sbit1 = (*((int *)&nzero) >> 31) & 1;
| ~^~~~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c:295:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
295 | sbit2 = (*((int *)&ninf) >> 31) & 1;
| ~^~~~~~~~~~~~~
cc1: some warnings being treated as errors
[2/887] Building C object CMakeFiles/scalapack.dir/SRC/pslaiect.c.o
FAILED: CMakeFiles/scalapack.dir/SRC/pslaiect.c.o
/usr/bin/mpicc -DAdd_ -Dscalapack_EXPORTS -march=native -fstack-protector-all -O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 -fstack-clash-protection -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wformat -Werror=format-security -fPIC -MD -MT CMakeFiles/scalapack.dir/SRC/pslaiect.c.o -MF CMakeFiles/scalapack.dir/SRC/pslaiect.c.o.d -o CMakeFiles/scalapack.dir/SRC/pslaiect.c.o -c /var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c: In function ‘pslaiect_’:
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c:136:16: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
136 | *count = (*((int *)&tmp) >> 31) & 1;
| ~^~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c:140:21: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
140 | *count += ((*((int *)&tmp)) >> 31) & 1;
| ~^~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c: In function ‘pslachkieee_’:
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c:198:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
198 | sbit1 = (*((int *)&pzero) >> 31) & 1;
| ~^~~~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c:199:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
199 | sbit2 = (*((int *)&pinf) >> 31) & 1;
| ~^~~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c:219:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
219 | sbit1 = (*((int *)&nzero) >> 31) & 1;
| ~^~~~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c:220:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
220 | sbit2 = (*((int *)&ninf) >> 31) & 1;
| ~^~~~~~~~~~~~~
cc1: some warnings being treated as errors
ninja: build stopped: cannot make progress due to previous errors.
Note that the -Werror=* used is because these indicate cases where the compiler tries to optimize based on assuming that UB cannot exist, and as a result miscompiles code with UB. strict-aliasing in particular can be very bad even without LTO, but LTO makes it much worse.
Previously reported downstream: https://bugs.gentoo.org/862924 Full build logs: build.log