https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108787
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Correction, -fPIC isn't important. Even more reduced testcase: __attribute__((noipa)) unsigned __int128 foo (unsigned long long h0, unsigned long long h1, unsigned long long h2, unsigned long long r0, unsigned long long s1, unsigned long long s2) { unsigned __int128 d0, d; d0 = ((unsigned __int128) h0 * r0); d = ((unsigned __int128) h1 * s2); d0 += d; d = ((unsigned __int128) h2 * s1); d0 += d; return d0; } int main () { if (__CHAR_BIT__ != 8 || __SIZEOF_LONG_LONG__ != 8 || __SIZEOF_INT128__ != 16) return 0; unsigned __int128 x = foo (0x3efe88da491ULL, 0xd105e9b4a44ULL, 0x4efa677b3dbULL, 0x42c052bac7bULL, 0x99638a13199cULL, 0x56b640d064ULL); if ((unsigned long long) (x >> 64) != 0x000000000309ff93ULL || (unsigned long long) x != 0xbd5c98fdf2bdbcafULL) __builtin_abort (); return 0; } The high 64-bits of the result are miscomputed.