diff --git a/gcc/gimple-lower-bitint.cc b/gcc/gimple-lower-bitint.cc index 13b9b205df7..fb03063f86e 100644 --- a/gcc/gimple-lower-bitint.cc +++ b/gcc/gimple-lower-bitint.cc @@ -4497,7 +4497,7 @@ bitint_large_huge::lower_mul_overflow (tree obj, gimple *stmt) size_one_node); insert_before (g); g = gimple_build_cond (NE_EXPR, idx_next, - size_int (endlimb + (cnt == 1)), + size_int (endlimb + (cnt == 2)), NULL_TREE, NULL_TREE); insert_before (g); edge true_edge, false_edge; diff --git a/gcc/testsuite/gcc.dg/torture/bitint-59.c b/gcc/testsuite/gcc.dg/torture/bitint-59.c new file mode 100644 index 00000000000..ef17424dfa8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/bitint-59.c @@ -0,0 +1,22 @@ +/* PR tree-optimization/114038 */ +/* { 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__ >= 129 +int +foo (unsigned _BitInt(63) x, unsigned _BitInt(129) y) +{ + return __builtin_mul_overflow_p (y, x, 0); +} +#endif + +int +main () +{ +#if __BITINT_MAXWIDTH__ >= 129 + if (!foo (90, 0x80000000000000000000000000000000uwb)) + __builtin_abort (); +#endif +}