OSDN Git Service

2011-05-23 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 23 May 2011 12:03:19 +0000 (12:03 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 23 May 2011 12:03:19 +0000 (12:03 +0000)
PR middle-end/15419
* builtins.c (fold_builtin_memory_op): Be less restrictive about
what pointer types we accept for folding.

* gcc.dg/memcpy-3.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@174065 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/builtins.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/memcpy-3.c [new file with mode: 0644]

index 253ce2a..25b569e 100644 (file)
@@ -1,3 +1,9 @@
+2011-05-23  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/15419
+       * builtins.c (fold_builtin_memory_op): Be less restrictive about
+       what pointer types we accept for folding.
+
 2011-05-23  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * gthr-gnat.c: Remove.
index bd61f29..a23237d 100644 (file)
@@ -8509,6 +8509,9 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src,
         Perhaps we ought to inherit type from non-VOID argument here?  */
       STRIP_NOPS (src);
       STRIP_NOPS (dest);
+      if (!POINTER_TYPE_P (TREE_TYPE (src))
+         || !POINTER_TYPE_P (TREE_TYPE (dest)))
+       return NULL_TREE;
       /* As we fold (void *)(p + CST) to (void *)p + CST undo this here.  */
       if (TREE_CODE (src) == POINTER_PLUS_EXPR)
        {
@@ -8525,8 +8528,7 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src,
            dest = build1 (NOP_EXPR, TREE_TYPE (tem), dest);
        }
       srctype = TREE_TYPE (TREE_TYPE (src));
-      if (srctype
-         && TREE_CODE (srctype) == ARRAY_TYPE
+      if (TREE_CODE (srctype) == ARRAY_TYPE
          && !tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len))
        {
          srctype = TREE_TYPE (srctype);
@@ -8534,21 +8536,15 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src,
          src = build1 (NOP_EXPR, build_pointer_type (srctype), src);
        }
       desttype = TREE_TYPE (TREE_TYPE (dest));
-      if (desttype
-         && TREE_CODE (desttype) == ARRAY_TYPE
+      if (TREE_CODE (desttype) == ARRAY_TYPE
          && !tree_int_cst_equal (TYPE_SIZE_UNIT (desttype), len))
        {
          desttype = TREE_TYPE (desttype);
          STRIP_NOPS (dest);
          dest = build1 (NOP_EXPR, build_pointer_type (desttype), dest);
        }
-      if (!srctype || !desttype
-         || TREE_ADDRESSABLE (srctype)
-         || TREE_ADDRESSABLE (desttype)
-         || !TYPE_SIZE_UNIT (srctype)
-         || !TYPE_SIZE_UNIT (desttype)
-         || TREE_CODE (TYPE_SIZE_UNIT (srctype)) != INTEGER_CST
-         || TREE_CODE (TYPE_SIZE_UNIT (desttype)) != INTEGER_CST)
+      if (TREE_ADDRESSABLE (srctype)
+         || TREE_ADDRESSABLE (desttype))
        return NULL_TREE;
 
       src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
index 2429b60..c41d324 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-23  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/15419
+       * gcc.dg/memcpy-3.c: New testcase.
+
 2011-05-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/48973
diff --git a/gcc/testsuite/gcc.dg/memcpy-3.c b/gcc/testsuite/gcc.dg/memcpy-3.c
new file mode 100644 (file)
index 0000000..ba3db56
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+int get_int(const void *p)
+{
+  int w;
+  __builtin_memcpy(&w, p, sizeof (int));
+  return w;
+}
+
+/* { dg-final { scan-tree-dump-not "memcpy" "optimized" } } */
+/* { dg-final { scan-tree-dump-times "MEM" 1 "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */