https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115864
--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Yes doing: uint32_t q = ((uint32_t)ah) * ((uint32_t)bl); uint32_t r = ((uint32_t)al) * ((uint32_t)bh); "Fixes" the issue by avoiding signed integer overflows (which is undefined).