X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firedges_t.h;h=6820ce6532032eb0c9bc4b4512d0d8958405365b;hb=00d3df180d69e4e3fd0b05de4d066667ca8c6e8e;hp=dda30cafb60c16ed984a232709d808beddb3b4bf;hpb=f8cc15664f571aa7ef89d6f6bc8d5bd2b8ca7d53;p=libfirm diff --git a/ir/ir/iredges_t.h b/ir/ir/iredges_t.h index dda30cafb..6820ce653 100644 --- a/ir/ir/iredges_t.h +++ b/ir/ir/iredges_t.h @@ -37,7 +37,14 @@ #include "iredgekinds.h" #include "iredges.h" -#define DBG_EDGES "firm.ir.edges" +#define get_irn_n_edges_kind(irn, kind) get_irn_n_edges_kind_(irn, kind) +#define get_edge_src_irn(edge) get_edge_src_irn_(edge) +#define get_edge_src_pos(edge) get_edge_src_pos_(edge) +#define get_irn_out_edge_next(irn, last, kind) get_irn_out_edge_next_(irn, last, kind) +#define get_irn_n_edges(irn) get_irn_n_edges_kind_(irn, EDGE_KIND_NORMAL) +#define get_irn_out_edge_first(irn) get_irn_out_edge_first_kind_(irn, EDGE_KIND_NORMAL) +#define get_block_succ_first(irn) get_irn_out_edge_first_kind_(irn, EDGE_KIND_BLOCK) +#define get_block_succ_next(irn, last) get_irn_out_edge_next_(irn, last, EDGE_KIND_BLOCK) /** * An edge. @@ -45,9 +52,9 @@ struct ir_edge_t { ir_node *src; /**< The source node of the edge. */ int pos; /**< The position of the edge at @p src. */ - unsigned invalid : 1; /**< edges that are removed are marked invalid. */ +#ifdef DEBUG_libfirm unsigned present : 1; /**< Used by the verifier. Don't rely on its content. */ - unsigned kind : 4; /**< The kind of the edge. */ +#endif struct list_head list; /**< The list head to queue all out edges at a node. */ }; @@ -99,11 +106,11 @@ static inline const ir_edge_t *get_irn_out_edge_first_kind_(const ir_node *irn, * @param last The last out edge you have seen. * @return The next out edge in @p irn 's out list after @p last. */ -static inline const ir_edge_t *get_irn_out_edge_next_(const ir_node *irn, const ir_edge_t *last) +static inline const ir_edge_t *get_irn_out_edge_next_(const ir_node *irn, const ir_edge_t *last, ir_edge_kind_t kind) { struct list_head *next = last->list.next; const struct list_head *head - = &get_irn_edge_info_const(irn, last->kind)->outs_head; + = &get_irn_edge_info_const(irn, kind)->outs_head; return next == head ? NULL : list_entry(next, ir_edge_t, list); } @@ -112,7 +119,7 @@ static inline const ir_edge_t *get_irn_out_edge_next_(const ir_node *irn, const * @param irn The node. * @return The number of edges pointing to this node. */ -static inline int get_irn_n_edges_kind_(const ir_node *irn, int kind) +static inline int get_irn_n_edges_kind_(const ir_node *irn, ir_edge_kind_t kind) { return get_irn_edge_info_const(irn, kind)->out_count; } @@ -122,6 +129,12 @@ static inline int edges_activated_kind_(const ir_graph *irg, ir_edge_kind_t kind return get_irg_edge_info_const(irg, kind)->activated; } +static inline int edges_activated_(const ir_graph *irg) +{ + return edges_activated_kind(irg, EDGE_KIND_NORMAL) + && edges_activated_kind(irg, EDGE_KIND_BLOCK); +} + /** * Assure, that the edges information is present for a certain graph. * @param irg The graph. @@ -134,6 +147,8 @@ static inline void edges_assure_kind_(ir_graph *irg, ir_edge_kind_t kind) void edges_init_graph_kind(ir_graph *irg, ir_edge_kind_t kind); +void edges_node_deleted(ir_node *irn); + /** * A node might be revivaled by CSE. */ @@ -141,28 +156,6 @@ void edges_node_revival(ir_node *node); void edges_invalidate_kind(ir_node *irn, ir_edge_kind_t kind); -/** - * Register additional memory in an edge. - * This must be called before Firm is initialized. - * @param n Number of bytes you need. - * @return A number you have to keep and to pass - * edges_get_private_data() - * to get a pointer to your data. - */ -size_t edges_register_private_data(size_t n); - -/** - * Get a pointer to the private data you registered. - * @param edge The edge. - * @param ofs The number, you obtained with - * edges_register_private_data(). - * @return A pointer to the private data. - */ -static inline void *get_edge_private_data_(const ir_edge_t *edge, int ofs) -{ - return (void *) ((char *) edge + sizeof(edge[0]) + ofs); -} - static inline ir_node *get_edge_src_irn_(const ir_edge_t *edge) { return edge->src; @@ -173,6 +166,17 @@ static inline int get_edge_src_pos_(const ir_edge_t *edge) return edge->pos; } +/** + * Returns the edge object of an outgoing edge at a node. + * @param irn The node at which the edge originates. + * @param pos The position of the edge. + * @param kind The kind of the edge. + * @return The corresponding edge object or NULL, + * if no such edge exists. + */ +FIRM_API const ir_edge_t *get_irn_edge_kind(const ir_node *irn, + int pos, ir_edge_kind_t kind); + /** * Initialize the out edges. * This must be called before firm is initialized. @@ -187,32 +191,7 @@ void edges_invalidate_all(ir_node *irn); */ void edges_dump_kind(ir_graph *irg, ir_edge_kind_t kind); -/** - * Notify normal and block edges. - */ -void edges_notify_edge(ir_node *src, int pos, ir_node *tgt, - ir_node *old_tgt, ir_graph *irg); - -#define get_irn_n_edges_kind(irn, kind) get_irn_n_edges_kind_(irn, kind) -#define get_edge_src_irn(edge) get_edge_src_irn_(edge) -#define get_edge_src_pos(edge) get_edge_src_pos_(edge) -#define get_edge_private_data(edge, ofs) get_edge_private_data_(edge,ofs) -#define get_irn_out_edge_next(irn, last) get_irn_out_edge_next_(irn, last) - -#ifndef get_irn_n_edges -#define get_irn_n_edges(irn) get_irn_n_edges_kind_(irn, EDGE_KIND_NORMAL) -#endif - -#ifndef get_irn_out_edge_first -#define get_irn_out_edge_first(irn) get_irn_out_edge_first_kind_(irn, EDGE_KIND_NORMAL) -#endif - -#ifndef get_block_succ_first -#define get_block_succ_first(irn) get_irn_out_edge_first_kind_(irn, EDGE_KIND_BLOCK) -#endif - -#ifndef get_block_succ_next -#define get_block_succ_next(irn, last) get_irn_out_edge_next_(irn, last) -#endif +void edges_notify_edge(ir_node *src, int pos, ir_node *tgt, ir_node *old_tgt, + ir_graph *irg); #endif