aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-11-19 10:25:57 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2024-11-19 10:25:57 +0100
commit600cab162c561c3061317c998972b0ed1b681d5b (patch)
tree59dfdc4f49c19effc3d1e301405dffe2020bb760
parent758d2b3d3e28c831c79f5c18727d149c81896434 (diff)
downloadgcc-600cab162c561c3061317c998972b0ed1b681d5b.zip
gcc-600cab162c561c3061317c998972b0ed1b681d5b.tar.gz
gcc-600cab162c561c3061317c998972b0ed1b681d5b.tar.bz2
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.
-rw-r--r--gcc/gimple-lower-bitint.cc5
-rw-r--r--gcc/testsuite/gcc.dg/torture/bitint-74.c27
2 files changed, 31 insertions, 1 deletions
diff --git a/gcc/gimple-lower-bitint.cc b/gcc/gimple-lower-bitint.cc
index 6fc4253..ea56c4c 100644
--- a/gcc/gimple-lower-bitint.cc
+++ b/gcc/gimple-lower-bitint.cc
@@ -2143,6 +2143,7 @@ bitint_large_huge::handle_stmt (gimple *stmt, tree idx)
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 *stmt)
|| 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)
diff --git a/gcc/testsuite/gcc.dg/torture/bitint-74.c b/gcc/testsuite/gcc.dg/torture/bitint-74.c
new file mode 100644
index 0000000..f9abe23
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/bitint-74.c
@@ -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
+}