https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101129
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Optimized difference: --- pr101129.c.244t.optimized.r11-5838 2021-06-18 22:40:20.915971652 +0200 +++ pr101129.c.244t.optimized.r11-5839 2021-06-18 22:40:34.739789553 +0200 @@ -8,6 +8,7 @@ void foo0 (u32 u32_0, U * ret) __int128 _1; vector(16) unsigned char _2; unsigned char _3; + vector(16) <signed-boolean:8> _4; vector(16) signed char _5; __int128 _6; __int128 _7; @@ -31,7 +32,8 @@ void foo0 (u32 u32_0, U * ret) _14 = u32_0_13(D) & 4; _3 = (unsigned char) _14; _2 = {_3, _3, _3, _3, _3, _3, _3, _3, _3, _3, _3, _3, _3, _3, _3, _3}; - _5 = .VCONDU (_2, { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 108); + _4 = _2 < { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + _5 = VIEW_CONVERT_EXPR<vector(16) signed char>(_4); _6 = VIEW_CONVERT_EXPR<__int128>(_5); u128_2_15 = _1 * _6; _7 = u128_2_15 >> 64; Assembly difference: --- pr101129.s.r11-5838 2021-06-18 22:40:20.919971599 +0200 +++ pr101129.s.r11-5839 2021-06-18 22:40:34.743789500 +0200 @@ -14,19 +14,16 @@ foo0: .localentry foo0,.-foo0 rlwinm 9,3,0,29,29 mtvsrd 32,9 - vspltb 0,0,7 + vspltb 1,0,7 addis 9,2,.LC0@toc@ha addi 9,9,.LC0@toc@l - lxvd2x 33,0,9 - vcmpgtub 0,1,0 - addi 9,1,-16 - xxpermdi 32,32,32,2 - stxvd2x 32,0,9 - ld 9,-8(1) - ld 10,-16(1) + lxvd2x 32,0,9 + vcmpgtub 0,0,1 + mfvsrd 11,32 + xxpermdi 0,32,32,3 + mfvsrd 10,0 + add 10,11,10 mulld 10,10,3 - mulhdu 3,3,9 - add 10,10,3 addis 9,2,.LANCHOR0@toc@ha lbz 9,.LANCHOR0@toc@l(9) add 10,10,9