summaryrefslogtreecommitdiff
path: root/gcc/tree-inline.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2005-06-01 18:43:02 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2005-06-01 18:43:02 +0000
commit9ea9fcf0bcb5d466a36bd6ecd5536e09f1d53dc9 (patch)
tree991227bc41638e17a027fb12fa3ce93c50321a30 /gcc/tree-inline.c
parent51d8e657d0087d91e4000f241de335121ea3810d (diff)
downloadgcc-9ea9fcf0bcb5d466a36bd6ecd5536e09f1d53dc9.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@100458 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r--gcc/tree-inline.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 224004e0ebd..28bdf6cc478 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -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;
}