aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2007-05-02 09:12:49 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2007-05-02 09:12:49 +0000
commitf6c5fefc1dee760599da3d7b1bc513fd59f6c6e8 (patch)
tree0cd1c91e1be36ab612ad8a524b6f6fdb8d5392e2
parentd7598e110d060f8b7fb6598736f68700b20c400f (diff)
downloadgcc-f6c5fefc1dee760599da3d7b1bc513fd59f6c6e8.zip
gcc-f6c5fefc1dee760599da3d7b1bc513fd59f6c6e8.tar.gz
gcc-f6c5fefc1dee760599da3d7b1bc513fd59f6c6e8.tar.bz2
re PR tree-optimization/31146 (forwprop does not look through casts)
2007-05-02 Richard Guenther <rguenther@suse.de> PR tree-optimization/31146 * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): New argument, single_use_p. If we have a single use that is a conversion to the definition rhs type, propagate that rhs. (forward_propagate_addr_expr): Pass single_use_p argument to forward_propagate_addr_expr_1. * g++.dg/tree-ssa/pr31146-2.C: New testcase. From-SVN: r124349
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr31146-2.C24
-rw-r--r--gcc/tree-ssa-forwprop.c21
4 files changed, 55 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3882b8b..d45664e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2007-05-02 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/31146
+ * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): New
+ argument, single_use_p. If we have a single use that is
+ a conversion to the definition rhs type, propagate that rhs.
+ (forward_propagate_addr_expr): Pass single_use_p argument
+ to forward_propagate_addr_expr_1.
+
2007-05-01 H.J. Lu <hongjiu.lu@intel.com>
* config/i386/i386.c (ix86_expand_sse_comi): Remove unused
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ed9816f..287a0973 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-05-02 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/31146
+ * g++.dg/tree-ssa/pr31146-2.C: New testcase.
+
2007-05-01 Geoffrey Keating <geoffk@apple.com>
* gcc.c-torture/compile/limits-blockid.c: New.
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr31146-2.C b/gcc/testsuite/g++.dg/tree-ssa/pr31146-2.C
new file mode 100644
index 0000000..0fd6027
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr31146-2.C
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-forwprop1" } */
+
+#include <new>
+
+template <class T>
+struct Vec
+{
+ Vec()
+ {
+ for (int i=0; i<3; ++i)
+ new (&a[i]) T(0);
+ }
+ T a[3];
+};
+
+double foo (void)
+{
+ Vec<double> v;
+ return v.a[2];
+}
+
+/* { dg-final { scan-tree-dump "Replaced .*iftmp.* != 0B. with .1" "forwprop1" } } */
+/* { dg-final { cleanup-tree-dump "forwprop1" } } */
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index 860a4c4..d91aa89 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -559,7 +559,8 @@ forward_propagate_addr_into_variable_array_index (tree offset, tree lhs,
be not totally successful, yet things may have been changed). */
static bool
-forward_propagate_addr_expr_1 (tree name, tree def_rhs, tree use_stmt)
+forward_propagate_addr_expr_1 (tree name, tree def_rhs, tree use_stmt,
+ bool single_use_p)
{
tree lhs, rhs, array_ref;
@@ -584,10 +585,20 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, tree use_stmt)
/* Continue propagating into the RHS. */
}
- /* Trivial case. The use statement could be a trivial copy or a
+ /* Trivial cases. The use statement could be a trivial copy or a
useless conversion. Recurse to the uses of the lhs as copyprop does
not copy through differen variant pointers and FRE does not catch
- all useless conversions. */
+ all useless conversions. Treat the case of a single-use name and
+ a conversion to def_rhs type separate, though. */
+ else if (TREE_CODE (lhs) == SSA_NAME
+ && (TREE_CODE (rhs) == NOP_EXPR
+ || TREE_CODE (rhs) == CONVERT_EXPR)
+ && TREE_TYPE (rhs) == TREE_TYPE (def_rhs)
+ && single_use_p)
+ {
+ GIMPLE_STMT_OPERAND (use_stmt, 1) = unshare_expr (def_rhs);
+ return true;
+ }
else if ((TREE_CODE (lhs) == SSA_NAME
&& rhs == name)
|| ((TREE_CODE (rhs) == NOP_EXPR
@@ -702,6 +713,7 @@ forward_propagate_addr_expr (tree name, tree rhs)
imm_use_iterator iter;
tree use_stmt;
bool all = true;
+ bool single_use_p = has_single_use (name);
FOR_EACH_IMM_USE_STMT (use_stmt, iter, name)
{
@@ -726,7 +738,8 @@ forward_propagate_addr_expr (tree name, tree rhs)
push_stmt_changes (&use_stmt);
- result = forward_propagate_addr_expr_1 (name, rhs, use_stmt);
+ result = forward_propagate_addr_expr_1 (name, rhs, use_stmt,
+ single_use_p);
all &= result;
pop_stmt_changes (&use_stmt);