OSDN Git Service

2008-08-20 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 20 Aug 2008 13:21:41 +0000 (13:21 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 20 Aug 2008 13:21:41 +0000 (13:21 +0000)
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): More
properly handle conversion/copy chains after tuplification.

* gcc.dg/tree-ssa/forwprop-9.c: Scan FRE dump as well.
* gcc.dg/tree-ssa/forwprop-10.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@139288 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/forwprop-9.c
gcc/tree-ssa-forwprop.c

index 55d7448..af90a99 100644 (file)
@@ -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
index 42ec9c0..36c0c41 100644 (file)
@@ -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 (file)
index 0000000..0b86524
--- /dev/null
@@ -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" } } */
index 70630d0..4469fe7 100644 (file)
@@ -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" } } */
index 64eb2d8..bf860d9 100644 (file)
@@ -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;
     }