diff mbox series

sccvn: Punt on ref->size not multiple of 8 for memset (, 123, ) in 9.x [PR93945]

Message ID 20200227100422.GE2155@tucnak
State New
Headers show
Series sccvn: Punt on ref->size not multiple of 8 for memset (, 123, ) in 9.x [PR93945] | expand

Commit Message

Jakub Jelinek Feb. 27, 2020, 10:04 a.m. UTC
Hi!

And here is the corresponding 9.x change where we the patch just punts if
ref->size is not whole bytes, like we already punt if offseti is not byte
aligned.

Tested on x86_64-linux and powerpc64-linux, ok for 9.3?

2020-02-27  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/93945
	* tree-ssa-sccvn.c (vn_reference_lookup_3): For memset with non-zero
	second operand, require ref->size to be a multiple of BITS_PER_UNIT.

	* gcc.c-torture/execute/pr93945.c: New test.


	Jakub

Comments

Richard Biener Feb. 27, 2020, 10:06 a.m. UTC | #1
On Thu, 27 Feb 2020, Jakub Jelinek wrote:

> Hi!
> 
> And here is the corresponding 9.x change where we the patch just punts if
> ref->size is not whole bytes, like we already punt if offseti is not byte
> aligned.
> 
> Tested on x86_64-linux and powerpc64-linux, ok for 9.3?

OK.

Thanks,
Richard.

> 2020-02-27  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR tree-optimization/93945
> 	* tree-ssa-sccvn.c (vn_reference_lookup_3): For memset with non-zero
> 	second operand, require ref->size to be a multiple of BITS_PER_UNIT.
> 
> 	* gcc.c-torture/execute/pr93945.c: New test.
> 
> --- gcc/tree-ssa-sccvn.c.jj	2020-01-12 12:17:01.031158921 +0100
> +++ gcc/tree-ssa-sccvn.c	2020-02-27 10:55:16.226236453 +0100
> @@ -2113,7 +2113,8 @@ vn_reference_lookup_3 (ao_ref *ref, tree
>  	       || (INTEGRAL_TYPE_P (vr->type) && known_eq (ref->size, 8)))
>  	      && CHAR_BIT == 8 && BITS_PER_UNIT == 8
>  	      && offset.is_constant (&offseti)
> -	      && offseti % BITS_PER_UNIT == 0))
> +	      && offseti % BITS_PER_UNIT == 0
> +	      && multiple_p (ref->size, BITS_PER_UNIT)))
>        && poly_int_tree_p (gimple_call_arg (def_stmt, 2))
>        && (TREE_CODE (gimple_call_arg (def_stmt, 0)) == ADDR_EXPR
>  	  || TREE_CODE (gimple_call_arg (def_stmt, 0)) == SSA_NAME))
> --- gcc/testsuite/gcc.c-torture/execute/pr93945.c.jj	2020-02-27 10:54:21.234060635 +0100
> +++ gcc/testsuite/gcc.c-torture/execute/pr93945.c	2020-02-27 10:54:21.234060635 +0100
> @@ -0,0 +1,45 @@
> +/* PR tree-optimization/93945 */
> +
> +union U { char a[8]; struct S { unsigned int b : 8, c : 13, d : 11; } e; } u;
> +
> +__attribute__((noipa)) int
> +foo (void)
> +{
> +  __builtin_memset (&u.a, 0xf4, sizeof (u.a));
> +  return u.e.c;
> +}
> +
> +__attribute__((noipa)) int
> +bar (void)
> +{
> +  asm volatile ("" : : "g" (&u) : "memory");
> +  return u.e.c;
> +}
> +
> +__attribute__((noipa)) int
> +baz (void)
> +{
> +  __builtin_memset (&u.a, 0xf4, sizeof (u.a));
> +  return u.e.d;
> +}
> +
> +__attribute__((noipa)) int
> +qux (void)
> +{
> +  asm volatile ("" : : "g" (&u) : "memory");
> +  return u.e.d;
> +}
> +
> +int
> +main ()
> +{
> +  int a = foo ();
> +  int b = bar ();
> +  if (a != b)
> +    __builtin_abort ();
> +  a = baz ();
> +  b = qux ();
> +  if (a != b)
> +    __builtin_abort ();
> +  return 0;
> +}
> 
> 	Jakub
> 
>
diff mbox series

Patch

--- gcc/tree-ssa-sccvn.c.jj	2020-01-12 12:17:01.031158921 +0100
+++ gcc/tree-ssa-sccvn.c	2020-02-27 10:55:16.226236453 +0100
@@ -2113,7 +2113,8 @@  vn_reference_lookup_3 (ao_ref *ref, tree
 	       || (INTEGRAL_TYPE_P (vr->type) && known_eq (ref->size, 8)))
 	      && CHAR_BIT == 8 && BITS_PER_UNIT == 8
 	      && offset.is_constant (&offseti)
-	      && offseti % BITS_PER_UNIT == 0))
+	      && offseti % BITS_PER_UNIT == 0
+	      && multiple_p (ref->size, BITS_PER_UNIT)))
       && poly_int_tree_p (gimple_call_arg (def_stmt, 2))
       && (TREE_CODE (gimple_call_arg (def_stmt, 0)) == ADDR_EXPR
 	  || TREE_CODE (gimple_call_arg (def_stmt, 0)) == SSA_NAME))
--- gcc/testsuite/gcc.c-torture/execute/pr93945.c.jj	2020-02-27 10:54:21.234060635 +0100
+++ gcc/testsuite/gcc.c-torture/execute/pr93945.c	2020-02-27 10:54:21.234060635 +0100
@@ -0,0 +1,45 @@ 
+/* PR tree-optimization/93945 */
+
+union U { char a[8]; struct S { unsigned int b : 8, c : 13, d : 11; } e; } u;
+
+__attribute__((noipa)) int
+foo (void)
+{
+  __builtin_memset (&u.a, 0xf4, sizeof (u.a));
+  return u.e.c;
+}
+
+__attribute__((noipa)) int
+bar (void)
+{
+  asm volatile ("" : : "g" (&u) : "memory");
+  return u.e.c;
+}
+
+__attribute__((noipa)) int
+baz (void)
+{
+  __builtin_memset (&u.a, 0xf4, sizeof (u.a));
+  return u.e.d;
+}
+
+__attribute__((noipa)) int
+qux (void)
+{
+  asm volatile ("" : : "g" (&u) : "memory");
+  return u.e.d;
+}
+
+int
+main ()
+{
+  int a = foo ();
+  int b = bar ();
+  if (a != b)
+    __builtin_abort ();
+  a = baz ();
+  b = qux ();
+  if (a != b)
+    __builtin_abort ();
+  return 0;
+}