This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
baby steps on c++/13954
- From: Richard Henderson <rth at twiddle dot net>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 30 Jun 2004 13:06:07 -0700
- Subject: baby steps on c++/13954
By no means does this allow the structure to be scalarized, but it
does clean up the representation of this operation into something
that we might be able to handle in the future.
It also generates a bit less intermediate code.
Tested on i686-linux.
r~
* call.c (build_over_call): Use __builtin_memcpy for copying
CLASS_AS_BASE rather than funny casting.
Index: call.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/call.c,v
retrieving revision 1.486
diff -u -p -r1.486 call.c
--- call.c 28 Jun 2004 11:07:19 -0000 1.486
+++ call.c 30 Jun 2004 20:00:01 -0000
@@ -4795,31 +4795,28 @@ build_over_call (struct z_candidate *can
tree type = TREE_TYPE (to);
tree as_base = CLASSTYPE_AS_BASE (type);
- arg = build_indirect_ref (TREE_VALUE (TREE_CHAIN (converted_args)), 0);
+ arg = TREE_VALUE (TREE_CHAIN (converted_args));
if (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (as_base)))
- val = build (MODIFY_EXPR, TREE_TYPE (to), to, arg);
+ {
+ arg = build_indirect_ref (arg, 0);
+ val = build (MODIFY_EXPR, TREE_TYPE (to), to, arg);
+ }
else
{
- /* We must only copy the non-tail padding parts. Use
- CLASSTYPE_AS_BASE for the bitwise copy. */
- tree to_ptr, arg_ptr, to_as_base, arg_as_base, base_ptr_type;
- tree save_to;
-
- to_ptr = save_expr (build_unary_op (ADDR_EXPR, to, 0));
- arg_ptr = build_unary_op (ADDR_EXPR, arg, 0);
-
- base_ptr_type = build_pointer_type (as_base);
- to_as_base = build_nop (base_ptr_type, to_ptr);
- to_as_base = build_indirect_ref (to_as_base, 0);
- arg_as_base = build_nop (base_ptr_type, arg_ptr);
- arg_as_base = build_indirect_ref (arg_as_base, 0);
-
- save_to = build_indirect_ref (to_ptr, 0);
-
- val = build (MODIFY_EXPR, as_base, to_as_base, arg_as_base);
- val = convert_to_void (val, NULL);
- val = build (COMPOUND_EXPR, type, val, save_to);
- TREE_NO_WARNING (val) = 1;
+ /* We must only copy the non-tail padding parts.
+ Use __builtin_memcpy for the bitwise copy. */
+
+ tree args, t;
+
+ args = tree_cons (NULL, TYPE_SIZE_UNIT (as_base), NULL);
+ args = tree_cons (NULL, arg, args);
+ t = build_unary_op (ADDR_EXPR, to, 0);
+ args = tree_cons (NULL, t, args);
+ t = implicit_built_in_decls[BUILT_IN_MEMCPY];
+ t = build_call (t, args);
+
+ t = convert (TREE_TYPE (TREE_VALUE (args)), t);
+ val = build_indirect_ref (t, 0);
}
return val;