call.c (build_over_call): Instead of memcpy use an assignment of two MEM_REFs.
authorRichard Guenther <rguenther@suse.de>
Fri, 12 Aug 2011 08:55:05 +0000 (08:55 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 12 Aug 2011 08:55:05 +0000 (08:55 +0000)
2011-08-12  Richard Guenther  <rguenther@suse.de>

* call.c (build_over_call): Instead of memcpy use an
assignment of two MEM_REFs.

From-SVN: r177691

gcc/cp/ChangeLog
gcc/cp/call.c

index f5989f4bc9840cff1df5100d73fc8fca8ae1558f..47d636ef3b04e31df1abe9ca00ed23d9b9851dc9 100644 (file)
@@ -1,3 +1,8 @@
+2011-08-12  Richard Guenther  <rguenther@suse.de>
+
+       * call.c (build_over_call): Instead of memcpy use an
+       assignment of two MEM_REFs.
+
 2011-08-11  Romain Geissler  <romain.geissler@gmail.com>
             Brian Hackett  <bhackett1024@gmail.com>
 
index 4494eccfa39bd42acd25438a7dddfff2a3cf6ce3..a3b0f8a85bbda2e5efda18893f957126997e2874 100644 (file)
@@ -6766,19 +6766,22 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
        }
       else
        {
-         /* We must only copy the non-tail padding parts.
-            Use __builtin_memcpy for the bitwise copy.  */
-         tree arg0, arg1, arg2, t;
+         /* We must only copy the non-tail padding parts.  */
+         tree arg0, arg2, t;
+         tree array_type, alias_set;
 
          arg2 = TYPE_SIZE_UNIT (as_base);
-         arg1 = arg;
          arg0 = cp_build_addr_expr (to, complain);
 
-         t = implicit_built_in_decls[BUILT_IN_MEMCPY];
-         t = build_call_n (t, 3, arg0, arg1, arg2);
-
-         t = convert (TREE_TYPE (arg0), t);
-         val = cp_build_indirect_ref (t, RO_NULL, complain);
+         array_type = build_array_type (char_type_node,
+                                        build_index_type
+                                          (size_binop (MINUS_EXPR,
+                                                       arg2, size_int (1))));
+         alias_set = build_int_cst (build_pointer_type (type), 0);
+         t = build2 (MODIFY_EXPR, void_type_node,
+                     build2 (MEM_REF, array_type, arg0, alias_set),
+                     build2 (MEM_REF, array_type, arg, alias_set));
+         val = build2 (COMPOUND_EXPR, TREE_TYPE (to), t, to);
           TREE_NO_WARNING (val) = 1;
        }