From 64dc53f34db1cea9ea657a32e72216baa3a524fb Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 6 Mar 2000 09:50:17 +0000 Subject: [PATCH] function.c (free_temps_for_rtl_expr): Don't free slots that have been pushed into a higher level. * function.c (free_temps_for_rtl_expr): Don't free slots that have been pushed into a higher level. * expr.c (cplus_expand_expr, case STMT_EXPR): Don't set RTL_EXPR_HAS_NO_SCOPE after all. From-SVN: r32355 --- gcc/ChangeLog | 8 ++++++++ gcc/cp/ChangeLog | 5 +++++ gcc/cp/expr.c | 1 - gcc/expr.c | 9 ++------- gcc/function.c | 49 +++++++++++++++--------------------------------- gcc/tree.def | 9 ++++----- gcc/tree.h | 4 ---- 7 files changed, 34 insertions(+), 51 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5e410297e92..8a98ec8094c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2000-03-06 Mark Mitchell + + * function.c (free_temps_for_rtl_expr): Don't free slots + that have been pushed into a higher level. + + Revert this patch: + 2000-03-05 Mark Mitchell + 2000-03-05 Mark Mitchell * basic-block.h (ALLOCA_REG_SET): Remove. diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d1f5473cfaa..e0faa86a719 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2000-03-06 Mark Mitchell + + * expr.c (cplus_expand_expr, case STMT_EXPR): Don't set + RTL_EXPR_HAS_NO_SCOPE after all. + 2000-03-05 Mark Mitchell * expr.c (cplus_expand_expr, case STMT_EXPR): Use diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c index f8351811706..3fe6f99b305 100644 --- a/gcc/cp/expr.c +++ b/gcc/cp/expr.c @@ -148,7 +148,6 @@ cplus_expand_expr (exp, target, tmode, modifier) tree rtl_expr = expand_start_stmt_expr (); expand_stmt (STMT_EXPR_STMT (exp)); expand_end_stmt_expr (rtl_expr); - RTL_EXPR_HAS_NO_SCOPE (rtl_expr) = 1; return expand_expr (rtl_expr, target, tmode, modifier); } break; diff --git a/gcc/expr.c b/gcc/expr.c index 28b3b442ba0..fb266e27226 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -6306,13 +6306,8 @@ expand_expr (exp, target, tmode, modifier) emit_insns (RTL_EXPR_SEQUENCE (exp)); RTL_EXPR_SEQUENCE (exp) = const0_rtx; } - if (RTL_EXPR_HAS_NO_SCOPE (exp)) - preserve_rtl_expr_temps (exp); - else - { - preserve_rtl_expr_result (RTL_EXPR_RTL (exp)); - free_temps_for_rtl_expr (exp); - } + preserve_rtl_expr_result (RTL_EXPR_RTL (exp)); + free_temps_for_rtl_expr (exp); return RTL_EXPR_RTL (exp); case CONSTRUCTOR: diff --git a/gcc/function.c b/gcc/function.c index fe7f61b7f8a..093a0d83c04 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -293,7 +293,6 @@ static void mark_function_chain PARAMS ((void *)); static void prepare_function_start PARAMS ((void)); static void do_clobber_return_reg PARAMS ((rtx, void *)); static void do_use_return_reg PARAMS ((rtx, void *)); -static void preserve_rtl_expr_temp PARAMS ((struct temp_slot *)); /* Pointer to chain of `struct function' for containing functions. */ struct function *outer_function_chain; @@ -1130,36 +1129,6 @@ preserve_temp_slots (x) p->level--; } -/* Preserve the temporary slot given by P (originally created during - the building of an RTL_EXPR) at least as long as things in our - current scope. */ - -static void -preserve_rtl_expr_temp (p) - struct temp_slot *p; -{ - /* Set the slot level to that of the currently prevailing scope. */ - p->level = MIN (p->level, temp_slot_level); - /* This slot is no longer associated with the RTL_EXPR from which it - originated. */ - p->rtl_expr = NULL_TREE; -} - -/* Preserve the temporary slots created during the building of the - RTL_EXPR given by T at least as long as things in our current - scope. */ - -void -preserve_rtl_expr_temps (t) - tree t; -{ - struct temp_slot *p; - - for (p = temp_slots; p; p = p->next) - if (p->in_use && p->rtl_expr == t) - preserve_rtl_expr_temp (p); -} - /* X is the result of an RTL_EXPR. If it is a temporary slot associated with that RTL_EXPR, promote it into a temporary slot at the present level so it will not be freed when we free slots made in the @@ -1179,8 +1148,11 @@ preserve_rtl_expr_result (x) /* If we can find a match, move it to our level unless it is already at an upper level. */ p = find_temp_slot_from_address (XEXP (x, 0)); - if (p) - preserve_rtl_expr_temp (p); + if (p != 0) + { + p->level = MIN (p->level, temp_slot_level); + p->rtl_expr = 0; + } return; } @@ -1215,7 +1187,16 @@ free_temps_for_rtl_expr (t) for (p = temp_slots; p; p = p->next) if (p->rtl_expr == t) - p->in_use = 0; + { + /* If this slot is below the current TEMP_SLOT_LEVEL, then it + needs to be preserved. This can happen if a temporary in + the RTL_EXPR was addressed; preserve_temp_slots will move + the temporary into a higher level. */ + if (temp_slot_level <= p->level) + p->in_use = 0; + else + p->rtl_expr = NULL_TREE; + } combine_temp_slots (); } diff --git a/gcc/tree.def b/gcc/tree.def index d691150fafb..92bc594e0dd 100644 --- a/gcc/tree.def +++ b/gcc/tree.def @@ -689,11 +689,10 @@ DEFTREECODE (UNSAVE_EXPR, "unsave_expr", 'e', 1) /* Represents something whose RTL has already been expanded as a sequence which should be emitted when this expression is expanded. The first operand is the RTL to emit. It is the first of a chain - of insns. The second is the RTL expression for the result. If - RTL_EXPR_HAS_NO_SCOPE does not hold for this expression, then all - temporaries created within this RTL_EXPR (except for the - RTL_EXPR_RTL) are out-of-scope after the RTL_EXPR is expanded. (In - other words, their stack slots may be reused.) */ + of insns. The second is the RTL expression for the result. Any + temporaries created during the building of the RTL_EXPR can be + reused once the RTL_EXPR has been expanded, with the exception of + the RTL_EXPR_RTL. */ DEFTREECODE (RTL_EXPR, "rtl_expr", 'e', 2) /* & in C. Value is the address at which the operand's value resides. diff --git a/gcc/tree.h b/gcc/tree.h index 722b219393f..1a827581c6b 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -749,10 +749,6 @@ struct tree_vec /* In a RTL_EXPR node. */ #define RTL_EXPR_SEQUENCE(NODE) (*(struct rtx_def **) &EXPR_CHECK (NODE)->exp.operands[0]) #define RTL_EXPR_RTL(NODE) (*(struct rtx_def **) &EXPR_CHECK (NODE)->exp.operands[1]) -/* Nonzero if the RTL_EXPR does not define a scope, i.e., if - temporaries defined during its scope should persist even after the - RTL_EXPR has been expanded. */ -#define RTL_EXPR_HAS_NO_SCOPE(NODE) TREE_ASM_WRITTEN (NODE) /* In a CALL_EXPR node. */ #define CALL_EXPR_RTL(NODE) (*(struct rtx_def **) &EXPR_CHECK (NODE)->exp.operands[2])