diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-07-02 12:57:22 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-07-02 12:57:22 +0000 |
commit | fbb5d9ac63b5b0706772728d606f86e3932fb09f (patch) | |
tree | c0a145584c46c6fba31d9a163e5e01f7593c67b5 /gcc/tree-nrv.c | |
parent | 5bd657e9856eb98f31f0d40f371c94c81a6f44b8 (diff) | |
download | gcc-fbb5d9ac63b5b0706772728d606f86e3932fb09f.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@126200 138bc75d-0d04-0410-961f-82ee72b054a4
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 5a0db897252..fe812a92ab6 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 |