#define ValueType ir_edge_t*
#define NullValue NULL
#define DeletedValue ((ir_edge_t*)-1)
-#define Hash(this,key) (HASH_PTR(key->src) ^ (key->pos * 40013))
+#define Hash(this,key) (hash_ptr(key->src) ^ (key->pos * 40013))
#define KeysEqual(this,key1,key2) ((key1->src) == (key2->src) && (key1->pos == key2->pos))
#define SetRangeEmpty(ptr,size) memset(ptr, 0, (size) * sizeof((ptr)[0]))
#define hashset_iterator_next ir_edgeset_iterator_next
#define hashset_remove_iterator ir_edgeset_remove_iterator
-#include "hashset.c"
+#include "hashset.c.inl"
/**
* A function that allows for setting an edge.
#define get_irn_out_list_head(irn) (&get_irn_out_info(irn)->outs)
-#define edge_hash(edge) (TIMES37((edge)->pos) + HASH_PTR((edge)->src))
+#define edge_hash(edge) (TIMES37((edge)->pos) + hash_ptr((edge)->src))
void edges_init_graph_kind(ir_graph *irg, ir_edge_kind_t kind)
{
edges_notify_edge_kind(src, pos, bl_tgt, bl_old, EDGE_KIND_BLOCK, irg);
} else if (get_irn_mode(src) == mode_X && old_tgt != NULL && is_Block(old_tgt)) {
/* moving a jump node from one block to another */
- const ir_edge_t *edge;
- const ir_edge_t *next;
- foreach_out_edge_kind_safe(old_tgt, edge, next, EDGE_KIND_BLOCK) {
+ foreach_out_edge_kind_safe(old_tgt, edge, EDGE_KIND_BLOCK) {
ir_node *succ = get_edge_src_irn(edge);
int succ_pos = get_edge_src_pos(edge);
ir_node *block_pred = get_Block_cfgpred(succ, succ_pos);
ir_edgeset_destroy(&info->edges);
info->allocated = 0;
}
+ clear_irg_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_OUT_EDGES);
}
int (edges_activated_kind)(const ir_graph *irg, ir_edge_kind_t kind)
}
}
+void edges_reroute_except(ir_node *from, ir_node *to, ir_node *exception)
+{
+ foreach_out_edge_safe(from, edge) {
+ ir_node *src = get_edge_src_irn(edge);
+ if (src == exception)
+ continue;
+ set_irn_n(src, edge->pos, to);
+ }
+}
+
static void verify_set_presence(ir_node *irn, void *data)
{
build_walker *w = (build_walker*)data;
static void verify_list_presence(ir_node *irn, void *data)
{
- build_walker *w = (build_walker*)data;
- const ir_edge_t *e;
+ build_walker *w = (build_walker*)data;
bitset_set(w->reachable, get_irn_idx(irn));
int list_cnt;
int ref_cnt;
int edge_cnt;
- size_t idx;
const struct list_head *head;
const struct list_head *pos;
ir_graph *irg;
{
edges_activate_kind(irg, EDGE_KIND_NORMAL);
edges_activate_kind(irg, EDGE_KIND_BLOCK);
- if (get_irg_phase_state(irg) == phase_backend)
- edges_activate_kind(irg, EDGE_KIND_DEP);
+ edges_activate_kind(irg, EDGE_KIND_DEP);
}
void edges_deactivate(ir_graph *irg)
{
- if (get_irg_phase_state(irg) == phase_backend)
- edges_deactivate_kind(irg, EDGE_KIND_DEP);
+ edges_deactivate_kind(irg, EDGE_KIND_DEP);
edges_deactivate_kind(irg, EDGE_KIND_BLOCK);
edges_deactivate_kind(irg, EDGE_KIND_NORMAL);
}
-int edges_assure(ir_graph *irg)
+void assure_edges(ir_graph *irg)
{
- int activated = 0;
-
- if (edges_activated_kind(irg, EDGE_KIND_BLOCK)) {
- activated = 1;
- } else {
- edges_activate_kind(irg, EDGE_KIND_BLOCK);
- }
- if (edges_activated_kind(irg, EDGE_KIND_NORMAL)) {
- activated = 1;
- } else {
- edges_activate_kind(irg, EDGE_KIND_NORMAL);
- }
-
- return activated;
+ assure_edges_kind(irg, EDGE_KIND_BLOCK);
+ assure_edges_kind(irg, EDGE_KIND_NORMAL);
+ assure_edges_kind(irg, EDGE_KIND_DEP);
+ add_irg_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_OUT_EDGES);
}
-int edges_assure_kind(ir_graph *irg, ir_edge_kind_t kind)
+void assure_edges_kind(ir_graph *irg, ir_edge_kind_t kind)
{
- int activated = edges_activated_kind(irg, kind);
-
- if (!activated)
+ if (!edges_activated_kind(irg, kind))
edges_activate_kind(irg, kind);
-
- return activated;
}
void edges_node_deleted(ir_node *irn)
{
edges_node_deleted_kind(irn, EDGE_KIND_NORMAL);
edges_node_deleted_kind(irn, EDGE_KIND_BLOCK);
+ edges_node_deleted_kind(irn, EDGE_KIND_DEP);
}
void edges_node_revival(ir_node *irn)
static void irg_walk_edges2(ir_node *node, irg_walk_func *pre,
irg_walk_func *post, void *env)
{
- const ir_edge_t *edge, *next;
-
if (irn_visited_else_mark(node))
return;
if (pre != NULL)
pre(node, env);
- foreach_out_edge_kind_safe(node, edge, next, EDGE_KIND_NORMAL) {
+ foreach_out_edge_kind_safe(node, edge, EDGE_KIND_NORMAL) {
/* find the corresponding successor block. */
ir_node *pred = get_edge_src_irn(edge);
irg_walk_edges2(pred, pre, post, env);
static void irg_block_edges_walk2(ir_node *bl, irg_walk_func *pre,
irg_walk_func *post, void *env)
{
- const ir_edge_t *edge, *next;
-
if (!Block_block_visited(bl)) {
mark_Block_block_visited(bl);
if (pre)
pre(bl, env);
- foreach_out_edge_kind_safe(bl, edge, next, EDGE_KIND_BLOCK) {
+ foreach_out_edge_kind_safe(bl, edge, EDGE_KIND_BLOCK) {
/* find the corresponding successor block. */
ir_node *pred = get_edge_src_irn(edge);
irg_block_edges_walk2(pred, pre, post, env);