diff --git a/gcc/testsuite/gcc.dg/pr110731.c b/gcc/testsuite/gcc.dg/pr110731.c new file mode 100644 index 00000000000..7da905d3163 --- /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 c6a9e2d49b2..81b7be85fe3 100644 --- a/gcc/wide-int.cc +++ b/gcc/wide-int.cc @@ -1911,9 +1911,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;