summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2007-07-02 12:57:22 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2007-07-02 12:57:22 +0000
commitfbb5d9ac63b5b0706772728d606f86e3932fb09f (patch)
treec0a145584c46c6fba31d9a163e5e01f7593c67b5
parent5bd657e9856eb98f31f0d40f371c94c81a6f44b8 (diff)
downloadppe42-gcc-fbb5d9ac63b5b0706772728d606f86e3932fb09f.tar.gz
ppe42-gcc-fbb5d9ac63b5b0706772728d606f86e3932fb09f.zip
* 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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/nrv12.C25
-rw-r--r--gcc/testsuite/gcc.target/i386/nrv1.c12
-rw-r--r--gcc/tree-nrv.c37
5 files changed, 64 insertions, 20 deletions
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 <jakub@redhat.com>
+
+ * 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 <rguenther@suse.de>
* 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 <jakub@redhat.com>
+
+ * g++.dg/opt/nrv12.C: New test.
+ * gcc.target/i386/nrv1.c: New test.
+
2007-07-02 Ira Rosen <irar@il.ibm.com>
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
OpenPOWER on IntegriCloud