+
+static void clear_link(ir_node *irn, void *data)
+{
+ set_irn_link(irn, NULL);
+}
+
+static void collect_phis(ir_node *irn, void *data)
+{
+ if(is_Phi(irn)) {
+ ir_node *bl = get_nodes_block(irn);
+ set_irn_link(irn, get_irn_link(bl));
+ set_irn_link(bl, irn);
+ }
+}
+
+void be_clear_links(ir_graph *irg)
+{
+ irg_walk_graph(irg, clear_link, NULL, NULL);
+}
+
+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 */
+}