From 378ec2fefc9d98c063c39be1c6775a0cf2409654 Mon Sep 17 00:00:00 2001 From: Daniel Grund Date: Wed, 25 Jan 2006 17:59:10 +0000 Subject: [PATCH] Added a dom-tree-upwards search --- ir/be/beutil.c | 18 ++++++++++++++++++ ir/be/beutil.h | 8 ++++++++ 2 files changed, 26 insertions(+) diff --git a/ir/be/beutil.c b/ir/be/beutil.c index 97e12684b..d1d53c49a 100644 --- a/ir/be/beutil.c +++ b/ir/be/beutil.c @@ -7,6 +7,7 @@ #include "irgraph.h" #include "irgwalk.h" #include "irdump_t.h" +#include "irdom_t.h" #include "ircons.h" #include "iropt.h" #include "irgopt.h" @@ -160,3 +161,20 @@ void be_collect_phis(ir_graph *irg) { irg_walk_graph(irg, collect_phis, NULL, NULL); } + + +ir_node *dom_up_search(pset *accept, ir_node *start_point_exclusive) { + ir_node *irn, *idom; + + /* search the current block */ + for (irn=sched_prev(start_point_exclusive); irn; irn=sched_prev(irn)) + if (pset_find_ptr(accept, irn)) + return irn; + + idom = get_Block_idom(get_nodes_block(start_point_exclusive)); + + if (idom) + return dom_up_search(accept, idom); /* continue search in idom-block */ + else + return NULL; /* this was the start block and we did not find an acceptable irn */ +} diff --git a/ir/be/beutil.h b/ir/be/beutil.h index 8df13b838..84a59ede8 100644 --- a/ir/be/beutil.h +++ b/ir/be/beutil.h @@ -6,6 +6,7 @@ #include +#include "pset.h" #include "irnode.h" #include "bearch.h" @@ -94,3 +95,10 @@ static INLINE FILE *ffopen(const char *base, const char *ext, const char *mode) void dump_ir_block_graph_sched(ir_graph *irg, const char *suffix); #endif + +/** + * Search for an irn in @p accept. + * The search is started at @p start_point_exclusive and continues upwards the dom-tree + * @return The first node out of accept if found. Else NULL is returned. + */ +ir_node *dom_up_search(pset *accept, ir_node *start_point_exclusive); -- 2.20.1