11 #include "irprintf_t.h"
19 struct _domtree_t *up, *right, *down;
28 static firm_dbg_module_t *dbg = NULL;
31 int set_cmp_domtree(const void *x, const void *y, size_t size) {
32 return ((domtree_t *)x)->block != ((domtree_t *)y)->block;
36 domtree_t *domtree_find(dominfo_t *dom, ir_node *block) {
38 DBG((dbg, 1, "%n\n", block));
39 assert(is_Block(block));
41 return set_find(dom->b2dom, &d, sizeof(d), HASH_PTR(block));
45 static void domtree_insert(dominfo_t *dom, ir_node *idom, ir_node *dominated) {
46 domtree_t *parent, *child;
48 DBG((dbg, 1, "%n %n\n", idom, dominated));
49 parent = domtree_find(dom, idom);
53 d.up = d.right = d.down = NULL;
54 set_insert(dom->b2dom, &d, sizeof(d), HASH_PTR(idom));
57 child = domtree_find(dom, dominated);
61 d.up = d.right = d.down = NULL;
62 set_insert(dom->b2dom, &d, sizeof(d), HASH_PTR(dominated));
65 /* get them (perhaps) again, cause they were _copied_ */
66 parent = domtree_find(dom, idom);
67 child = domtree_find(dom, dominated);
69 child->right = parent->down;
75 static void block_walker(ir_node *node, void *env) {
80 idom = get_Block_idom(node);
83 domtree_insert((dominfo_t *)env, idom, node);
87 dominfo_t *domtree_create(ir_graph *irg) {
91 dbg = firm_dbg_register("Domtree");
92 firm_dbg_set_mask(dbg, 1);
95 res = malloc(sizeof(dominfo_t));
96 res->b2dom = new_set(set_cmp_domtree, 64);
98 /* construct domtree */
100 irg_walk_graph(irg, block_walker, NULL, res);
101 free_dom_and_peace(irg);
103 /* determine root of dom tree and store in dominfo. */
104 dom = set_first(res->b2dom);
105 set_break(res->b2dom);
114 void domtree_free(dominfo_t *dom) {