summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/expr.c1
-rw-r--r--gcc/expr.c9
-rw-r--r--gcc/function.c49
-rw-r--r--gcc/tree.def9
-rw-r--r--gcc/tree.h4
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 <mark@codesourcery.com>
+
+ * 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 <mark@codesourcery.com>
+
2000-03-05 Mark Mitchell <mark@codesourcery.com>
* 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 <mark@codesourcery.com>
+
+ * expr.c (cplus_expand_expr, case STMT_EXPR): Don't set
+ RTL_EXPR_HAS_NO_SCOPE after all.
+
2000-03-05 Mark Mitchell <mark@codesourcery.com>
* 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])
OpenPOWER on IntegriCloud