2005-06-01 Richard Guenther <rguenth@gcc.gnu.org>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Jun 2005 18:43:02 +0000 (18:43 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Jun 2005 18:43:02 +0000 (18:43 +0000)
* tree.h (fold_indirect_ref_1): Export from fold-const.c.
* fold-const.c (fold_indirect_ref_1): No longer static.
* tree-inline.c (copy_body_r): Use fold_indirect_ref_1 for
folding, if possible.

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

gcc/ChangeLog
gcc/fold-const.c
gcc/tree-inline.c
gcc/tree.h

index adfecf5..2960314 100644 (file)
@@ -1,3 +1,10 @@
+2005-06-01  Richard Guenther  <rguenth@gcc.gnu.org>
+
+       * tree.h (fold_indirect_ref_1): Export from fold-const.c.
+       * fold-const.c (fold_indirect_ref_1): No longer static.
+       * tree-inline.c (copy_body_r): Use fold_indirect_ref_1 for
+       folding, if possible.
+
 2005-06-01  Joseph S. Myers  <joseph@codesourcery.com>
 
        * common.opt (fjump-tables): New.
index 13984d1..ad5039b 100644 (file)
@@ -11508,7 +11508,7 @@ build_fold_addr_expr (tree t)
    of an indirection through OP0, or NULL_TREE if no simplification is
    possible.  */
 
-static tree
+tree
 fold_indirect_ref_1 (tree type, tree op0)
 {
   tree sub = op0;
index 224004e..28bdf6c 100644 (file)
@@ -615,13 +615,17 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data)
                 it manually here as we'll eventually get ADDR_EXPRs
                 which lie about their types pointed to.  In this case
                 build_fold_indirect_ref wouldn't strip the INDIRECT_REF,
-                but we absolutely rely on that.  */
-             if (TREE_CODE ((tree)n->value) == ADDR_EXPR)
-               *tp = TREE_OPERAND ((tree)n->value, 0);
-             else
-               *tp = build1 (INDIRECT_REF,
-                             TREE_TYPE (TREE_TYPE ((tree)n->value)),
-                             (tree)n->value);
+                but we absolutely rely on that.  As fold_indirect_ref
+                does other useful transformations, try that first, though.  */
+             tree type = TREE_TYPE (TREE_TYPE ((tree)n->value));
+             *tp = fold_indirect_ref_1 (type, (tree)n->value);
+             if (! *tp)
+               {
+                 if (TREE_CODE ((tree)n->value) == ADDR_EXPR)
+                   *tp = TREE_OPERAND ((tree)n->value, 0);
+                 else
+                   *tp = build1 (INDIRECT_REF, type, (tree)n->value);
+               }
              *walk_subtrees = 0;
              return NULL;
            }
index e842f69..c9fdb93 100644 (file)
@@ -3539,6 +3539,7 @@ extern tree fold_convert (tree, tree);
 extern tree fold_single_bit_test (enum tree_code, tree, tree, tree);
 extern tree fold_ignored_result (tree);
 extern tree fold_abs_const (tree, tree);
+extern tree fold_indirect_ref_1 (tree, tree);
 
 extern tree force_fit_type (tree, int, bool, bool);