From: Richard Guenther Date: Wed, 1 Jun 2005 18:43:02 +0000 (+0000) Subject: tree.h (fold_indirect_ref_1): Export from fold-const.c. X-Git-Tag: misc/cutover-cvs2svn~2730 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=095ecc24ec1340eb0f3d1f06f5bf627001b51d32;p=thirdparty%2Fgcc.git tree.h (fold_indirect_ref_1): Export from fold-const.c. 2005-06-01 Richard Guenther * 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. From-SVN: r100458 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index adfecf5de169..29603148a2c4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-06-01 Richard Guenther + + * 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 * common.opt (fjump-tables): New. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 13984d1c8be0..ad5039bba6eb 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -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; diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 224004e0ebdb..28bdf6cc4788 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; } diff --git a/gcc/tree.h b/gcc/tree.h index e842f6940252..c9fdb9336c3b 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -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);