summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2010-11-26 09:38:54 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2010-11-26 09:38:54 +0000
commitd5d2f74a7a1c6564e4b922f1a11e25c6dab8e072 (patch)
tree4b01402047c5fcad2cdf20c06ad29f8bbf3ecae3 /gcc
parent2284bb2d2ba48602ff0bcfd1cb482cfeb9c3cee9 (diff)
downloadgcc-d5d2f74a7a1c6564e4b922f1a11e25c6dab8e072.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167170 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/builtins.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr46647.c29
4 files changed, 40 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c20209ee5cb..ff8fc9a21b9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
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.
+
PR bootstrap/45700
* tree.h (build1_stat_loc, build2_stat_loc, build3_stat_loc,
build4_stat_loc, build5_stat_loc, build6_stat_loc): New inlines.
diff --git a/gcc/builtins.c b/gcc/builtins.c
index a90bf2fb8f5..5cdf480913c 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -8345,7 +8345,7 @@ fold_builtin_memset (location_t loc, tree dest, tree c, tree len,
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, tree dest, tree c, tree len,
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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e8e33412a5e..525f1d0aec1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-11-26 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/46647
+ * gcc.dg/pr46647.c: New test.
+
2010-11-25 Janus Weil <janus@gcc.gnu.org>
PR fortran/46581
diff --git a/gcc/testsuite/gcc.dg/pr46647.c b/gcc/testsuite/gcc.dg/pr46647.c
new file mode 100644
index 00000000000..ab85e17a081
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr46647.c
@@ -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" } } */