Another builtin memset fix (PR middle-end/46647)

Submitted by Jakub Jelinek on Nov. 26, 2010, 8:57 a.m.

Details

Message ID 20101126085741.GK29412@tyan-ft48-01.lab.bos.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Nov. 26, 2010, 8:57 a.m.
Hi!

While H.J's patch fixed memset expansion with regard to negative
second argument, this patch does the same for memset folding.
We don't really care about any upper bits, only the low 8 bits matter.

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

2010-11-26  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/46647
	* builtins.c (fold_builtin_memset): Check c is INTEGER_CST instead
	of host_integerp check.  Use TREE_INT_CST_LOW instead of tree_low_cst.

	* gcc.dg/pr46647.c: New test.


	Jakub

Comments

Richard Guenther Nov. 26, 2010, 9:14 a.m.
On Fri, Nov 26, 2010 at 9:57 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> While H.J's patch fixed memset expansion with regard to negative
> second argument, this patch does the same for memset folding.
> We don't really care about any upper bits, only the low 8 bits matter.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok.

Thanks,
Richard.

> 2010-11-26  Jakub Jelinek  <jakub@redhat.com>
>
>        PR middle-end/46647
>        * builtins.c (fold_builtin_memset): Check c is INTEGER_CST instead
>        of host_integerp check.  Use TREE_INT_CST_LOW instead of tree_low_cst.
>
>        * gcc.dg/pr46647.c: New test.
>
> --- gcc/builtins.c.jj   2010-11-19 20:56:54.000000000 +0100
> +++ gcc/builtins.c      2010-11-24 22:23:41.000000000 +0100
> @@ -8345,7 +8345,7 @@ fold_builtin_memset (location_t loc, tre
>   if (integer_zerop (len))
>     return omit_one_operand_loc (loc, type, dest, c);
>
> -  if (! host_integerp (c, 1) || TREE_SIDE_EFFECTS (dest))
> +  if (TREE_CODE (c) != INTEGER_CST || TREE_SIDE_EFFECTS (dest))
>     return NULL_TREE;
>
>   var = dest;
> @@ -8384,7 +8384,7 @@ fold_builtin_memset (location_t loc, tre
>       if (CHAR_BIT != 8 || BITS_PER_UNIT != 8 || HOST_BITS_PER_WIDE_INT > 64)
>        return NULL_TREE;
>
> -      cval = tree_low_cst (c, 1);
> +      cval = TREE_INT_CST_LOW (c);
>       cval &= 0xff;
>       cval |= cval << 8;
>       cval |= cval << 16;
> --- gcc/testsuite/gcc.dg/pr46647.c.jj   2010-11-25 21:28:03.000000000 +0100
> +++ gcc/testsuite/gcc.dg/pr46647.c      2010-11-25 21:29:57.000000000 +0100
> @@ -0,0 +1,29 @@
> +/* PR middle-end/46647 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +
> +int a;
> +
> +int
> +func1 (void)
> +{
> +  __builtin_memset (&a, -1, sizeof (a));
> +  return 0;
> +}
> +
> +int
> +func2 (void)
> +{
> +  __builtin_memset (&a, 123, sizeof (a));
> +  return 0;
> +}
> +
> +int
> +func3 (void)
> +{
> +  __builtin_memset (&a, 0, sizeof (a));
> +  return 0;
> +}
> +
> +/* { dg-final { scan-tree-dump-not "memset" "optimized" } } */
> +/* { dg-final { cleanup-tree-dump "optimized" } } */
>
>        Jakub
>

Patch hide | download patch | download mbox

--- gcc/builtins.c.jj	2010-11-19 20:56:54.000000000 +0100
+++ gcc/builtins.c	2010-11-24 22:23:41.000000000 +0100
@@ -8345,7 +8345,7 @@  fold_builtin_memset (location_t loc, tre
   if (integer_zerop (len))
     return omit_one_operand_loc (loc, type, dest, c);
 
-  if (! host_integerp (c, 1) || TREE_SIDE_EFFECTS (dest))
+  if (TREE_CODE (c) != INTEGER_CST || TREE_SIDE_EFFECTS (dest))
     return NULL_TREE;
 
   var = dest;
@@ -8384,7 +8384,7 @@  fold_builtin_memset (location_t loc, tre
       if (CHAR_BIT != 8 || BITS_PER_UNIT != 8 || HOST_BITS_PER_WIDE_INT > 64)
 	return NULL_TREE;
 
-      cval = tree_low_cst (c, 1);
+      cval = TREE_INT_CST_LOW (c);
       cval &= 0xff;
       cval |= cval << 8;
       cval |= cval << 16;
--- gcc/testsuite/gcc.dg/pr46647.c.jj	2010-11-25 21:28:03.000000000 +0100
+++ gcc/testsuite/gcc.dg/pr46647.c	2010-11-25 21:29:57.000000000 +0100
@@ -0,0 +1,29 @@ 
+/* PR middle-end/46647 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+int a;
+
+int
+func1 (void)
+{
+  __builtin_memset (&a, -1, sizeof (a));
+  return 0;
+}
+
+int
+func2 (void)
+{
+  __builtin_memset (&a, 123, sizeof (a));
+  return 0;
+}
+
+int
+func3 (void)
+{
+  __builtin_memset (&a, 0, sizeof (a));
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-not "memset" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */