OSDN Git Service

2010-07-14 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Jul 2010 12:19:16 +0000 (12:19 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Jul 2010 12:19:16 +0000 (12:19 +0000)
PR tree-optimization/44824
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Use
is_gimple_mem_ref_addr.
(tree_ssa_forward_propagate_single_use_vars): Do not propagate
non-decl_address_invariant_p addresses.

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

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

index 2f0795e..daa007a 100644 (file)
@@ -1,3 +1,11 @@
+2010-07-14  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/44824
+       * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Use
+       is_gimple_mem_ref_addr.
+       (tree_ssa_forward_propagate_single_use_vars): Do not propagate
+       non-decl_address_invariant_p addresses.
+
 2010-07-14  Bernd Schmidt  <bernds@codesourcery.com>
 
        * reload.c (find_reloads): Revert code to penalize small register
index 5044aff..b627804 100644 (file)
@@ -804,9 +804,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
                                 fold_convert (ptr_type_node,
                                               gimple_assign_rhs2 (use_stmt)));
       if (TREE_CODE (new_def_rhs) == MEM_REF
-         && TREE_CODE (TREE_OPERAND (new_def_rhs, 0)) == ADDR_EXPR
-         && !DECL_P (TREE_OPERAND (TREE_OPERAND (new_def_rhs, 0), 0))
-         && !CONSTANT_CLASS_P (TREE_OPERAND (TREE_OPERAND (new_def_rhs, 0), 0)))
+         && !is_gimple_mem_ref_addr (TREE_OPERAND (new_def_rhs, 0)))
        return false;
       new_def_rhs = build_fold_addr_expr_with_type (new_def_rhs,
                                                    TREE_TYPE (rhs));
@@ -1398,8 +1396,11 @@ tree_ssa_forward_propagate_single_use_vars (void)
                      && TREE_CODE (rhs) == ADDR_EXPR
                      && POINTER_TYPE_P (TREE_TYPE (lhs))))
                {
-                 STRIP_NOPS (rhs);
-                 if (!stmt_references_abnormal_ssa_name (stmt)
+                 tree base = get_base_address (TREE_OPERAND (rhs, 0));
+                 if ((!base
+                      || !DECL_P (base)
+                      || decl_address_invariant_p (base))
+                     && !stmt_references_abnormal_ssa_name (stmt)
                      && forward_propagate_addr_expr (lhs, rhs))
                    {
                      release_defs (stmt);