https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80161
Bug ID: 80161 Summary: const argument hidden from AVX intrinsics due to OpenMP outlining Product: gcc Version: 7.0.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: jeff.science at gmail dot com Target Milestone: --- I get "error: the last argument must be scale 1, 2, 4, 8" when the argument is "const int scale = 1", only when OpenMP is active. Having seen similar issues in other compilers, I suspect that the OpenMP outlining creates an indirection in which the constant properties of "scale" are lost and thus not visible to the pass that parses intrinsics. I know that manually inlining and the preprocessor provide a way to solve this, but neither of those meets other requirements. # Source Code $ cat gccbug.c #include "emmintrin.h" #include "immintrin.h" void copy_vgatherdpd128(size_t n, const double * restrict a, double * restrict b) { __m128i vindex = _mm_set_epi32(-1,-1,8,0); const int scale = 1; #ifdef _OPENMP #pragma omp parallel for #endif for (size_t i=0; i<n; i+=2) { __m128d t = _mm_i32gather_pd( &(a[i]), vindex, scale ); _mm_storel_pd( &(b[i ]), t); _mm_storeh_pd( &(b[i+1]), t); } } # Build without OpenMP [jrhammon@esgmonster simd-memtest]$ gcc-7 -O3 -march=core-avx2 -std=gnu11 -g3 -Wall -c gccbug.c -o gccbug.o # Build with OpenMP [jrhammon@esgmonster simd-memtest]$ gcc-7 -O3 -march=core-avx2 -std=gnu11 -g3 -Wall -fopenmp -c gccbug.c -o gccbug.o In file included from /opt/gcc/HEAD/lib/gcc/x86_64-pc-linux-gnu/7.0.1/include/immintrin.h:43:0, from gccbug.c:2: /opt/gcc/HEAD/lib/gcc/x86_64-pc-linux-gnu/7.0.1/include/avx2intrin.h: In function ‘copy_vgatherdpd128._omp_fn.0’: /opt/gcc/HEAD/lib/gcc/x86_64-pc-linux-gnu/7.0.1/include/avx2intrin.h:1254:10: error: the last argument must be scale 1, 2, 4, 8 return (__m128d) __builtin_ia32_gathersiv2df (_mm_undefined_pd (), ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ __base, ~~~~~~~ (__v4si)__index, ~~~~~~~~~~~~~~~~ __mask, ~~~~~~~ __scale); ~~~~~~~~ # GCC details I compiled GCC from Git HEAD today. $ gcc-7 -v Using built-in specs. COLLECT_GCC=gcc-7 COLLECT_LTO_WRAPPER=/opt/gcc/HEAD/bin/../libexec/gcc/x86_64-pc-linux-gnu/7.0.1/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: /opt/gcc//git/configure --program-suffix=-7 --disable-multilib --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --enable-languages=c,c++,fortran --with-tune=native --enable-bootstrap --enable-lto --enable-gold=yes --enable-ld=yes --prefix=/opt/gcc//HEAD Thread model: posix gcc version 7.0.1 20170323 (experimental) (GCC) $ gcc-7 --version gcc-7 (GCC) 7.0.1 20170323 (experimental) Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.