X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeifg.h;h=482bf20362f395f016b4ff57c148f9441f1fd438;hb=f5a1564c99cbdfc8d4773385beeb10f45a989755;hp=182ed7969e6db2db6073459d7902dfb5f0d2ebb2;hpb=0b4a2ee44d0acf366025f06f466e3f6040de604b;p=libfirm diff --git a/ir/be/beifg.h b/ir/be/beifg.h index 182ed7969..482bf2036 100644 --- a/ir/be/beifg.h +++ b/ir/be/beifg.h @@ -1,79 +1,39 @@ /** - * Common use interference graph. - * Originally written by Sebastian Hack. Refactored into a seperate - * source file and header by Kimon Hoffmann. + * @file beifg.h + * @date 18.11.2005 * @author Sebastian Hack - * @date 27.06.2005 + * + * Copyright (C) 2005 Universitaet Karlsruhe + * Released under the GPL */ -#ifndef _BEIFG_H_ -#define _BEIFG_H_ -typedef struct _be_if_graph_t be_if_graph_t; -typedef struct _be_if_node_t be_if_node_t; -typedef struct _be_if_edge_t be_if_edge_t; +#ifndef _BEIFG_H +#define _BEIFG_H -/** - * Creates a new interference graph with the specified number of - * initial slots. - * @param slots the initial number of slots used for hashing. - * Must be greater than 0. - * @return the created, empty interference graph. - */ -be_if_graph_t* be_ifg_new(int slots); - -/** - * Frees the passed interference graph an all contained nodes. - * @param graph the interference graph that shall be freed. Please note - * that after a call to this function all pointers to the graph, - * its edges or its nodes are invalid. - */ -void be_ifg_free(be_if_graph_t* graph); - -/** - * Adds a new undirected interference edge between the two nodes - * specified by their node numbers. If the corresponding nodes do - * not yet exist in the iunterference grpah they are created pririor - * to creation of the edge. - * @param graph the graph to add the interference edge to. - * @param source the key of the source node. - * @param target the key of the target node. - */ -void be_ifg_add_interference(be_if_graph_t* graph, int source, int target); +#include "irnode.h" -/** - * Returns the set of all edges within the specified - * graph. - * @param graph the graph the return the set of edges of. - * @return A set of all edges within the specified graph as - * be_if_edge_t instances. - */ -set* be_get_ifg_edges(const be_if_graph_t* graph); +typedef struct _be_ifg_impl_t be_ifg_impl_t; +typedef struct _be_ifg_t be_ifg_t; -/** - * Returns the set of all nodes within the specified - * graph. - * @param graph the graph the return the set of nodes of. - * @return A set of all nodes within the specified graph as - * be_if_node_t instances. - */ -set* be_get_ifg_nodes(const be_if_graph_t* graph); +#define be_ifg_nodes_iter_alloca(self) (alloca(be_ifg_nodes_iter_size(self))) +#define be_ifg_neighbours_iter_alloca(self) (alloca(be_ifg_neighbours_iter_size(self))) -/** - * Returns whether the specified graph alreadz contains an undirected - * edge between the two passed nodes. - * @param graph the graph to which containment both nodes @p n1 and - * @p n2 belong. - * @param n1 the one end of the edge to query the graph for. - * @param n2 the other end of the edge. - * @return TRUE if the graph contains an edge between @p n1 and @p n2, - * otherwise FALSE. - */ -int be_ifg_has_edge(const be_if_graph_t* graph, const be_if_node_t* n1, const be_if_node_t* n2); +size_t (be_ifg_nodes_iter_size)(const void *self); +size_t (be_ifg_neighbours_iter_size)(const void *self); +void (be_ifg_free)(void *self); +int (be_ifg_connected)(const void *self, const ir_node *a, const ir_node *b); +ir_node *(be_ifg_neighbours_begin)(const void *self, void *iter, const ir_node *irn); +ir_node *(be_ifg_neighbours_next)(const void *self, void *iter); +void (be_ifg_neighbours_break)(const void *self, void *iter); +ir_node *(be_ifg_nodes_begin)(const void *self, void *iter); +ir_node *(be_ifg_nodes_next)(const void *self, void *iter); +void (be_ifg_nodes_break)(const void *self, void *iter); +int (be_ifg_degree)(const void *self, const ir_node *irn); -#define be_ifn_get_degree(ifnode) \ - pset_count(ifnode->neighb) +#define be_ifg_foreach_neighbour(self, iter, irn, pos) \ + for(pos = be_ifg_neighbours_begin(self, iter, irn); (pos); pos = be_ifg_neighbours_next(self, iter)) -#define be_ifn_foreach_neighbour(ifnode, curr) \ - for (curr = pset_first(ifnode->neighb); curr; curr = pset_next(ifnode->neighb)) +#define be_ifg_foreach_node(self, iter, pos) \ + for(pos = be_ifg_nodes_begin(self, iter); (pos); pos = be_ifg_nodes_next(self, iter)) -#endif /*_BEIFG_H_*/ +#endif /* _BEIFG_H */