diff options
-rw-r--r-- | gcc/ChangeLog.tree-ssa | 6 | ||||
-rw-r--r-- | gcc/tree-eh.c | 6 | ||||
-rw-r--r-- | gcc/tree-inline.c | 12 |
3 files changed, 21 insertions, 3 deletions
diff --git a/gcc/ChangeLog.tree-ssa b/gcc/ChangeLog.tree-ssa index 05fd744b6a9..2ae2cb723cc 100644 --- a/gcc/ChangeLog.tree-ssa +++ b/gcc/ChangeLog.tree-ssa @@ -1,5 +1,11 @@ 2003-11-02 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz> + * tree-inline.c (walk_tree): Tail recursion optimized for + COMPOUND_EXPRs. + * tree-eh.c (collect_finally_tree): Ditto. + +2003-11-02 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz> + * tree-optimize.c (optimize_function_tree): Removed duplicate call of lower_function_body. Moved call of reset_block_changes ... (tree_rest_of_compilation) ... here. Reset the scope to top before diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index 4cf2c99b754..f6bfa0c38d3 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -146,6 +146,8 @@ record_in_finally_tree (tree child, tree parent) static void collect_finally_tree (tree t, tree region) { +tailrecurse: + switch (TREE_CODE (t)) { case LABEL_EXPR: @@ -168,8 +170,8 @@ collect_finally_tree (tree t, tree region) case COMPOUND_EXPR: case TRY_CATCH_EXPR: collect_finally_tree (TREE_OPERAND (t, 0), region); - collect_finally_tree (TREE_OPERAND (t, 1), region); - break; + t = TREE_OPERAND (t, 1); + goto tailrecurse; case CATCH_EXPR: collect_finally_tree (CATCH_BODY (t), region); break; diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 2e880f7ecee..32901c0c026 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -1887,9 +1887,19 @@ walk_tree (tree *tp, walk_tree_fn func, void *data, void *htab_) --len; /* Go through the subtrees. We need to do this in forward order so that the scope of a FOR_EXPR is handled properly. */ - for (i = 0; i < len; ++i) + for (i = 0; i < len - 1; ++i) WALK_SUBTREE (TREE_OPERAND (*tp, i)); + if (len) + { + /* The common case is that we may tail recurse here. */ + if (code != BIND_EXPR + && !TREE_CHAIN (*tp)) + WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, len - 1)); + else + WALK_SUBTREE (TREE_OPERAND (*tp, len - 1)); + } + if (code == BIND_EXPR) { tree decl; |