From c89e74c65341bb0e168fcabe76fcc33a1be452e4 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Thu, 21 Jun 2012 11:46:29 +0200 Subject: [PATCH 1/1] iredges: introduce new reroute_edges_except I expect this to be a common pattern --- include/libfirm/iredges.h | 7 +++++++ ir/ir/iredges.c | 12 ++++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/libfirm/iredges.h b/include/libfirm/iredges.h index 2819722fe..8847378cb 100644 --- a/include/libfirm/iredges.h +++ b/include/libfirm/iredges.h @@ -161,6 +161,13 @@ FIRM_API void edges_deactivate_kind(ir_graph *irg, ir_edge_kind_t kind); */ FIRM_API void edges_reroute_kind(ir_node *old, ir_node *nw, ir_edge_kind_t kind); +/** + * reroutes (normal) edges from an old node to a new node, except for the + * @p exception which keeps its input even if it is old. + */ +FIRM_API void edges_reroute_except(ir_node *old, ir_node *nw, + ir_node *exception); + /** * Verifies the out edges of graph @p irg. * @return 1 if a problem was found, 0 otherwise diff --git a/ir/ir/iredges.c b/ir/ir/iredges.c index c83d49755..cb163b144 100644 --- a/ir/ir/iredges.c +++ b/ir/ir/iredges.c @@ -657,6 +657,18 @@ void edges_reroute_kind(ir_node *from, ir_node *to, ir_edge_kind_t kind) } } +void edges_reroute_except(ir_node *from, ir_node *to, ir_node *exception) +{ + const ir_edge_t *edge; + const ir_edge_t *next; + foreach_out_edge_safe(from, edge, next) { + ir_node *src = get_edge_src_irn(edge); + if (src == exception) + continue; + set_irn_n(src, edge->pos, to); + } +} + static void verify_set_presence(ir_node *irn, void *data) { build_walker *w = (build_walker*)data; -- 2.20.1