https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90798

            Bug ID: 90798
           Summary: An ICE with -Os
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: zhonghao at pku dot org.cn
  Target Milestone: ---

My gcc is 10.0.0, and my code is:

#include <x86intrin.h>
#include <stdint.h>

void gather_swizzle(const __m128i *indices, float *buffer)
{
 __m128i idx = *indices++;
 uint32_t idx0 = static_cast<uint32_t>(_mm_extract_epi32(idx, 0));
 uint32_t idx1 = static_cast<uint32_t>(_mm_extract_epi32(idx, 1));
 uint32_t idx2 = static_cast<uint32_t>(_mm_extract_epi32(idx, 2));
 uint32_t idx3 = static_cast<uint32_t>(_mm_extract_epi32(idx, 3));

 float sum0 = buffer[idx0];
 float sum1 = buffer[idx1];
 float sum2 = buffer[idx2];
 float sum3 = buffer[idx3];

 buffer[0] = sum0;
 buffer[1] = sum1;
 buffer[2] = sum2;
 buffer[3] = sum3;
}

Gcc crashes, with the following parameters:

g++ -Os | g++ -O3 | g++ -O1 | gcc -Os | gcc -O3 | gcc -O1 | 

n file included from
/opt/compiler-explorer/gcc-trunk-20190609/lib/gcc/x86_64-linux-gnu/10.0.0/include/immintrin.h:37,

                 from
/opt/compiler-explorer/gcc-trunk-20190609/lib/gcc/x86_64-linux-gnu/10.0.0/include/x86intrin.h:32,

                 from <source>:1:

/opt/compiler-explorer/gcc-trunk-20190609/lib/gcc/x86_64-linux-gnu/10.0.0/include/smmintrin.h:
In function 'void gather_swizzle(const __m128i*, float*)':

/opt/compiler-explorer/gcc-trunk-20190609/lib/gcc/x86_64-linux-gnu/10.0.0/include/smmintrin.h:447:1:
error: inlining failed in call to 'always_inline' 'int
_mm_extract_epi32(__m128i, int)': target specific option mismatch

  447 | _mm_extract_epi32 (__m128i __X, const int __N)

      | ^~~~~~~~~~~~~~~~~

<source>:10:57: note: called from here

   10 |  uint32_t idx3 = static_cast<uint32_t>(_mm_extract_epi32(idx, 3));

      |                                        ~~~~~~~~~~~~~~~~~^~~~~~~~

In file included from
/opt/compiler-explorer/gcc-trunk-20190609/lib/gcc/x86_64-linux-gnu/10.0.0/include/immintrin.h:37,

                 from
/opt/compiler-explorer/gcc-trunk-20190609/lib/gcc/x86_64-linux-gnu/10.0.0/include/x86intrin.h:32,

                 from <source>:1:

/opt/compiler-explorer/gcc-trunk-20190609/lib/gcc/x86_64-linux-gnu/10.0.0/include/smmintrin.h:447:1:
error: inlining failed in call to 'always_inline' 'int
_mm_extract_epi32(__m128i, int)': target specific option mismatch

  447 | _mm_extract_epi32 (__m128i __X, const int __N)

      | ^~~~~~~~~~~~~~~~~

<source>:9:57: note: called from here

    9 |  uint32_t idx2 = static_cast<uint32_t>(_mm_extract_epi32(idx, 2));

      |                                        ~~~~~~~~~~~~~~~~~^~~~~~~~

In file included from
/opt/compiler-explorer/gcc-trunk-20190609/lib/gcc/x86_64-linux-gnu/10.0.0/include/immintrin.h:37,

                 from
/opt/compiler-explorer/gcc-trunk-20190609/lib/gcc/x86_64-linux-gnu/10.0.0/include/x86intrin.h:32,

                 from <source>:1:

/opt/compiler-explorer/gcc-trunk-20190609/lib/gcc/x86_64-linux-gnu/10.0.0/include/smmintrin.h:447:1:
error: inlining failed in call to 'always_inline' 'int
_mm_extract_epi32(__m128i, int)': target specific option mismatch

  447 | _mm_extract_epi32 (__m128i __X, const int __N)

      | ^~~~~~~~~~~~~~~~~

<source>:8:57: note: called from here

    8 |  uint32_t idx1 = static_cast<uint32_t>(_mm_extract_epi32(idx, 1));

      |                                        ~~~~~~~~~~~~~~~~~^~~~~~~~

In file included from
/opt/compiler-explorer/gcc-trunk-20190609/lib/gcc/x86_64-linux-gnu/10.0.0/include/immintrin.h:37,

                 from
/opt/compiler-explorer/gcc-trunk-20190609/lib/gcc/x86_64-linux-gnu/10.0.0/include/x86intrin.h:32,

                 from <source>:1:

/opt/compiler-explorer/gcc-trunk-20190609/lib/gcc/x86_64-linux-gnu/10.0.0/include/smmintrin.h:447:1:
error: inlining failed in call to 'always_inline' 'int
_mm_extract_epi32(__m128i, int)': target specific option mismatch

  447 | _mm_extract_epi32 (__m128i __X, const int __N)

      | ^~~~~~~~~~~~~~~~~

<source>:7:57: note: called from here

    7 |  uint32_t idx0 = static_cast<uint32_t>(_mm_extract_epi32(idx, 0));

      |                                        ~~~~~~~~~~~~~~~~~^~~~~~~~

Compiler returned: 1

Reply via email to