From 229c9d24147d83fb3160da88436c3b95fb1b2b1b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20W=C3=BCrdig?= Date: Tue, 26 Sep 2006 14:57:59 +0000 Subject: [PATCH] added function to remove a keepalive edge [r8298] --- ir/ir/irnode.c | 19 +++++++++++++++++++ ir/ir/irnode.h | 3 +++ 2 files changed, 22 insertions(+) diff --git a/ir/ir/irnode.c b/ir/ir/irnode.c index 20ec626fd..cac438760 100644 --- a/ir/ir/irnode.c +++ b/ir/ir/irnode.c @@ -888,6 +888,25 @@ void set_End_keepalives(ir_node *end, int n, ir_node *in[]) { edges_notify_edge(end, END_KEEPALIVE_OFFSET + i, NULL, end->in[1 + END_KEEPALIVE_OFFSET + i], irg); } } +/* Set new keep-alives from old keep-alives, skipping irn */ +void remove_End_keepalive(ir_node *end, ir_node *irn) { + int n = get_End_n_keepalives(end); + ir_node **in; + int i, idx; + + NEW_ARR_A(ir_node *, in, n); + + for (idx = i = 0; i < n; ++i) { + ir_node *old_ka = get_End_keepalive(end, i); + + /* skip irn */ + if (old_ka != irn) + in[idx++] = old_ka; + } + + /* set new keep-alives */ + set_End_keepalives(end, idx, in); +} void free_End (ir_node *end) { diff --git a/ir/ir/irnode.h b/ir/ir/irnode.h index aaabf5b6a..efd2c5a79 100644 --- a/ir/ir/irnode.h +++ b/ir/ir/irnode.h @@ -391,6 +391,9 @@ void set_End_keepalive(ir_node *end, int pos, ir_node *ka); /** Set new keep-alives */ void set_End_keepalives(ir_node *end, int n, ir_node *in[]); +/* Set new keep-alives from old keep-alives, skipping irn */ +void remove_End_keepalive(ir_node *end, ir_node *irn); + /** Some parts of the End node are allocated separately -- their memory is not recovered by dead_node_elimination if a End node is dead. free_End() frees these data structures. */ -- 2.20.1