diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-12-02 10:13:05 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-12-02 10:13:05 +0000 |
commit | c8b17b2e903112138e0bb317b3bfb67009f571fd (patch) | |
tree | 3c0d9842ad0f29acf2ac2c76dae29e4a695facf4 /gcc/builtins.c | |
parent | 6a08f7963fa568797341b24a545916ff9b821106 (diff) | |
download | gcc-c8b17b2e903112138e0bb317b3bfb67009f571fd.tar.gz |
PR middle-end/38343
* builtins.c (expand_builtin_mempcpy_args): Handle COMPOUND_EXPRs
potentially returned from folding memcpy.
(expand_builtin_stpcpy_args): Similarly for folding strcpy.
(fold_builtin_2): Handle BUILT_IN_STPCPY if result is ignored.
* gcc.c-torture/compile/pr38343.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@142348 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index a6ee5a96729..34066675873 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -3406,7 +3406,7 @@ expand_builtin_memcpy (tree exp, rtx target, enum machine_mode mode) stpcpy. */ static rtx -expand_builtin_mempcpy(tree exp, rtx target, enum machine_mode mode) +expand_builtin_mempcpy (tree exp, rtx target, enum machine_mode mode) { if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE)) @@ -3433,15 +3433,18 @@ expand_builtin_mempcpy_args (tree dest, tree src, tree len, tree type, rtx target, enum machine_mode mode, int endp) { /* If return value is ignored, transform mempcpy into memcpy. */ - if (target == const0_rtx) + if (target == const0_rtx && implicit_built_in_decls[BUILT_IN_MEMCPY]) { tree fn = implicit_built_in_decls[BUILT_IN_MEMCPY]; + tree result = build_call_expr (fn, 3, dest, src, len); - if (!fn) - return NULL_RTX; - - return expand_expr (build_call_expr (fn, 3, dest, src, len), - target, mode, EXPAND_NORMAL); + while (TREE_CODE (result) == COMPOUND_EXPR) + { + expand_expr (TREE_OPERAND (result, 0), const0_rtx, VOIDmode, + EXPAND_NORMAL); + result = TREE_OPERAND (result, 1); + } + return expand_expr (result, target, mode, EXPAND_NORMAL); } else { @@ -3707,14 +3710,19 @@ expand_builtin_stpcpy (tree exp, rtx target, enum machine_mode mode) src = CALL_EXPR_ARG (exp, 1); /* If return value is ignored, transform stpcpy into strcpy. */ - if (target == const0_rtx) + if (target == const0_rtx && implicit_built_in_decls[BUILT_IN_STRCPY]) { tree fn = implicit_built_in_decls[BUILT_IN_STRCPY]; - if (!fn) - return NULL_RTX; + tree result = build_call_expr (fn, 2, dst, src); - return expand_expr (build_call_expr (fn, 2, dst, src), - target, mode, EXPAND_NORMAL); + STRIP_NOPS (result); + while (TREE_CODE (result) == COMPOUND_EXPR) + { + expand_expr (TREE_OPERAND (result, 0), const0_rtx, VOIDmode, + EXPAND_NORMAL); + result = TREE_OPERAND (result, 1); + } + return expand_expr (result, target, mode, EXPAND_NORMAL); } else { @@ -10463,6 +10471,17 @@ fold_builtin_2 (tree fndecl, tree arg0, tree arg1, bool ignore) case BUILT_IN_STRCPY: return fold_builtin_strcpy (fndecl, arg0, arg1, NULL_TREE); + case BUILT_IN_STPCPY: + if (ignore) + { + tree fn = implicit_built_in_decls[BUILT_IN_STRCPY]; + if (!fn) + break; + + return build_call_expr (fn, 2, arg0, arg1); + } + break; + case BUILT_IN_STRCMP: return fold_builtin_strcmp (arg0, arg1); |