diff --git a/gcc/testsuite/gcc.dg/pr110731.c b/gcc/testsuite/gcc.dg/pr110731.c new file mode 100644 index 0000000000000000000000000000000000000000..7da905d3163f757451b548da3173e86c5f599582 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr110731.c @@ -0,0 +1,17 @@ +/* PR tree-optimization/110731 */ +/* { dg-do run { target int128 } } */ +/* { dg-options "-O2" } */ + +__int128 +foo (void) +{ + struct S { __int128 f : 119; } s = { ((__int128) -18014398509481984) << 64 }; + return s.f / 2; +} + +int +main () +{ + if (foo () != (((__int128) -9007199254740992) << 64)) + __builtin_abort (); +} diff --git a/gcc/wide-int.cc b/gcc/wide-int.cc index 8c8175765053e8f1135233c5249c96c982b8c2ef..d31f9fe9b7499f06446702402241c6cd8b4e42a1 100644 --- a/gcc/wide-int.cc +++ b/gcc/wide-int.cc @@ -1888,9 +1888,9 @@ wi::divmod_internal (HOST_WIDE_INT *quotient, unsigned int *remainder_len, } wi_unpack (b_dividend, dividend.get_val (), dividend.get_len (), - dividend_blocks_needed, dividend_prec, sgn); + dividend_blocks_needed, dividend_prec, UNSIGNED); wi_unpack (b_divisor, divisor.get_val (), divisor.get_len (), - divisor_blocks_needed, divisor_prec, sgn); + divisor_blocks_needed, divisor_prec, UNSIGNED); m = dividend_blocks_needed; b_dividend[m] = 0;