https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70333
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
4.9 had
if (tcode == code)
{
double_int mul;
bool overflow_p;
unsigned prec = TYPE_PRECISION (ctype);
bool uns = TYPE_UNSIGNED (ctype);
double_int diop1 = tree_to_double_int (op1).ext (prec, uns);
double_int dic = tree_to_double_int (c).ext (prec, uns);
mul = diop1.mul_with_sign (dic, false, &overflow_p);
overflow_p = ((!uns && overflow_p)
| TREE_OVERFLOW (c) | TREE_OVERFLOW (op1));
if (!double_int_fits_to_tree_p (ctype, mul)
&& ((uns && tcode != MULT_EXPR) || !uns))
overflow_p = 1;
if (!overflow_p)
return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
double_int_to_tree (ctype, mul));
where double_int_to_tree does not do any kind of extension. Given it
unconditonally uses an unsinged multiplication you can see it as a
zero-extension.