diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-07-02 14:57:22 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-07-02 14:57:22 +0200 |
commit | a2daf82cc26803dcf11ec3972fcd317680b424ed (patch) | |
tree | c0a145584c46c6fba31d9a163e5e01f7593c67b5 /gcc/tree-nrv.c | |
parent | 85b19f61bcb817478b6110e14b69c8c345f04409 (diff) | |
download | gcc-a2daf82cc26803dcf11ec3972fcd317680b424ed.zip gcc-a2daf82cc26803dcf11ec3972fcd317680b424ed.tar.gz gcc-a2daf82cc26803dcf11ec3972fcd317680b424ed.tar.bz2 |
tree-nrv.c (dest_safe_for_nrv_p): Grok any handled_component_p, SSA_NAMEs, RESULT_DECLs and PARM_DECLs.
* tree-nrv.c (dest_safe_for_nrv_p): Grok any handled_component_p,
SSA_NAMEs, RESULT_DECLs and PARM_DECLs.
* g++.dg/opt/nrv12.C: New test.
* gcc.target/i386/nrv1.c: New test.
From-SVN: r126200
Diffstat (limited to 'gcc/tree-nrv.c')
-rw-r--r-- | gcc/tree-nrv.c | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/gcc/tree-nrv.c b/gcc/tree-nrv.c index 5a0db89..fe812a9 100644 --- a/gcc/tree-nrv.c +++ b/gcc/tree-nrv.c @@ -250,26 +250,23 @@ struct tree_opt_pass pass_nrv = static bool dest_safe_for_nrv_p (tree dest) { - switch (TREE_CODE (dest)) - { - case VAR_DECL: - { - subvar_t subvar; - if (is_call_clobbered (dest)) - return false; - for (subvar = get_subvars_for_var (dest); - subvar; - subvar = subvar->next) - if (is_call_clobbered (subvar->var)) - return false; - return true; - } - case ARRAY_REF: - case COMPONENT_REF: - return dest_safe_for_nrv_p (TREE_OPERAND (dest, 0)); - default: - return false; - } + subvar_t subvar; + + while (handled_component_p (dest)) + dest = TREE_OPERAND (dest, 0); + + if (! SSA_VAR_P (dest)) + return false; + + if (TREE_CODE (dest) == SSA_NAME) + dest = SSA_NAME_VAR (dest); + + if (is_call_clobbered (dest)) + return false; + for (subvar = get_subvars_for_var (dest); subvar; subvar = subvar->next) + if (is_call_clobbered (subvar->var)) + return false; + return true; } /* Walk through the function looking for GIMPLE_MODIFY_STMTs with calls that |