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.

Reply via email to