From patchwork Fri Nov 26 08:57:41 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Another builtin memset fix (PR middle-end/46647) Date: Thu, 25 Nov 2010 22:57:41 -0000 From: Jakub Jelinek X-Patchwork-Id: 73162 Message-Id: <20101126085741.GK29412@tyan-ft48-01.lab.bos.redhat.com> To: gcc-patches@gcc.gnu.org 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 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 --- 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" } } */