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.

Reply via email to