This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Another builtin memset fix (PR middle-end/46647)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 26 Nov 2010 09:57:41 +0100
- Subject: [PATCH] Another builtin memset fix (PR middle-end/46647)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
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.
--- 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