https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69400
--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Richard Biener from comment #6) > so in int_const_binop we end up with val = {-2 }, len = 1 (that's still I think already this is wrong, because I think val = { -2 }, len = 1 for precision 128 is 0xfffffffffffffffffffffffffffffffeU128 rather than 0xfffffffffffffffeU128. But I could be wrong. It would be nice if all the rules were clearly documented. At least, if I e.g. in the testcase swap -2 with 0xffffffffffffffffULL, so that int_const_binop_1 converts the (__uint128_t) -2 to wide_int when calling wi::mod_trunc, then arg2 is: $10 = {<wide_int_storage> = {val = {-2, 0, 140737488343280}, len = 1, precision = 128}, static is_sign_extended = <optimized out>} Thus, IMNSHO { -2 }, 1 is (__uint128_t) -2 rather than (__uint128_t) -2ULL.