public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-8995] lower-bitint: Ensure we don't get coalescing ICEs for (ab) SSA_NAMEs used in mul/div/mod [PR113567]
@ 2024-02-15  8:53 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2024-02-15  8:53 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:baa40971d1600672f3a1abf688905a70cf655c92

commit r14-8995-gbaa40971d1600672f3a1abf688905a70cf655c92
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Thu Feb 15 09:52:47 2024 +0100

    lower-bitint: Ensure we don't get coalescing ICEs for (ab) SSA_NAMEs used in mul/div/mod [PR113567]
    
    The build_bitint_stmt_ssa_conflicts hook has a special case for
    multiplication, division and modulo, where to ensure there is no overlap
    between lhs and rhs1/rhs2 arrays we make the lhs conflict with the
    operands.
    On the following testcase, we have
      # a_1(ab) = PHI <a_2(D)(0), a_3(ab)(3)>
    lab:
      a_3(ab) = a_1(ab) % 3;
    before lowering and this special case causes a_3(ab) and a_1(ab) to
    conflict, but the PHI requires them not to conflict, so we ICE because we
    can't find some partitioning that will work.
    
    The following patch fixes this by special casing such statements before
    the partitioning, force the inputs of the multiplication/division which
    have large/huge _BitInt (ab) lhs into new non-(ab) SSA_NAMEs initialized
    right before the multiplication/division.  This allows the partitioning
    to work then, as it has the possibility to use a different partition for
    the */% operands.
    
    2024-02-15  Jakub Jelinek  <jakub@redhat.com>
    
            PR tree-optimization/113567
            * gimple-lower-bitint.cc (gimple_lower_bitint): For large/huge
            _BitInt multiplication, division or modulo with
            SSA_NAME_OCCURS_IN_ABNORMAL_PHI lhs and at least one of rhs1 and rhs2
            force the affected inputs into a new SSA_NAME.
    
            * gcc.dg/bitint-90.c: New test.

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

diff --git a/gcc/gimple-lower-bitint.cc b/gcc/gimple-lower-bitint.cc
index 0d132bf7b6c4..13b9b205df79 100644
--- a/gcc/gimple-lower-bitint.cc
+++ b/gcc/gimple-lower-bitint.cc
@@ -5973,6 +5973,47 @@ gimple_lower_bitint (void)
 	      {
 	      default:
 		break;
+	      case MULT_EXPR:
+	      case TRUNC_DIV_EXPR:
+	      case TRUNC_MOD_EXPR:
+		if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (s))
+		  {
+		    location_t loc = gimple_location (stmt);
+		    gsi = gsi_for_stmt (stmt);
+		    tree rhs1 = gimple_assign_rhs1 (stmt);
+		    tree rhs2 = gimple_assign_rhs2 (stmt);
+		    /* For multiplication and division with (ab)
+		       lhs and one or both operands force the operands
+		       into new SSA_NAMEs to avoid coalescing failures.  */
+		    if (TREE_CODE (rhs1) == SSA_NAME
+			&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs1))
+		      {
+			first_large_huge = 0;
+			tree t = make_ssa_name (TREE_TYPE (rhs1));
+			g = gimple_build_assign (t, SSA_NAME, rhs1);
+			gsi_insert_before (&gsi, g, GSI_SAME_STMT);
+			gimple_set_location (g, loc);
+			gimple_assign_set_rhs1 (stmt, t);
+			if (rhs1 == rhs2)
+			  {
+			    gimple_assign_set_rhs2 (stmt, t);
+			    rhs2 = t;
+			  }
+			update_stmt (stmt);
+		      }
+		    if (TREE_CODE (rhs2) == SSA_NAME
+			&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs2))
+		      {
+			first_large_huge = 0;
+			tree t = make_ssa_name (TREE_TYPE (rhs2));
+			g = gimple_build_assign (t, SSA_NAME, rhs2);
+			gsi_insert_before (&gsi, g, GSI_SAME_STMT);
+			gimple_set_location (g, loc);
+			gimple_assign_set_rhs2 (stmt, t);
+			update_stmt (stmt);
+		      }
+		  }
+		break;
 	      case LROTATE_EXPR:
 	      case RROTATE_EXPR:
 		{
diff --git a/gcc/testsuite/gcc.dg/bitint-90.c b/gcc/testsuite/gcc.dg/bitint-90.c
new file mode 100644
index 000000000000..22df2a5cfba9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/bitint-90.c
@@ -0,0 +1,23 @@
+/* PR tree-optimization/113567 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-O2" } */
+
+#if __BITINT_MAXWIDTH__ >= 129
+_BitInt(129) v;
+
+void
+foo (_BitInt(129) a, int i)
+{
+  __label__  l1, l2;
+  i &= 1;
+  void *p[] = { &&l1, &&l2 };
+l1:
+  a %= 3;
+  v = a;
+  i = !i;
+  goto *(p[i]);
+l2:;
+}
+#else
+int i;
+#endif

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

only message in thread, other threads:[~2024-02-15  8:53 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-15  8:53 [gcc r14-8995] lower-bitint: Ensure we don't get coalescing ICEs for (ab) SSA_NAMEs used in mul/div/mod [PR113567] 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).