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

            Bug ID: 85317
           Summary: missing constant propagation on _mm(256)_movemask_*
           Product: gcc
           Version: 8.0.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kretz at kde dot org
  Target Milestone: ---

The following test case shows that the movemask intrinsics are are a barrier
for constant propagation. All of these functions should have a trivial constant
return value.

#include <x86intrin.h>

// return 0:
int i0() { return _mm_movemask_epi8( __m128i()); }
int s0() { return _mm_movemask_ps  ( __m128 ()); }
int d0() { return _mm_movemask_pd  ( __m128d()); }
int I0() { return _mm256_movemask_epi8( __m256i()); }
int S0() { return _mm256_movemask_ps  ( __m256 ()); }
int D0() { return _mm256_movemask_pd  ( __m256d()); }

int x2 () { return _mm_movemask_pd     ((__m128d)~__m128i()); } // return 0x3
int x4 () { return _mm_movemask_ps     ((__m128 )~__m128i()); } // return 0xf
int x4_() { return _mm256_movemask_pd  ((__m256d)~__m256i()); } // return 0xf
int x8 () { return _mm256_movemask_ps  ((__m256 )~__m256i()); } // return 0xff
int x16() { return _mm_movemask_epi8   (~__m128i()); } // return 0xffff
int x32() { return _mm256_movemask_epi8(~__m256i()); } // return 0xffffffff

Clang supports the optimization at -O1: https://godbolt.org/g/e6CVmR

Reply via email to