Hi! The following patch handles PAREN_EXPR in bitint lowering, and handles it as an optimization barrier, so that temporary arithmetics from PAREN_EXPR isn't mixed with temporary arithmetics from outside of the PAREN_EXPR.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2024-11-19 Jakub Jelinek <ja...@redhat.com> PR middle-end/117459 * gimple-lower-bitint.cc (bitint_large_huge::handle_stmt, bitint_large_huge::lower_stmt): Handle PAREN_EXPR. * gcc.dg/torture/bitint-74.c: New test. --- gcc/gimple-lower-bitint.cc.jj 2024-11-18 15:37:35.344738882 +0100 +++ gcc/gimple-lower-bitint.cc 2024-11-18 17:25:19.795445544 +0100 @@ -2143,6 +2143,7 @@ bitint_large_huge::handle_stmt (gimple * idx), gimple_assign_rhs2 (stmt), idx); case SSA_NAME: + case PAREN_EXPR: case INTEGER_CST: return handle_operand (gimple_assign_rhs1 (stmt), idx); CASE_CONVERT: @@ -5609,7 +5610,9 @@ bitint_large_huge::lower_stmt (gimple *s || gimple_store_p (stmt) || gimple_assign_load_p (stmt) || eq_p - || mergeable_cast_p) + || mergeable_cast_p + || (is_gimple_assign (stmt) + && gimple_assign_rhs_code (stmt) == PAREN_EXPR)) { lhs = lower_mergeable_stmt (stmt, cmp_code, cmp_op1, cmp_op2); if (!eq_p) --- gcc/testsuite/gcc.dg/torture/bitint-74.c.jj 2024-11-18 17:39:23.611656932 +0100 +++ gcc/testsuite/gcc.dg/torture/bitint-74.c 2024-11-18 17:40:07.027050485 +0100 @@ -0,0 +1,27 @@ +/* PR middle-end/117459 */ +/* { dg-do run { target bitint } } */ +/* { dg-options "-std=c23" } */ +/* { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } } */ +/* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */ + +#if __BITINT_MAXWIDTH__ >= 255 +_BitInt(255) b, c, d; + +_BitInt(255) +foo () +{ + return __builtin_assoc_barrier (b + c) + d; +} +#endif + +int +main () +{ +#if __BITINT_MAXWIDTH__ >= 255 + b = 3162082328713384445049140446737468449630746270013462291267283007210433157591wb; + c = 12998515555477887328635550261966833804427562203752161174274777867442907371807wb; + d = 5016523343681809792116154509287659112784399275423992541459788346980443294044wb; + if (foo () != 21177121227873081565800845217991961366842707749189616007001849221633783823442wb) + __builtin_abort (); +#endif +} Jakub