#include <stdlib.h>
+#include "debug.h"
+#include "hashptr.h"
+#include "set.h"
+#include "irprintf_t.h"
#include "irgwalk.h"
+
#include "irdom.h"
#include "domtree.h"
+struct _domtree_t {
+ ir_node *block;
+ struct _domtree_t *up, *right, *down;
+};
+
+struct _dominfo_t {
+ domtree_t *root;
+ set *b2dom;
+};
+
+
+static firm_dbg_module_t *dbg = NULL;
+
+
+int set_cmp_domtree(const void *x, const void *y, size_t size) {
+ return ((domtree_t *)x)->block != ((domtree_t *)y)->block;
+}
+
domtree_t *domtree_find(dominfo_t *dom, ir_node *block) {
+ domtree_t d;
+ DBG((dbg, 1, "%n\n", block));
assert(is_Block(block));
- return (domtree_t *)pmap_find(dom->b2dom, block);
+ d.block = block;
+ return set_find(dom->b2dom, &d, sizeof(d), HASH_PTR(block));
}
static void domtree_insert(dominfo_t *dom, ir_node *idom, ir_node *dominated) {
domtree_t *parent, *child;
+ DBG((dbg, 1, "%n %n\n", idom, dominated));
parent = domtree_find(dom, idom);
if (!parent) {
- parent = malloc(sizeof(domtree_t));
- parent->block = idom;
- parent->up = parent->right = parent->down = NULL;
- pmap_insert(dom->b2dom, idom, parent);
+ domtree_t d;
+ d.block = idom;
+ d.up = d.right = d.down = NULL;
+ set_insert(dom->b2dom, &d, sizeof(d), HASH_PTR(idom));
}
child = domtree_find(dom, dominated);
if (!child) {
- child = malloc(sizeof(domtree_t));
- child->block = dominated;
- child->up = child->right = child->down = NULL;
- pmap_insert(dom->b2dom, dominated, child);
+ domtree_t d;
+ d.block = dominated;
+ d.up = d.right = d.down = NULL;
+ set_insert(dom->b2dom, &d, sizeof(d), HASH_PTR(dominated));
}
+ /* get them (perhaps) again, cause they were _copied_ */
+ parent = domtree_find(dom, idom);
+ child = domtree_find(dom, dominated);
+
child->right = parent->down;
child->up = parent;
parent->down = child;
return;
idom = get_Block_idom(node);
- domtree_insert((dominfo_t *)env, idom, node);
+
+ if (idom)
+ domtree_insert((dominfo_t *)env, idom, node);
}
dominfo_t *res;
domtree_t *dom;
+ dbg = firm_dbg_register("Domtree");
+ firm_dbg_set_mask(dbg, 1);
+
+ DBG((dbg, 1, "\n"));
res = malloc(sizeof(dominfo_t));
- res->b2dom = pmap_create();
+ res->b2dom = new_set(set_cmp_domtree, 64);
/* construct domtree */
compute_doms(irg);
free_dom_and_peace(irg);
/* determine root of dom tree and store in dominfo. */
- dom = pmap_first(res->b2dom)->value;
+ dom = set_first(res->b2dom);
+ set_break(res->b2dom);
while (dom->up)
dom = dom->up;
res->root = dom;
void domtree_free(dominfo_t *dom) {
- pmap_entry *e;
-
- for (e = pmap_first(dom->b2dom); e; e = pmap_next(dom->b2dom))
- free(e->value);
-
- pmap_destroy(dom->b2dom);
+ DBG((dbg, 1, "\n"));
+ del_set(dom->b2dom);
free(dom);
}