https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104401
Bug ID: 104401 Summary: [x86] Failure to recognize min/max pattern using pcmp+pblendv Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: gabravier at gmail dot com Target Milestone: --- #include <smmintrin.h> __m128i min32(__m128i value, __m128i input) { return _mm_blendv_epi8(input, value, _mm_cmplt_epi32(value, input)); } With -O3 -msse4.1, GCC outputs this: min32(long long __vector(2), long long __vector(2)): movdqa xmm2, xmm0 movdqa xmm0, xmm1 movdqa xmm3, xmm1 pcmpgtd xmm0, xmm2 pblendvb xmm3, xmm2, xmm0 movdqa xmm0, xmm3 ret LLVM instead outputs this: min32(long long __vector(2), long long __vector(2)): pminsd xmm0, xmm1 ret The equivalent code with cmpgt used instead of cmplt can be optimized to pmaxsd.