FIRM_API ir_node *new_rd_Id(dbg_info *db, ir_node *block,
ir_node *val, ir_mode *mode);
+/** Constructor for a Bad node.
+ *
+ * @param *db A pointer for debug information.
+ * @param *irg The IR graph the node belongs to.
+ */
+FIRM_API ir_node *new_rd_Bad(dbg_info *db, ir_graph *irg);
+
/** Constructor for a Confirm node.
*
* Specifies constraints for a value. To support dataflow analyses.
*/
FIRM_API ir_node *new_rd_Unknown(dbg_info *db, ir_graph *irg, ir_mode *m);
+/** Constructor for a NoMem node.
+ *
+ * @param *db A pointer for debug information.
+ * @param *irg The IR graph the node belongs to.
+ */
+FIRM_API ir_node *new_rd_NoMem(dbg_info *db, ir_graph *irg);
+
/** Constructor for a Mux node.
*
* @param *db A pointer for debug information.
FIRM_API ir_node *new_r_Id(ir_node *block, ir_node *val, ir_mode *mode);
/** Constructor for a Bad node.
- *
- * Returns the unique Bad node of the graph. The same as
- * get_irg_bad().
*
* @param *irg The IR graph the node belongs to.
*/
FIRM_API ir_node *new_r_Unknown(ir_graph *irg, ir_mode *m);
/** Constructor for a NoMem node.
- *
- * Returns the unique NoMem node of the graph. The same as
- * get_irg_no_mem().
*
* @param *irg The IR graph the node belongs to.
*/
*/
FIRM_API ir_node *new_d_Id(dbg_info *db, ir_node *val, ir_mode *mode);
+/** Constructor for a Bad node.
+ *
+ * @param *db A pointer for debug information.
+ */
+FIRM_API ir_node *new_d_Bad(dbg_info *db);
+
/** Constructor for a Confirm node.
*
* Constructor for a Confirm node. Adds the node to the block in current_ir_block.
*/
FIRM_API ir_node *new_d_Unknown(dbg_info *db, ir_mode *m);
+/** Constructor for a NoMem node.
+ *
+ * @param *db A pointer for debug information.
+ */
+FIRM_API ir_node *new_d_NoMem(dbg_info *db);
+
/** Constructor for a Mux node.
*
* @param *db A pointer for debug information.
FIRM_API ir_node *new_Id(ir_node *val, ir_mode *mode);
/** Constructor for a Bad node.
- *
- * Returns the unique Bad node of the graph. The same as
- * get_irg_bad().
*/
FIRM_API ir_node *new_Bad(void);
*/
FIRM_API ir_node *new_Unknown(ir_mode *m);
-/** Constructor for a NoMem node.
- *
- * Returns the unique NoMem node of the graph. The same as
- * get_irg_no_mem().
- */
+/** Constructor for a NoMem node. */
FIRM_API ir_node *new_NoMem(void);
/** Constructor for a Mux node.
{
return new_rd_defaultProj(NULL, arg, max_proj);
}
-ir_node *new_r_Bad(ir_graph *irg)
-{
- return get_irg_bad(irg);
-}
-ir_node *new_r_NoMem(ir_graph *irg)
-{
- return get_irg_no_mem(irg);
-}
ir_node *new_r_ASM(ir_node *block,
int arity, ir_node *in[], ir_asm_constraint *inputs,
int n_outs, ir_asm_constraint *outputs,
{
return new_d_defaultProj(NULL, arg, max_proj);
}
-ir_node *new_Bad(void)
-{
- assert(get_irg_phase_state(current_ir_graph) == phase_building);
- return get_irg_bad(current_ir_graph);
-}
-ir_node *new_NoMem(void)
-{
- assert(get_irg_phase_state(current_ir_graph) == phase_building);
- return get_irg_no_mem(current_ir_graph);
-}
ir_node *new_ASM(int arity, ir_node *in[], ir_asm_constraint *inputs,
int n_outs, ir_asm_constraint *outputs,
int n_clobber, ident *clobber[], ident *text)
ir_node *res;
memset(in, 0, sizeof(in));
res = new_ir_node(NULL, irg, NULL, op_Anchor, mode_ANY, anchor_last, in);
+ res->attr.anchor.irg.irg = irg;
/* hack to get get_irn_irg working: set block to ourself and allow
* get_Block_irg for anchor */
- res->attr.irg.irg = irg;
res->in[0] = res;
return res;
void init_edges(void)
{
FIRM_DBG_REGISTER(dbg, DBG_EDGES);
- /* firm_dbg_set_mask(dbg, -1); */
}
void edges_init_dbg(int do_dbg)
start_block = new_r_Block_noopt(res, 0, NULL);
set_irg_start_block(res, start_block);
- bad = new_ir_node(NULL, res, start_block, op_Bad, mode_T, 0, NULL);
- bad->attr.irg.irg = res;
+ bad = new_r_Bad(res);
set_irg_bad (res, bad);
- set_irg_no_mem (res, new_ir_node(NULL, res, start_block, op_NoMem, mode_M, 0, NULL));
+ set_irg_no_mem (res, new_r_NoMem(res));
start = new_r_Start(res);
set_irg_start (res, start);
/* -- The start block -- */
start_block = new_r_Block_noopt(res, 0, NULL);
set_irg_start_block(res, start_block);
- bad = new_ir_node(NULL, res, start_block, op_Bad, mode_T, 0, NULL);
- bad->attr.irg.irg = res;
+ bad = new_r_Bad(res);
set_irg_bad(res, bad);
- no_mem = new_ir_node(NULL, res, start_block, op_NoMem, mode_M, 0, NULL);
+ no_mem = new_r_NoMem(res);
set_irg_no_mem(res, no_mem);
start = new_r_Start(res);
set_irg_start(res, start);
{
ir_op *op = _get_irn_op(block);
- if (op == op_Bad)
+ /* we can have Bad, Anchor and Block nodes as block input */
+ if (op == op_Bad) {
return 1;
- else {
+ } else if (op == op_Anchor) {
+ return 0;
+ } else {
assert(op == op_Block);
return block->attr.block.is_dead;
}
turn_into_tuple(n, pn_Div_max);
set_Tuple_pred(n, pn_Div_M, mem);
set_Tuple_pred(n, pn_Div_X_regular, new_r_Jmp(blk));
- set_Tuple_pred(n, pn_Div_X_except, new_r_Bad(irg));
+ set_Tuple_pred(n, pn_Div_X_except, get_irg_bad(irg));
set_Tuple_pred(n, pn_Div_res, value);
}
return n;
turn_into_tuple(n, pn_Mod_max);
set_Tuple_pred(n, pn_Mod_M, mem);
set_Tuple_pred(n, pn_Mod_X_regular, new_r_Jmp(blk));
- set_Tuple_pred(n, pn_Mod_X_except, new_r_Bad(irg));
+ set_Tuple_pred(n, pn_Mod_X_except, get_irg_bad(irg));
set_Tuple_pred(n, pn_Mod_res, value);
}
return n;
turn_into_tuple(n, pn_DivMod_max);
set_Tuple_pred(n, pn_DivMod_M, mem);
set_Tuple_pred(n, pn_DivMod_X_regular, new_r_Jmp(blk));
- set_Tuple_pred(n, pn_DivMod_X_except, new_r_Bad(irg)); /*no exception*/
+ set_Tuple_pred(n, pn_DivMod_X_except, get_irg_bad(irg)); /*no exception*/
set_Tuple_pred(n, pn_DivMod_res_div, va);
set_Tuple_pred(n, pn_DivMod_res_mod, vb);
}
turn_into_tuple(n, pn_Quot_max);
set_Tuple_pred(n, pn_Quot_M, mem);
set_Tuple_pred(n, pn_Quot_X_regular, new_r_Jmp(blk));
- set_Tuple_pred(n, pn_Quot_X_except, new_r_Bad(irg));
+ set_Tuple_pred(n, pn_Quot_X_except, get_irg_bad(irg));
set_Tuple_pred(n, pn_Quot_res, m);
DBG_OPT_ALGSIM1(oldn, a, b, m, FS_OPT_FP_INV_MUL);
}
jmp = new_r_Jmp(blk);
turn_into_tuple(n, pn_Cond_max);
if (ta == tarval_b_true) {
- set_Tuple_pred(n, pn_Cond_false, new_r_Bad(irg));
+ set_Tuple_pred(n, pn_Cond_false, get_irg_bad(irg));
set_Tuple_pred(n, pn_Cond_true, jmp);
} else {
set_Tuple_pred(n, pn_Cond_false, jmp);
- set_Tuple_pred(n, pn_Cond_true, new_r_Bad(irg));
+ set_Tuple_pred(n, pn_Cond_true, get_irg_bad(irg));
}
/* We might generate an endless loop, so keep it alive. */
add_End_keepalive(get_irg_end(irg), blk);
ir_graph *irg = get_irn_irg(proj);
/* we found an exception handler, remove it */
DBG_OPT_EXC_REM(proj);
- return new_r_Bad(irg);
+ return get_irg_bad(irg);
}
case pn_Div_M: {
ir_graph *irg = get_irn_irg(proj);
/* we found an exception handler, remove it */
DBG_OPT_EXC_REM(proj);
- return new_r_Bad(irg);
+ return get_irg_bad(irg);
}
case pn_Mod_M: {
/* we found an exception handler, remove it */
ir_graph *irg = get_irn_irg(proj);
DBG_OPT_EXC_REM(proj);
- return new_r_Bad(irg);
+ return get_irg_bad(irg);
}
case pn_DivMod_M: {
if (is_Block(block)) {
if (is_Block_dead(block)) {
/* control flow from dead block is dead */
- return new_r_Bad(irg);
+ return get_irg_bad(irg);
}
for (i = get_irn_arity(block) - 1; i >= 0; --i) {
* but can be found by irg_walk()!
*/
set_Block_dead(block);
- return new_r_Bad(irg);
+ return get_irg_bad(irg);
}
}
}
/* Blocks, Phis and Tuples may have dead inputs, e.g., if one of the
blocks predecessors is dead. */
- if (op != op_Block && op != op_Phi && op != op_Tuple) {
+ if (op != op_Block && op != op_Phi && op != op_Tuple && op != op_Anchor) {
ir_graph *irg = get_irn_irg(node);
irn_arity = get_irn_arity(node);
*/
if (is_irn_pinned_in_irg(node) &&
is_Block_dead(get_nodes_block(skip_Proj(node))))
- return new_r_Bad(irg);
+ return get_irg_bad(irg);
for (i = 0; i < irn_arity; i++) {
ir_node *pred = get_irn_n(node, i);
if (is_Bad(pred))
- return new_r_Bad(irg);
+ return get_irg_bad(irg);
#if 0
/* Propagating Unknowns here seems to be a bad idea, because
sometimes we need a node as a input and did not want that
for (i = 0; i < irn_arity; i++) {
if (!is_Bad(get_irn_n(node, i))) break;
}
- if (i == irn_arity) node = new_r_Bad(irg);
+ if (i == irn_arity) node = get_irg_bad(irg);
}
#endif
return node;
irg_attr irg;
} bad_attr;
+typedef struct anchor_attr {
+ irg_attr irg;
+} anchor_attr;
+
/** Block attributes */
typedef struct {
/* General attributes */
typedef union {
irg_attr irg; /**< For Blocks and Bad: its belonging irg */
bad_attr bad; /**< for Bads: irg reference */
+ anchor_attr anchor; /**< for Anchor: irg reference */
block_attr block; /**< For Block: Fields needed to construct it */
cond_attr cond; /**< For Cond. */
const_attr con; /**< For Const: contains the value of the constant and a type */
]
class Bad(Op):
- mode = "mode_Bad"
+ mode = "mode_T"
flags = [ "cfopcode", "start_block", "dump_noblock" ]
pinned = "yes"
knownBlock = True
+ block = "get_irg_start_block(irg)"
singleton = True
attr_struct = "bad_attr"
- noconstructor = True
init = '''
- res->attr.irg.irg = irg;
+ res->attr.bad.irg.irg = irg;
'''
class Deleted(Op):
flags = [ "dump_noblock", "dump_noinput" ]
pinned = "yes"
knownBlock = True
+ block = "get_irg_start_block(irg)"
singleton = True
- noconstructor = True
class Not(Unop):
flags = []