OSDN Git Service

2008-10-18 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 18 Oct 2008 18:06:41 +0000 (18:06 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 18 Oct 2008 18:06:41 +0000 (18:06 +0000)
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Guard
VIEW_CONVERT_EXPR case against invalid gimple.

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

gcc/ChangeLog
gcc/tree-ssa-forwprop.c

index 80b318f..12a9f52 100644 (file)
@@ -1,3 +1,8 @@
+2008-10-18  Richard Guenther  <rguenther@suse.de>
+
+       * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Guard
+       VIEW_CONVERT_EXPR case against invalid gimple.
+
 2008-10-17  Andreas Krebbel  <krebbel1@de.ibm.com>
 
        * c-parser.c (c_parser_binary_expression): Silence the
index 3513ee0..7a5233b 100644 (file)
@@ -767,8 +767,8 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
       && TREE_OPERAND (rhs, 0) == name
       && TYPE_SIZE (TREE_TYPE (rhs))
       && TYPE_SIZE (TREE_TYPE (TREE_OPERAND (def_rhs, 0)))
-      /* Function decls should not be used for VCE either as it could be
-         function descriptor that we want and not the actual function code.  */
+      /* Function decls should not be used for VCE either as it could be a
+         function descriptor that we want and not the actual function code.  */
       && TREE_CODE (TREE_OPERAND (def_rhs, 0)) != FUNCTION_DECL
       /* We should not convert volatile loads to non volatile loads. */
       && !TYPE_VOLATILE (TREE_TYPE (rhs))
@@ -776,22 +776,27 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
       && operand_equal_p (TYPE_SIZE (TREE_TYPE (rhs)),
                          TYPE_SIZE (TREE_TYPE (TREE_OPERAND (def_rhs, 0))), 0)) 
    {
-      bool res = true;
-      tree new_rhs = unshare_expr (TREE_OPERAND (def_rhs, 0));
-      new_rhs = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (rhs), new_rhs);
-      /* If we have folded the VCE, then we have to create a new statement.  */
-      if (TREE_CODE (new_rhs) != VIEW_CONVERT_EXPR)
-       {
-         gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt);
-         new_rhs = force_gimple_operand_gsi (&gsi, new_rhs, true, NULL, true, GSI_SAME_STMT);
-         /* As we change the deference to a SSA_NAME, we need to return false to make sure that
-            the statement does not get removed.  */
-         res = false;
-       }
-      *rhsp = new_rhs;
-      fold_stmt_inplace (use_stmt);
-      tidy_after_forward_propagate_addr (use_stmt);
-      return res;
+     tree new_rhs = unshare_expr (TREE_OPERAND (def_rhs, 0));
+     new_rhs = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (rhs), new_rhs);
+     if (TREE_CODE (new_rhs) != VIEW_CONVERT_EXPR)
+       {
+        /* If we have folded the VIEW_CONVERT_EXPR then the result is only
+           valid if we can replace the whole rhs of the use statement.  */
+        if (rhs != gimple_assign_rhs1 (use_stmt))
+          return false;
+        new_rhs = force_gimple_operand_gsi (use_stmt_gsi, new_rhs, true, NULL,
+                                            true, GSI_NEW_STMT);
+        gimple_assign_set_rhs1 (use_stmt, new_rhs);
+       }
+     else
+       {
+        /* We may have arbitrary VIEW_CONVERT_EXPRs in a nested component
+           reference.  Place it there and fold the thing.  */
+        *rhsp = new_rhs;
+        fold_stmt_inplace (use_stmt);
+       }
+     tidy_after_forward_propagate_addr (use_stmt);
+     return true;
    }
 
   /* If the use of the ADDR_EXPR is not a POINTER_PLUS_EXPR, there