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