PR middle-end/38200
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 21 Nov 2008 21:59:33 +0000 (21:59 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 21 Nov 2008 21:59:33 +0000 (21:59 +0000)
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Only
propagate x = &a into *x = b if conversion from b to a's type is
useless.

* gcc.dg/pr38200.c: New test.

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

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

index 1f0b3fc..e4790f1 100644 (file)
@@ -1,3 +1,10 @@
+2008-11-21  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/38200
+       * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Only
+       propagate x = &a into *x = b if conversion from b to a's type is
+       useless.
+
 2008-11-21  Eric Botcazou  <ebotcazou@adacore.com>
 
        * caller-save.c (insert_one_insn): Take into account REG_INC notes
index 3f99b5a..c9e449f 100644 (file)
@@ -1,3 +1,8 @@
+2008-11-21  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/38200
+       * gcc.dg/pr38200.c: New test.
+
 2008-11-21  H.J. Lu  <hongjiu.lu@intel.com>
 
        * gcc.target/i386/avx-1.c: Include <immintrin.h> instead of
diff --git a/gcc/testsuite/gcc.dg/pr38200.c b/gcc/testsuite/gcc.dg/pr38200.c
new file mode 100644 (file)
index 0000000..d5391bd
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR middle-end/38200 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-strict-aliasing" } */
+
+typedef int (*callptr) (void);
+int foo (void **x);
+void foo2 (callptr *);
+int (*foo_ptr) (void **x) = foo;
+
+void
+bar (void)
+{
+  void *ptr;
+  foo2 ((callptr *) &ptr);
+  *(void **) &foo_ptr = ptr;
+}
index 333ef82..b19879f 100644 (file)
@@ -719,30 +719,18 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
      propagate the ADDR_EXPR into the use of NAME and fold the result.  */
   if (TREE_CODE (lhs) == INDIRECT_REF
       && TREE_OPERAND (lhs, 0) == name
-      && may_propagate_address_into_dereference (def_rhs, lhs))
+      && may_propagate_address_into_dereference (def_rhs, lhs)
+      && (lhsp != gimple_assign_lhs_ptr (use_stmt)
+         || useless_type_conversion_p (TREE_TYPE (TREE_OPERAND (def_rhs, 0)),
+                                       TREE_TYPE (rhs))))
     {
-      bool valid = true;
-      if (lhsp == gimple_assign_lhs_ptr (use_stmt)
-         && !useless_type_conversion_p (TREE_TYPE (TREE_OPERAND (def_rhs, 0)),
-                                        TREE_TYPE (rhs))
-         && !CONVERT_EXPR_CODE_P (rhs_code))
-       {
-         if (rhs_code == SSA_NAME)
-           gimple_assign_set_rhs_code (use_stmt, NOP_EXPR);
-         else
-           valid = false;
-       }
-      if (valid)
-       {
-         *lhsp = unshare_expr (TREE_OPERAND (def_rhs, 0));
-         fold_stmt_inplace (use_stmt);
-         tidy_after_forward_propagate_addr (use_stmt);
+      *lhsp = unshare_expr (TREE_OPERAND (def_rhs, 0));
+      fold_stmt_inplace (use_stmt);
+      tidy_after_forward_propagate_addr (use_stmt);
 
-         /* Continue propagating into the RHS if this was not the only
-            use.  */
-         if (single_use_p)
-           return true;
-       }
+      /* Continue propagating into the RHS if this was not the only use.  */
+      if (single_use_p)
+       return true;
     }
 
   /* Strip away any outer COMPONENT_REF, ARRAY_REF or ADDR_EXPR