15 struct _domtree_t *up, *right, *down;
24 domtree_t *domtree_find(dominfo_t *dom, ir_node *block) {
25 assert(is_Block(block));
26 return (domtree_t *)pmap_find(dom->b2dom, block);
30 static void domtree_insert(dominfo_t *dom, ir_node *idom, ir_node *dominated) {
31 domtree_t *parent, *child;
33 parent = domtree_find(dom, idom);
35 parent = malloc(sizeof(domtree_t));
37 parent->up = parent->right = parent->down = NULL;
38 pmap_insert(dom->b2dom, idom, parent);
41 child = domtree_find(dom, dominated);
43 child = malloc(sizeof(domtree_t));
44 child->block = dominated;
45 child->up = child->right = child->down = NULL;
46 pmap_insert(dom->b2dom, dominated, child);
49 child->right = parent->down;
55 static void block_walker(ir_node *node, void *env) {
60 idom = get_Block_idom(node);
61 domtree_insert((dominfo_t *)env, idom, node);
65 dominfo_t *domtree_create(ir_graph *irg) {
69 res = malloc(sizeof(dominfo_t));
70 res->b2dom = pmap_create();
72 /* construct domtree */
74 irg_walk_graph(irg, block_walker, NULL, res);
75 free_dom_and_peace(irg);
77 /* determine root of dom tree and store in dominfo. */
78 dom = pmap_first(res->b2dom)->value;
87 void domtree_free(dominfo_t *dom) {
90 for (e = pmap_first(dom->b2dom); e; e = pmap_next(dom->b2dom))
93 pmap_destroy(dom->b2dom);