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