Commit 52a92176 by Alex Samuel Committed by Alex Samuel

ggc.h (ggc_test_and_set_mark): New macro.

	* ggc.h (ggc_test_and_set_mark): New macro.
	(ggc_mark_rtx): Use ggc_test_and_set_mark.
	(ggc_mark_tree): Likewise.
	(ggc_mark_rtvec): Likewise.
	* ggc-common.c (ggc_mark_rtx_children): Reduce recursion.

From-SVN: r30734
parent 777ad4c2
1999-11-30 Alex Samuel <samuel@codesourcery.com>
* ggc.h (ggc_test_and_set_mark): New macro.
(ggc_mark_rtx): Use ggc_test_and_set_mark.
(ggc_mark_tree): Likewise.
(ggc_mark_rtvec): Likewise.
* ggc-common.c (ggc_mark_rtx_children): Reduce recursion.
1999-11-30 Jason Merrill <jason@casey.cygnus.com> 1999-11-30 Jason Merrill <jason@casey.cygnus.com>
* dwarf2out.c (scope_die_for): Only handle types. Only search for * dwarf2out.c (scope_die_for): Only handle types. Only search for
......
...@@ -234,7 +234,13 @@ ggc_mark_rtx_children (r) ...@@ -234,7 +234,13 @@ ggc_mark_rtx_children (r)
{ {
const char *fmt; const char *fmt;
int i; int i;
rtx next_rtx;
do
{
enum rtx_code code = GET_CODE (r); enum rtx_code code = GET_CODE (r);
/* This gets set to a child rtx to eliminate tail recursion. */
next_rtx = NULL;
/* Collect statistics, if appropriate. */ /* Collect statistics, if appropriate. */
if (ggc_stats) if (ggc_stats)
...@@ -243,8 +249,8 @@ ggc_mark_rtx_children (r) ...@@ -243,8 +249,8 @@ ggc_mark_rtx_children (r)
ggc_stats->size_rtxs[(int) code] += ggc_get_size (r); ggc_stats->size_rtxs[(int) code] += ggc_get_size (r);
} }
/* ??? If (some of) these are really pass-dependant info, do we have /* ??? If (some of) these are really pass-dependant info, do we
any right poking our noses in? */ have any right poking our noses in? */
switch (code) switch (code)
{ {
case JUMP_INSN: case JUMP_INSN:
...@@ -291,10 +297,18 @@ ggc_mark_rtx_children (r) ...@@ -291,10 +297,18 @@ ggc_mark_rtx_children (r)
for (fmt = GET_RTX_FORMAT (GET_CODE (r)), i = 0; *fmt ; ++fmt, ++i) for (fmt = GET_RTX_FORMAT (GET_CODE (r)), i = 0; *fmt ; ++fmt, ++i)
{ {
rtx exp;
switch (*fmt) switch (*fmt)
{ {
case 'e': case 'u': case 'e': case 'u':
ggc_mark_rtx (XEXP (r, i)); exp = XEXP (r, i);
if (ggc_test_and_set_mark (exp))
{
if (next_rtx == NULL)
next_rtx = exp;
else
ggc_mark_rtx_children (exp);
}
break; break;
case 'V': case 'E': case 'V': case 'E':
ggc_mark_rtvec (XVEC (r, i)); ggc_mark_rtvec (XVEC (r, i));
...@@ -304,6 +318,8 @@ ggc_mark_rtx_children (r) ...@@ -304,6 +318,8 @@ ggc_mark_rtx_children (r)
break; break;
} }
} }
}
while ((r = next_rtx) != NULL);
} }
/* V had not been previously marked, but has now been marked via /* V had not been previously marked, but has now been marked via
......
...@@ -64,24 +64,29 @@ extern void ggc_mark_rtx_children PROTO ((struct rtx_def *)); ...@@ -64,24 +64,29 @@ extern void ggc_mark_rtx_children PROTO ((struct rtx_def *));
extern void ggc_mark_rtvec_children PROTO ((struct rtvec_def *)); extern void ggc_mark_rtvec_children PROTO ((struct rtvec_def *));
extern void ggc_mark_tree_children PROTO ((union tree_node *)); extern void ggc_mark_tree_children PROTO ((union tree_node *));
/* If EXPR is not NULL and previously unmarked, mark it and evaluate
to true. Otherwise evaluate to false. */
#define ggc_test_and_set_mark(EXPR) \
((EXPR) != NULL && ! ggc_set_mark (EXPR))
#define ggc_mark_rtx(EXPR) \ #define ggc_mark_rtx(EXPR) \
do { \ do { \
rtx r__ = (EXPR); \ rtx r__ = (EXPR); \
if (r__ != NULL && ! ggc_set_mark (r__)) \ if (ggc_test_and_set_mark (r__)) \
ggc_mark_rtx_children (r__); \ ggc_mark_rtx_children (r__); \
} while (0) } while (0)
#define ggc_mark_tree(EXPR) \ #define ggc_mark_tree(EXPR) \
do { \ do { \
tree t__ = (EXPR); \ tree t__ = (EXPR); \
if (t__ != NULL && ! ggc_set_mark (t__)) \ if (ggc_test_and_set_mark (t__)) \
ggc_mark_tree_children (t__); \ ggc_mark_tree_children (t__); \
} while (0) } while (0)
#define ggc_mark_rtvec(EXPR) \ #define ggc_mark_rtvec(EXPR) \
do { \ do { \
rtvec v__ = (EXPR); \ rtvec v__ = (EXPR); \
if (v__ != NULL && ! ggc_set_mark (v__)) \ if (ggc_test_and_set_mark (v__)) \
ggc_mark_rtvec_children (v__); \ ggc_mark_rtvec_children (v__); \
} while (0) } while (0)
......
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