aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog.tree-ssa6
-rw-r--r--gcc/tree-eh.c6
-rw-r--r--gcc/tree-inline.c12
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;