13 domtree_t *domtree_find(dominfo_t *dom, ir_node *block) {
14 assert(is_Block(block));
15 return (domtree_t *)pmap_find(dom->b2dom, block);
19 static void domtree_insert(dominfo_t *dom, ir_node *idom, ir_node *dominated) {
20 domtree_t *parent, *child;
22 parent = domtree_find(dom, idom);
24 parent = malloc(sizeof(domtree_t));
26 parent->up = parent->right = parent->down = NULL;
27 pmap_insert(dom->b2dom, idom, parent);
30 child = domtree_find(dom, dominated);
32 child = malloc(sizeof(domtree_t));
33 child->block = dominated;
34 child->up = child->right = child->down = NULL;
35 pmap_insert(dom->b2dom, dominated, child);
38 child->right = parent->down;
44 static void block_walker(ir_node *node, void *env) {
49 idom = get_Block_idom(node);
50 domtree_insert((dominfo_t *)env, idom, node);
54 dominfo_t *domtree_create(ir_graph *irg) {
58 res = malloc(sizeof(dominfo_t));
59 res->b2dom = pmap_create();
61 /* construct domtree */
63 irg_walk_graph(irg, block_walker, NULL, res);
64 free_dom_and_peace(irg);
66 /* determine root of dom tree and store in dominfo. */
67 dom = pmap_first(res->b2dom)->value;
76 void domtree_free(dominfo_t *dom) {
79 for (e = pmap_first(dom->b2dom); e; e = pmap_next(dom->b2dom))
82 pmap_destroy(dom->b2dom);