https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102124
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I think the bug is in vect_recog_widen_op_pattern. When we have half_type unsigned, for PLUS_EXPR, MULT_EXPR (and supposedly LSHIFT_EXPR) it is ok that itype is twice the precision and same sign as half_type, say unsigned char uc1 = 0xfe, uc2 = 0xff; int t1 = uc1, t2 = uc2; t1 + t2 (or t1 * t2) wants to perform the widening operation and then zero-extend to the result type. But MINUS_EXPR seems to be special, t1 - t2 is negative despite half_type being unsigned (and, even if type is unsigned, such as for unsigned u1 = uc1, u2 = uc2; u1 - u2 wants sign-extension from unsigned short (aka itype) to unsigned int (aka type) rather than zero-extension.