aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-nrv.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-07-02 14:57:22 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2007-07-02 14:57:22 +0200
commita2daf82cc26803dcf11ec3972fcd317680b424ed (patch)
treec0a145584c46c6fba31d9a163e5e01f7593c67b5 /gcc/tree-nrv.c
parent85b19f61bcb817478b6110e14b69c8c345f04409 (diff)
downloadgcc-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.c37
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