From 5a0de1516fbcc69846b89bccb91ad62242b7af2f Mon Sep 17 00:00:00 2001 From: ghazi Date: Mon, 4 Oct 2004 00:04:58 +0000 Subject: [PATCH] * builtins.c (expand_builtin_memcpy): Delete duplicate code and make the first parameter the expression not the arglist. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@88466 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/builtins.c | 25 +++++++------------------ 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4744f92..b4e62b7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-10-03 Kaveh R. Ghazi + + * builtins.c (expand_builtin_memcpy): Delete duplicate code + and make the first parameter the expression not the arglist. + 2004-10-03 Ulrich Weigand * expr.c (expand_expr_addr_expr): Only accept Pmode or ptr_mode diff --git a/gcc/builtins.c b/gcc/builtins.c index dd8c8ea..08ef1b8 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -2544,8 +2544,9 @@ builtin_memcpy_read_str (void *data, HOST_WIDE_INT offset, otherwise try to get the result in TARGET, if convenient (and in mode MODE if that's convenient). */ static rtx -expand_builtin_memcpy (tree arglist, rtx target, enum machine_mode mode) +expand_builtin_memcpy (tree exp, rtx target, enum machine_mode mode) { + tree arglist = TREE_OPERAND (exp, 1); if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE)) return 0; @@ -2559,27 +2560,15 @@ expand_builtin_memcpy (tree arglist, rtx target, enum machine_mode mode) unsigned int dest_align = get_pointer_alignment (dest, BIGGEST_ALIGNMENT); rtx dest_mem, src_mem, dest_addr, len_rtx; + tree result = fold_builtin_memcpy (exp); + + if (result) + return expand_expr (result, target, mode, EXPAND_NORMAL); /* If DEST is not a pointer type, call the normal function. */ if (dest_align == 0) return 0; - /* If the LEN parameter is zero, return DEST. */ - if (integer_zerop (len)) - { - /* Evaluate and ignore SRC in case it has side-effects. */ - expand_expr (src, const0_rtx, VOIDmode, EXPAND_NORMAL); - return expand_expr (dest, target, mode, EXPAND_NORMAL); - } - - /* If SRC and DEST are the same (and not volatile), return DEST. */ - if (operand_equal_p (src, dest, 0)) - { - /* Evaluate and ignore LEN in case it has side-effects. */ - expand_expr (len, const0_rtx, VOIDmode, EXPAND_NORMAL); - return expand_expr (dest, target, mode, EXPAND_NORMAL); - } - /* If either SRC is not a pointer type, don't do this operation in-line. */ if (src_align == 0) @@ -5490,7 +5479,7 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode, break; case BUILT_IN_MEMCPY: - target = expand_builtin_memcpy (arglist, target, mode); + target = expand_builtin_memcpy (exp, target, mode); if (target) return target; break; -- 2.7.4