https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99540

--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
As a fix maybe even better
--- gcc/config/aarch64/aarch64.c.jj     2021-03-19 10:14:18.302936161 +0100
+++ gcc/config/aarch64/aarch64.c        2021-03-19 13:33:35.367973092 +0100
@@ -4639,7 +4639,7 @@ aarch64_add_offset (scalar_int_mode mode
          if (can_create_pseudo_p ())
            {
              rtx coeff1 = gen_int_mode (factor, mode);
-             val = expand_mult (mode, val, coeff1, NULL_RTX, false, true);
+             val = expand_mult (mode, val, coeff1, NULL_RTX, true, true);
            }
          else
            {

I mean, for 2's complement target (GCC doesn't support any other), the
difference between non-widening/highpart signed and unsigned multiplication is
just in that flag_trapv case, for 64-bit x 64-bit -> 64-bit multiplication the
result bits are identical whether it is signed or unsigned and that is the
reason why we only have MULT in RTL and not SMULT and UMULT.

Reply via email to