public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-8467] lower-bitint: Fix up VIEW_CONVERT_EXPR handling in lower_mergeable_stmt [PR113568]
@ 2024-01-27 12:07 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2024-01-27 12:07 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:3f5ac4696351c352980f8cd1b063df89894549c2

commit r14-8467-g3f5ac4696351c352980f8cd1b063df89894549c2
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Sat Jan 27 13:06:17 2024 +0100

    lower-bitint: Fix up VIEW_CONVERT_EXPR handling in lower_mergeable_stmt [PR113568]
    
    We generally allow merging mergeable stmts with some final cast (but not
    further casts or mergeable operations after the cast).  As some casts
    are handled conditionally, if (idx < cst) handle_operand (idx); else if
    idx == cst) handle_operand (cst); else ..., we must sure that e.g. the
    mergeable PLUS_EXPR/MINUS_EXPR/NEGATE_EXPR never appear in handle_operand
    called from such casts, because it ICEs on invalid SSA_NAME form (that part
    could be fixable by adding further PHIs) but also because we'd need to
    correctly propagate the overflow flags from the if to else if.
    So, instead lower_mergeable_stmt handles an outermost widening cast (or
    widening cast feeding outermost store) specially.
    The problem was similar to PR113408, that VIEW_CONVERT_EXPR tree is
    present in the gimple_assign_rhs1 while it is not for NOP_EXPR/CONVERT_EXPR,
    so the checks whether the outermost cast should be handled didn't handle
    the VCE case and so handle_plus_minus was called from the conditional
    handle_cast.
    
    2024-01-27  Jakub Jelinek  <jakub@redhat.com>
    
            PR tree-optimization/113568
            * gimple-lower-bitint.cc (bitint_large_huge::lower_mergeable_stmt):
            For VIEW_CONVERT_EXPR use first operand of rhs1 instead of rhs1
            in the widening extension checks.
    
            * gcc.dg/bitint-78.c: New test.

Diff:
---
 gcc/gimple-lower-bitint.cc       |  2 ++
 gcc/testsuite/gcc.dg/bitint-78.c | 21 +++++++++++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/gcc/gimple-lower-bitint.cc b/gcc/gimple-lower-bitint.cc
index 79e3b55a55b5..6a7ce0ca5275 100644
--- a/gcc/gimple-lower-bitint.cc
+++ b/gcc/gimple-lower-bitint.cc
@@ -2401,6 +2401,8 @@ bitint_large_huge::lower_mergeable_stmt (gimple *stmt, tree_code &cmp_code,
       rhs1 = gimple_assign_rhs1 (store_operand
 				 ? SSA_NAME_DEF_STMT (store_operand)
 				 : stmt);
+      if (TREE_CODE (rhs1) == VIEW_CONVERT_EXPR)
+	rhs1 = TREE_OPERAND (rhs1, 0);
       /* Optimize mergeable ops ending with widening cast to _BitInt
 	 (or followed by store).  We can lower just the limbs of the
 	 cast operand and widen afterwards.  */
diff --git a/gcc/testsuite/gcc.dg/bitint-78.c b/gcc/testsuite/gcc.dg/bitint-78.c
new file mode 100644
index 000000000000..6c087575d45e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/bitint-78.c
@@ -0,0 +1,21 @@
+/* PR tree-optimization/113568 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-O2 -std=c23" } */
+
+signed char c;
+#if __BITINT_MAXWIDTH__ >= 464
+_BitInt(464) g;
+
+void
+foo (void)
+{
+  _BitInt(464) a[2] = {};
+  _BitInt(464) b;
+  while (c)
+    {
+      b = g + 1;
+      g = a[0];
+      a[0] = b;
+    }
+}
+#endif

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-01-27 12:07 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-27 12:07 [gcc r14-8467] lower-bitint: Fix up VIEW_CONVERT_EXPR handling in lower_mergeable_stmt [PR113568] Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).