https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104371
--- Comment #5 from Hongtao.liu <crazylht at gmail dot com> --- (In reply to Richard Biener from comment #1) > <bb 2> [local count: 1073741824]: > _2 = VIEW_CONVERT_EXPR<__v16qi>(x_3(D)); > _6 = _2 == { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; > _7 = VIEW_CONVERT_EXPR<vector(16) signed char>(_6); > _4 = __builtin_ia32_pmovmskb128 (_7); > _5 = _4 == 65535; > return _5; > > so likely one reason is the builtin and later UNSPEC for the movemask > operation. > Under AVX512BW & AVX512VL we can fold __builtin_ia32_pmovmskb128 to vector(16) <signed-boolean:1> temp_1 = _7 < { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } temp_2 = VIEW_CONVERT_EXPR<unsigned short> temp_1; ----- ???? _4 = zero_extend temp_2; but I'm not sure if VIEW_CONVERT_EXPR can be used between vector and integer type.