bitintlower: Handle PAREN_EXPR [PR117459]

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.

2024-11-19  Jakub Jelinek  <jakub@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.
This commit is contained in:
Jakub Jelinek 2024-11-19 10:25:57 +01:00 committed by Jakub Jelinek
parent 758d2b3d3e
commit 600cab162c
2 changed files with 31 additions and 1 deletions

View File

@ -2143,6 +2143,7 @@ bitint_large_huge::handle_stmt (gimple *stmt, tree idx)
idx), idx),
gimple_assign_rhs2 (stmt), idx); gimple_assign_rhs2 (stmt), idx);
case SSA_NAME: case SSA_NAME:
case PAREN_EXPR:
case INTEGER_CST: case INTEGER_CST:
return handle_operand (gimple_assign_rhs1 (stmt), idx); return handle_operand (gimple_assign_rhs1 (stmt), idx);
CASE_CONVERT: CASE_CONVERT:
@ -5609,7 +5610,9 @@ bitint_large_huge::lower_stmt (gimple *stmt)
|| gimple_store_p (stmt) || gimple_store_p (stmt)
|| gimple_assign_load_p (stmt) || gimple_assign_load_p (stmt)
|| eq_p || 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); lhs = lower_mergeable_stmt (stmt, cmp_code, cmp_op1, cmp_op2);
if (!eq_p) if (!eq_p)

View File

@ -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
}