diff mbox series

bitint: Avoid rewriting large/huge _BitInt vars into SSA after bitint lowering [PR114278]

Message ID ZewcLTRoU0Jrea3R@tucnak
State New
Headers show
Series bitint: Avoid rewriting large/huge _BitInt vars into SSA after bitint lowering [PR114278] | expand

Commit Message

Jakub Jelinek March 9, 2024, 8:22 a.m. UTC
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.


	Jakub

Comments

Richard Biener March 9, 2024, 11:25 a.m. UTC | #1
> Am 09.03.2024 um 09:28 schrieb Jakub Jelinek <jakub@redhat.com>:
> 
> 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?
> 

Ideally we’d clear TREE_ADDRESSABLE but set DECL_NOT_GIMPLE_REG, I think the analysis where we check the base would be a more appropriate place to enforce that.

Richard 

> 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
>
Richard Biener March 11, 2024, 9:51 a.m. UTC | #2
On Sat, 9 Mar 2024, Jakub Jelinek wrote:

> 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?

OK.

Thanks,
Richard.

> 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
> 
>
diff mbox series

Patch

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