https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118931
--- Comment #2 from Li Pan <pan2.li at intel dot com> --- 13 │ int main () 14 │ { 15 │ vector(16) unsigned char vect__3.5; 16 │ unsigned char a_lsm.2; 17 │ long long int _5; 18 │ vector(16) unsigned char _13; 19 │ unsigned char _29; 20 │ 21 │ <bb 2> [local count: 71618576]: 22 │ a_lsm.2_20 = a; 23 │ _13 = {a_lsm.2_20, a_lsm.2_20, a_lsm.2_20, a_lsm.2_20, a_lsm.2_20, a_lsm.2_20, a_lsm.2_20, a_lsm.2_20, a_lsm.2_20, a_lsm.2_20, a_lsm.2_20, a_lsm.2_20, a_lsm.2_20, a_lsm.2_20, a_lsm.2_20, a_lsm.2_20}; 24 │ vect__3.5_25 = _13 * { 151, 17, 7, 33, 119, 49, 231, 65, 87, 81, 199, 97, 55, 113, 167, 129 }; 25 │ _29 = .VEC_EXTRACT (vect__3.5_25, 13); 26 │ a = _29; 27 │ _5 = (long long int) _29; 28 │ __builtin_printf ("%llu\n", _5); 29 │ return 0; 30 │ 31 │ } It is correct from the tree-optimized, (unsigned char )(109 * 113) = 29 is what we expect. Should be a backend issue.