public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] bitint: Avoid rewriting large/huge _BitInt vars into SSA after bitint lowering [PR114278]
@ 2024-03-09  8:22 Jakub Jelinek
  2024-03-09 11:25 ` Richard Biener
  2024-03-11  9:51 ` [PATCH] bitint: " Richard Biener
  0 siblings, 2 replies; 7+ messages in thread
From: Jakub Jelinek @ 2024-03-09  8:22 UTC (permalink / raw)
  To: Richard Biener; +Cc: gcc-patches

Hi!

The following testcase ICEs, because update-address-taken subpass of
fre5 rewrites
  _BitInt(128) b;
  vector(16) unsigned char _3;

  <bb 2> [local count: 1073741824]:
  _3 = MEM <vector(16) unsigned char> [(char * {ref-all})p_2(D)];
  MEM <vector(16) unsigned char> [(char * {ref-all})&b] = _3;
  b ={v} {CLOBBER(eos)};
to
  _BitInt(128) b;
  vector(16) unsigned char _3;

  <bb 2> [local count: 1073741824]:
  _3 = MEM <vector(16) unsigned char> [(char * {ref-all})p_2(D)];
  b_5 = VIEW_CONVERT_EXPR<_BitInt(128)>(_3);
but we can't have large/huge _BitInt vars in SSA form after the bitint
lowering except for function arguments loaded from memory, as expansion
isn't able to deal with those, it relies on bitint lowering to lower
those operations.
The following patch fixes that by not clearing TREE_ADDRESSABLE for
large/huge _BitInt vars after bitint lowering, such that we don't
rewrite them into SSA form.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2024-03-09  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/114278
	* tree-ssa.cc (maybe_optimize_var): Punt on large/huge _BitInt
	vars after bitint lowering.

	* gcc.dg/bitint-99.c: New test.

--- gcc/tree-ssa.cc.jj	2024-01-03 11:51:39.902615009 +0100
+++ gcc/tree-ssa.cc	2024-03-08 14:24:11.844821915 +0100
@@ -1753,7 +1753,11 @@ maybe_optimize_var (tree var, bitmap add
   /* Global Variables, result decls cannot be changed.  */
   if (is_global_var (var)
       || TREE_CODE (var) == RESULT_DECL
-      || bitmap_bit_p (addresses_taken, DECL_UID (var)))
+      || bitmap_bit_p (addresses_taken, DECL_UID (var))
+      || (TREE_CODE (TREE_TYPE (var)) == BITINT_TYPE
+	  /* Don't change large/huge _BitInt vars after _BitInt lowering.  */
+	  && (cfun->curr_properties & PROP_gimple_lbitint) != 0
+	  && TYPE_PRECISION (TREE_TYPE (var)) > MAX_FIXED_MODE_SIZE))
     return;
 
   bool maybe_reg = false;
--- gcc/testsuite/gcc.dg/bitint-99.c.jj	2024-03-08 14:26:17.658069942 +0100
+++ gcc/testsuite/gcc.dg/bitint-99.c	2024-03-08 14:25:36.292645965 +0100
@@ -0,0 +1,26 @@
+/* PR tree-optimization/114278 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-O2 -fno-tree-dce -fno-tree-dse -fno-tree-ccp" } */
+/* { dg-additional-options "-mavx2" { target i?86-*-* x86_64-*-* } } */
+
+void
+foo (void *p)
+{
+  _BitInt(64) b = *(_BitInt(64) *) __builtin_memmove (&b, p, sizeof (_BitInt(64)));
+}
+
+#if __BITINT_MAXWIDTH__ >= 128
+void
+bar (void *p)
+{
+  _BitInt(128) b = *(_BitInt(128) *) __builtin_memmove (&b, p, sizeof (_BitInt(128)));
+}
+#endif
+
+#if __BITINT_MAXWIDTH__ >= 256
+void
+baz (void *p)
+{
+  _BitInt(256) b = *(_BitInt(256) *) __builtin_memmove (&b, p, sizeof (_BitInt(256)));
+}
+#endif

	Jakub


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2024-03-11 10:47 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-09  8:22 [PATCH] bitint: Avoid rewriting large/huge _BitInt vars into SSA after bitint lowering [PR114278] Jakub Jelinek
2024-03-09 11:25 ` Richard Biener
2024-03-11  7:49   ` [PATCH] bitint, v2: " Jakub Jelinek
2024-03-11 10:31     ` Richard Biener
2024-03-11 10:40       ` Jakub Jelinek
2024-03-11 10:47         ` Richard Biener
2024-03-11  9:51 ` [PATCH] bitint: " Richard Biener

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).