fix_backedges(irg->obst, node);
memcpy((*pOld_in) + 1, in, sizeof(ir_node *) * arity);
+
+ /* update irg flags */
+ set_irg_outs_inconsistent(irg);
+ set_irg_loopinfo_inconsistent(irg);
}
ir_node *(get_irn_n)(const ir_node *node, int n)
edges_notify_edge(node, n, in, node->in[n + 1], irg);
node->in[n + 1] = in;
+
+ /* update irg flags */
+ set_irg_outs_inconsistent(irg);
+ set_irg_loopinfo_inconsistent(irg);
}
int add_irn_n(ir_node *node, ir_node *in)
return _Block_block_visited(node);
}
-ir_node *(set_Block_dead)(ir_node *block)
-{
- return _set_Block_dead(block);
-}
-
-int (is_Block_dead)(const ir_node *block)
-{
- return _is_Block_dead(block);
-}
-
ir_extblk *get_Block_extbb(const ir_node *block)
{
ir_extblk *res;
end->in[1 + END_KEEPALIVE_OFFSET + i] = in[i];
edges_notify_edge(end, END_KEEPALIVE_OFFSET + i, end->in[1 + END_KEEPALIVE_OFFSET + i], NULL, irg);
}
+
+ /* update irg flags */
+ set_irg_outs_inconsistent(irg);
}
/* Set new keep-alives from old keep-alives, skipping irn */
}
/* now n - 1 keeps, 1 block input */
ARR_RESIZE(ir_node *, end->in, (n - 1) + 1 + END_KEEPALIVE_OFFSET);
+
+ /* update irg flags */
+ set_irg_outs_inconsistent(irg);
}
/* remove Bads, NoMems and doublets from the keep-alive set */
pset_new_t keeps;
int idx, n = get_End_n_keepalives(end);
ir_graph *irg;
+ bool changed = false;
if (n <= 0)
return;
ir_node *ka = get_End_keepalive(end, idx);
if (is_Bad(ka) || is_NoMem(ka) || pset_new_contains(&keeps, ka)) {
+ changed = true;
/* remove the edge */
edges_notify_edge(end, idx, NULL, ka, irg);
ARR_RESIZE(ir_node *, end->in, n + 1 + END_KEEPALIVE_OFFSET);
pset_new_destroy(&keeps);
+
+ if (changed) {
+ set_irg_outs_inconsistent(irg);
+ }
}
void free_End(ir_node *end)
ir_node *get_memop_mem(const ir_node *node)
{
assert(is_memop(node));
+ assert(n_Load_mem == 0 && n_Store_mem == 0);
return get_irn_n(node, 0);
}
void set_memop_mem(ir_node *node, ir_node *mem)
{
assert(is_memop(node));
+ assert(n_Load_mem == 0 && n_Store_mem == 0);
set_irn_n(node, 0, mem);
}
ir_node *get_memop_ptr(const ir_node *node)
{
assert(is_memop(node));
+ assert(n_Load_mem == 1 && n_Store_mem == 1);
return get_irn_n(node, 1);
}
void set_memop_ptr(ir_node *node, ir_node *ptr)
{
assert(is_memop(node));
+ assert(n_Load_mem == 1 && n_Store_mem == 1);
set_irn_n(node, 1, ptr);
}
return _is_arg_Proj(node);
}
+int is_x_except_Proj(const ir_node *node)
+{
+ ir_node *pred;
+ if (!is_Proj(node))
+ return false;
+ pred = get_Proj_pred(node);
+ if (!is_fragile_op(pred))
+ return false;
+ return get_Proj_proj(node) == pred->op->pn_x_except;
+}
+
+int is_x_regular_Proj(const ir_node *node)
+{
+ ir_node *pred;
+ if (!is_Proj(node))
+ return false;
+ pred = get_Proj_pred(node);
+ if (!is_fragile_op(pred))
+ return false;
+ return get_Proj_proj(node) == pred->op->pn_x_regular;
+}
+
ir_node **get_Tuple_preds_arr(ir_node *node)
{
assert(is_Tuple(node));
return is_op_cfopcode(get_irn_op(node));
}
+int is_unknown_jump(const ir_node *node)
+{
+ return is_op_unknown_jump(get_irn_op(node));
+}
+
/* Returns true if the operation can change the control flow because
of an exception. */
int is_fragile_op(const ir_node *node)
ir_node *get_fragile_op_mem(ir_node *node)
{
assert(node && is_fragile_op(node));
-
- switch (get_irn_opcode(node)) {
- case iro_Call :
- case iro_Div :
- case iro_Mod :
- case iro_Load :
- case iro_Store :
- case iro_Alloc :
- case iro_Bound :
- case iro_CopyB :
- return get_irn_n(node, pn_Generic_M);
- case iro_Bad :
- case iro_Unknown:
- return node;
- default:
- panic("should not be reached");
- }
+ return get_irn_n(node, node->op->fragile_mem_index);
}
/* Returns true if the operation is a forking control flow operation. */
}
/* Sets the get_type operation for an ir_op_ops. */
-ir_op_ops *firm_set_default_get_type_attr(ir_opcode code, ir_op_ops *ops)
+ir_op_ops *firm_set_default_get_type_attr(unsigned code, ir_op_ops *ops)
{
switch (code) {
case iro_SymConst: ops->get_type_attr = get_SymConst_attr_type; break;
}
/* Sets the get_type operation for an ir_op_ops. */
-ir_op_ops *firm_set_default_get_entity_attr(ir_opcode code, ir_op_ops *ops)
+ir_op_ops *firm_set_default_get_entity_attr(unsigned code, ir_op_ops *ops)
{
switch (code) {
case iro_SymConst: ops->get_entity_attr = get_SymConst_attr_entity; break;