diff --git a/gcc/gimple-lower-bitint.cc b/gcc/gimple-lower-bitint.cc index ac7fa30d85bcf0d99e531514fa4564d533d9d2c9..672a9a33751ad611dcd847909f0b68b34e7f7c8e 100644 --- a/gcc/gimple-lower-bitint.cc +++ b/gcc/gimple-lower-bitint.cc @@ -869,7 +869,7 @@ bitint_large_huge::handle_operand (tree op, tree idx) && m_data[m_data_cnt + 1] == NULL_TREE)) { unsigned int prec = TYPE_PRECISION (TREE_TYPE (op)); - unsigned int rem = prec % (2 * limb_prec); + unsigned int rem = prec % ((m_upwards_2limb ? 2 : 1) * limb_prec); int ext; unsigned min_prec = bitint_min_cst_precision (op, ext); if (m_first) @@ -996,7 +996,7 @@ bitint_large_huge::handle_operand (tree op, tree idx) if (m_data[m_data_cnt + 1] == integer_type_node) { unsigned int prec = TYPE_PRECISION (TREE_TYPE (op)); - unsigned rem = prec % (2 * limb_prec); + unsigned rem = prec % ((m_upwards_2limb ? 2 : 1) * limb_prec); int ext = wi::neg_p (wi::to_wide (op)) ? -1 : 0; tree c = m_data[m_data_cnt]; unsigned min_prec = TYPE_PRECISION (TREE_TYPE (c)); diff --git a/gcc/testsuite/gcc.dg/torture/bitint-48.c b/gcc/testsuite/gcc.dg/torture/bitint-48.c new file mode 100644 index 0000000000000000000000000000000000000000..d6f845932ef2f6a51b42bbb99175f0a050181b7c --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/bitint-48.c @@ -0,0 +1,23 @@ +/* PR tree-optimization/113370 */ +/* { dg-do run { target bitint } } */ +/* { dg-options "-std=c23 -pedantic-errors" } */ +/* { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } } */ +/* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */ + +#if __BITINT_MAXWIDTH__ >= 255 +_BitInt(255) +foo (int s) +{ + return -(_BitInt(255)) 3 >> s; +} +#endif + +int +main () +{ +#if __BITINT_MAXWIDTH__ >= 255 + if (foo (51) != -1) + __builtin_abort (); +#endif + return 0; +}