Commit 9f937026 by Mark Mitchell Committed by Mark Mitchell

tree.def (RTL_EXPR): Update documentation.

	* tree.def (RTL_EXPR): Update documentation.
	* tree.h (RTL_EXPR_HAS_NO_SCOPE): New macro.
	* expr.c (expand_expr): Handle RTL_EXPR_HAS_NO_SCOPE.
	* function.c (preserve_rtl_expr_temp): New function.
	(preserve_rtl_expr_temps): Likewise.
	(preserve_rtl_expr_result): Use it.

From-SVN: r32344
parent 591ccf92
2000-03-05 Mark Mitchell <mark@codesourcery.com> 2000-03-05 Mark Mitchell <mark@codesourcery.com>
* tree.def (RTL_EXPR): Update documentation.
* tree.h (RTL_EXPR_HAS_NO_SCOPE): New macro.
* expr.c (expand_expr): Handle RTL_EXPR_HAS_NO_SCOPE.
* function.c (preserve_rtl_expr_temp): New function.
(preserve_rtl_expr_temps): Likewise.
(preserve_rtl_expr_result): Use it.
Revert this patch: Revert this patch:
2000-03-04 Mark Mitchell <mark@codesourcery.com> 2000-03-04 Mark Mitchell <mark@codesourcery.com>
......
...@@ -6306,8 +6306,13 @@ expand_expr (exp, target, tmode, modifier) ...@@ -6306,8 +6306,13 @@ expand_expr (exp, target, tmode, modifier)
emit_insns (RTL_EXPR_SEQUENCE (exp)); emit_insns (RTL_EXPR_SEQUENCE (exp));
RTL_EXPR_SEQUENCE (exp) = const0_rtx; RTL_EXPR_SEQUENCE (exp) = const0_rtx;
} }
preserve_rtl_expr_result (RTL_EXPR_RTL (exp)); if (RTL_EXPR_HAS_NO_SCOPE (exp))
free_temps_for_rtl_expr (exp); preserve_rtl_expr_temps (exp);
else
{
preserve_rtl_expr_result (RTL_EXPR_RTL (exp));
free_temps_for_rtl_expr (exp);
}
return RTL_EXPR_RTL (exp); return RTL_EXPR_RTL (exp);
case CONSTRUCTOR: case CONSTRUCTOR:
......
...@@ -293,6 +293,7 @@ static void mark_function_chain PARAMS ((void *)); ...@@ -293,6 +293,7 @@ static void mark_function_chain PARAMS ((void *));
static void prepare_function_start PARAMS ((void)); static void prepare_function_start PARAMS ((void));
static void do_clobber_return_reg PARAMS ((rtx, void *)); static void do_clobber_return_reg PARAMS ((rtx, void *));
static void do_use_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. */ /* Pointer to chain of `struct function' for containing functions. */
struct function *outer_function_chain; struct function *outer_function_chain;
...@@ -1129,6 +1130,36 @@ preserve_temp_slots (x) ...@@ -1129,6 +1130,36 @@ preserve_temp_slots (x)
p->level--; 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 /* 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 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 level so it will not be freed when we free slots made in the
...@@ -1148,11 +1179,8 @@ preserve_rtl_expr_result (x) ...@@ -1148,11 +1179,8 @@ preserve_rtl_expr_result (x)
/* If we can find a match, move it to our level unless it is already at /* If we can find a match, move it to our level unless it is already at
an upper level. */ an upper level. */
p = find_temp_slot_from_address (XEXP (x, 0)); p = find_temp_slot_from_address (XEXP (x, 0));
if (p != 0) if (p)
{ preserve_rtl_expr_temp (p);
p->level = MIN (p->level, temp_slot_level);
p->rtl_expr = 0;
}
return; return;
} }
......
...@@ -686,10 +686,14 @@ DEFTREECODE (SAVE_EXPR, "save_expr", 'e', 3) ...@@ -686,10 +686,14 @@ DEFTREECODE (SAVE_EXPR, "save_expr", 'e', 3)
but where we must re-expand. */ but where we must re-expand. */
DEFTREECODE (UNSAVE_EXPR, "unsave_expr", 'e', 1) DEFTREECODE (UNSAVE_EXPR, "unsave_expr", 'e', 1)
/* Represents something whose RTL has already been expanded /* Represents something whose RTL has already been expanded as a
as a sequence which should be emitted when this expression is expanded. 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 first operand is the RTL to emit. It is the first of a chain
The second is the RTL expression for the result. */ 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.) */
DEFTREECODE (RTL_EXPR, "rtl_expr", 'e', 2) DEFTREECODE (RTL_EXPR, "rtl_expr", 'e', 2)
/* & in C. Value is the address at which the operand's value resides. /* & in C. Value is the address at which the operand's value resides.
......
...@@ -749,6 +749,10 @@ struct tree_vec ...@@ -749,6 +749,10 @@ struct tree_vec
/* In a RTL_EXPR node. */ /* In a RTL_EXPR node. */
#define RTL_EXPR_SEQUENCE(NODE) (*(struct rtx_def **) &EXPR_CHECK (NODE)->exp.operands[0]) #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]) #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. */ /* In a CALL_EXPR node. */
#define CALL_EXPR_RTL(NODE) (*(struct rtx_def **) &EXPR_CHECK (NODE)->exp.operands[2]) #define CALL_EXPR_RTL(NODE) (*(struct rtx_def **) &EXPR_CHECK (NODE)->exp.operands[2])
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment