From: Jakub Jelinek Date: Mon, 2 Jul 2007 12:57:22 +0000 (+0200) Subject: tree-nrv.c (dest_safe_for_nrv_p): Grok any handled_component_p, SSA_NAMEs, RESULT_DEC... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a2daf82cc26803dcf11ec3972fcd317680b424ed;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f9f4b246e77..409799b3157 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2007-07-02 Jakub Jelinek + + * tree-nrv.c (dest_safe_for_nrv_p): Grok any handled_component_p, + SSA_NAMEs, RESULT_DECLs and PARM_DECLs. + 2007-07-02 Richard Guenther * tree-ssa.c (useless_type_conversion_p): Document diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ae9175355c9..fee89cf8df6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-07-02 Jakub Jelinek + + * g++.dg/opt/nrv12.C: New test. + * gcc.target/i386/nrv1.c: New test. + 2007-07-02 Ira Rosen PR tree-optimization/32230 diff --git a/gcc/testsuite/g++.dg/opt/nrv12.C b/gcc/testsuite/g++.dg/opt/nrv12.C new file mode 100644 index 00000000000..944dddd7b70 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv12.C @@ -0,0 +1,25 @@ +/* Verify that gimple-level NRV is occurring even for RESULT_DECLs. *./ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O -fdump-tree-optimized" } */ +/* { dg-require-effective-target ilp32 } */ + +struct P +{ + long long l; + int a; + unsigned int b; + P(long long x) : l(x) {} +}; + +P foo (P); +P bar (P); + +P foo (P x) +{ + P y = P (-1LL); + y = bar (x); + return y; +} + +/* { dg-final { scan-tree-dump-times "return slot optimization" 1 "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.target/i386/nrv1.c b/gcc/testsuite/gcc.target/i386/nrv1.c new file mode 100644 index 00000000000..5cd8b066d72 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/nrv1.c @@ -0,0 +1,12 @@ +/* Verify that gimple-level NRV is occurring even for SSA_NAMEs. *./ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ +/* { dg-require-effective-target ilp32 } */ + +_Complex double foo (_Complex double x) +{ + return __builtin_cexp (x); +} + +/* { dg-final { scan-tree-dump-times "return slot optimization" 1 "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ 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