aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c23
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/forwprop-9.c9
-rw-r--r--gcc/tree-ssa-forwprop.c17
5 files changed, 51 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 55d7448..af90a99 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2008-08-20 Richard Guenther <rguenther@suse.de>
+ * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): More
+ properly handle conversion/copy chains after tuplification.
+
+2008-08-20 Richard Guenther <rguenther@suse.de>
+
* passes.c (init_optimization_passes): Move the second
forwprop pass before alias computation. Remove the second
DCE pass. Remove the first dominator and phi copy/const
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 42ec9c0..36c0c41 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2008-08-20 Richard Guenther <rguenther@suse.de>
+ * gcc.dg/tree-ssa/forwprop-9.c: Scan FRE dump as well.
+ * gcc.dg/tree-ssa/forwprop-10.c: New testcase.
+
+2008-08-20 Richard Guenther <rguenther@suse.de>
+
* gcc.dg/tree-ssa/20030530-2.c: Scan dom2 dump.
* gcc.dg/tree-ssa/20030611-1.c: Likewise.
* gcc.dg/tree-ssa/20030703-1.c: Likewise.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c
new file mode 100644
index 0000000..0b86524
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-forwprop1" } */
+
+int b;
+unsigned a;
+
+static inline int *g(void)
+{
+ a = 1;
+ return (int*)&a;
+}
+void test2(void)
+{
+ b = *g();
+}
+
+/* The indirect load should be replaced by a load from a and a
+ conversion to int. */
+
+/* { dg-final { scan-tree-dump "= a;" "forwprop1" } } */
+/* { dg-final { scan-tree-dump "= \\\(int\\\) " "forwprop1" } } */
+/* { dg-final { scan-tree-dump-not "= \\\*" "forwprop1" } } */
+/* { dg-final { cleanup-tree-dump "forwprop1" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-9.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-9.c
index 70630d0..4469fe7 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-9.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-9.c
@@ -1,6 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O1 -fdump-tree-final_cleanup -W -Wall -fno-early-inlining" } */
-
+/* { dg-options "-O1 -fdump-tree-final_cleanup -fdump-tree-fre -W -Wall -fno-early-inlining" } */
int b;
unsigned a;
@@ -13,6 +12,10 @@ void f(void)
{
b = *g();
}
-/* We should have converted the assignments to two = 1. */
+
+/* We should have converted the assignments to two = 1. FRE does this. */
+
/* { dg-final { scan-tree-dump-times " = 1" 2 "final_cleanup"} } */
+/* { dg-final { scan-tree-dump-not " = a;" "fre"} } */
+/* { dg-final { cleanup-tree-dump "fre" } } */
/* { dg-final { cleanup-tree-dump "final_cleanup" } } */
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index 64eb2d8..bf860d9 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -689,15 +689,22 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
a conversion to def_rhs type separate, though. */
if (TREE_CODE (lhs) == SSA_NAME
&& ((rhs_code == SSA_NAME && rhs == name)
- || CONVERT_EXPR_CODE_P (rhs_code))
- && useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (def_rhs)))
+ || CONVERT_EXPR_CODE_P (rhs_code)))
{
- /* Only recurse if we don't deal with a single use. */
- if (!single_use_p)
+ /* Only recurse if we don't deal with a single use or we cannot
+ do the propagation to the current statement. In particular
+ we can end up with a conversion needed for a non-invariant
+ address which we cannot do in a single statement. */
+ if (!single_use_p
+ || (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (def_rhs))
+ && !is_gimple_min_invariant (def_rhs)))
return forward_propagate_addr_expr (lhs, def_rhs);
gimple_assign_set_rhs1 (use_stmt, unshare_expr (def_rhs));
- gimple_assign_set_rhs_code (use_stmt, TREE_CODE (def_rhs));
+ if (useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (def_rhs)))
+ gimple_assign_set_rhs_code (use_stmt, TREE_CODE (def_rhs));
+ else
+ gimple_assign_set_rhs_code (use_stmt, NOP_EXPR);
return true;
}