X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Fdfs.c;h=544bfaa22d7061eb81ab5b7bf91b9dad526a3a0b;hb=dd4cd761ab637d4488c7e29f49843b1b02366acf;hp=a85064aeb0618b4f8363a86c0e738c52048a259d;hpb=edc739b393d7982e78a573d854113f47293c96b1;p=libfirm diff --git a/ir/ana/dfs.c b/ir/ana/dfs.c index a85064aeb..544bfaa22 100644 --- a/ir/ana/dfs.c +++ b/ir/ana/dfs.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -32,6 +32,8 @@ #include +#define DISABLE_STATEV + #include #include "irtools.h" #include "irprintf.h" @@ -40,13 +42,6 @@ #include "statev.h" #include "dfs_t.h" -static const char *edge_names[] = { - "anc", - "fwd", - "cross", - "back" -}; - static int cmp_edge(const void *a, const void *b, size_t sz) { const dfs_edge_t *p = a; @@ -121,11 +116,11 @@ static void dfs_perform(dfs_t *dfs, void *n, void *anc, int level) static void classify_edges(dfs_t *dfs) { + dfs_edge_t *edge; stat_ev_cnt_decl(anc); stat_ev_cnt_decl(back); stat_ev_cnt_decl(fwd); stat_ev_cnt_decl(cross); - dfs_edge_t *edge; foreach_set (dfs->edges, edge) { dfs_node_t *src = edge->s; @@ -182,11 +177,28 @@ dfs_t *dfs_new(const absgraph_t *graph_impl, void *graph_self) obstack_init(&res->obst); dfs_perform(res, graph_impl->get_root(graph_self), NULL, 0); + + /* make sure the end node (which might not be accessible) has a number */ + node = get_node(res, graph_impl->get_end(graph_self)); + if (!node->visited) { + node->visited = 1; + node->node = graph_impl->get_end(graph_self); + node->ancestor = NULL; + node->pre_num = res->pre_num++; + node->post_num = res->post_num++; + node->max_pre_num = node->pre_num; + node->level = 0; + } + classify_edges(res); + assert(res->pre_num == res->post_num); res->pre_order = xmalloc(res->pre_num * sizeof(res->pre_order)); - res->post_order = xmalloc(res->pre_num * sizeof(res->post_order)); + res->post_order = xmalloc(res->post_num * sizeof(res->post_order)); foreach_set (res->nodes, node) { + assert(node->pre_num < res->pre_num); + assert(node->post_num < res->post_num); + res->pre_order[node->pre_num] = node; res->post_order[node->post_num] = node; }