# define IRN_VRFY_IRG(res, irg)
#else
# define IRN_VRFY_IRG(res, irg) irn_vrfy_irg(res, irg)
-#endif
+#endif /* NDEBUG */
/**
* Language dependent variable initialization callback.
*/
static uninitialized_local_variable_func_t *default_initialize_local_variable = NULL;
-/* --------------------------------------------- */
-/* private interfaces, for professional use only */
-/* --------------------------------------------- */
+/* creates a bd constructor for a binop */
+#define NEW_BD_BINOP(instr) \
+static ir_node * \
+new_bd_##instr (dbg_info *db, ir_node *block, \
+ ir_node *op1, ir_node *op2, ir_mode *mode) \
+{ \
+ ir_node *in[2]; \
+ ir_node *res; \
+ ir_graph *irg = current_ir_graph; \
+ in[0] = op1; \
+ in[1] = op2; \
+ res = new_ir_node(db, irg, block, op_##instr, mode, 2, in); \
+ res = optimize_node(res); \
+ IRN_VRFY_IRG(res, irg); \
+ return res; \
+}
+
+/* creates a bd constructor for an unop */
+#define NEW_BD_UNOP(instr) \
+static ir_node * \
+new_bd_##instr (dbg_info *db, ir_node *block, \
+ ir_node *op, ir_mode *mode) \
+{ \
+ ir_node *res; \
+ ir_graph *irg = current_ir_graph; \
+ res = new_ir_node(db, irg, block, op_##instr, mode, 1, &op); \
+ res = optimize_node(res); \
+ IRN_VRFY_IRG(res, irg); \
+ return res; \
+}
+
+/* creates a bd constructor for an divop */
+#define NEW_BD_DIVOP(instr) \
+static ir_node * \
+new_bd_##instr (dbg_info *db, ir_node *block, \
+ ir_node *memop, ir_node *op1, ir_node *op2) \
+{ \
+ ir_node *in[3]; \
+ ir_node *res; \
+ ir_graph *irg = current_ir_graph; \
+ in[0] = memop; \
+ in[1] = op1; \
+ in[2] = op2; \
+ res = new_ir_node(db, irg, block, op_##instr, mode_T, 3, in); \
+ res = optimize_node(res); \
+ IRN_VRFY_IRG(res, irg); \
+ return res; \
+}
+
+/* creates a rd constructor for a binop */
+#define NEW_RD_BINOP(instr) \
+ir_node * \
+new_rd_##instr (dbg_info *db, ir_graph *irg, ir_node *block, \
+ ir_node *op1, ir_node *op2, ir_mode *mode) \
+{ \
+ ir_node *res; \
+ ir_graph *rem = current_ir_graph; \
+ current_ir_graph = irg; \
+ res = new_bd_##instr(db, block, op1, op2, mode); \
+ current_ir_graph = rem; \
+ return res; \
+}
+
+/* creates a rd constructor for an unop */
+#define NEW_RD_UNOP(instr) \
+ir_node * \
+new_rd_##instr (dbg_info *db, ir_graph *irg, ir_node *block, \
+ ir_node *op, ir_mode *mode) \
+{ \
+ ir_node *res; \
+ ir_graph *rem = current_ir_graph; \
+ current_ir_graph = irg; \
+ res = new_bd_##instr(db, block, op, mode); \
+ current_ir_graph = rem; \
+ return res; \
+}
+
+/* creates a rd constructor for an divop */
+#define NEW_RD_DIVOP(instr) \
+ir_node * \
+new_rd_##instr (dbg_info *db, ir_graph *irg, ir_node *block, \
+ ir_node *memop, ir_node *op1, ir_node *op2) \
+{ \
+ ir_node *res; \
+ ir_graph *rem = current_ir_graph; \
+ current_ir_graph = irg; \
+ res = new_bd_##instr(db, block, memop, op1, op2); \
+ current_ir_graph = rem; \
+ return res; \
+}
+
+/* creates a d constructor for an binop */
+#define NEW_D_BINOP(instr) \
+ir_node * \
+new_d_##instr (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode) { \
+ return new_bd_##instr(db, current_ir_graph->current_block, op1, op2, mode); \
+}
+
+/* creates a d constructor for an unop */
+#define NEW_D_UNOP(instr) \
+ir_node * \
+new_d_##instr (dbg_info *db, ir_node *op, ir_mode *mode) { \
+ return new_bd_##instr(db, current_ir_graph->current_block, op, mode); \
+}
+
/* Constructs a Block with a fixed number of predecessors.
Does not set current_block. Can not be used with automatic
Phi node construction. */
-ir_node *
-new_rd_Block (dbg_info* db, ir_graph *irg, int arity, ir_node **in)
+static ir_node *
+new_bd_Block (dbg_info *db, int arity, ir_node **in)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
res = new_ir_node (db, irg, NULL, op_Block, mode_BB, arity, in);
set_Block_matured(res, 1);
return res;
}
-ir_node *
-new_rd_Start (dbg_info* db, ir_graph *irg, ir_node *block)
+static ir_node *
+new_bd_Start (dbg_info *db, ir_node *block)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
res = new_ir_node(db, irg, block, op_Start, mode_T, 0, NULL);
/* res->attr.start.irg = irg; */
return res;
}
-ir_node *
-new_rd_End (dbg_info* db, ir_graph *irg, ir_node *block)
+static ir_node *
+new_bd_End (dbg_info *db, ir_node *block)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
res = new_ir_node(db, irg, block, op_End, mode_X, -1, NULL);
/* Creates a Phi node with all predecessors. Calling this constructor
is only allowed if the corresponding block is mature. */
-ir_node *
-new_rd_Phi (dbg_info* db, ir_graph *irg, ir_node *block, int arity, ir_node **in, ir_mode *mode)
+static ir_node *
+new_bd_Phi (dbg_info *db, ir_node *block, int arity, ir_node **in, ir_mode *mode)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
int i;
- bool has_unknown = false;
+ int has_unknown = 0;
/* Don't assert that block matured: the use of this constructor is strongly
restricted ... */
for (i = arity-1; i >= 0; i--)
if (get_irn_op(in[i]) == op_Unknown) {
- has_unknown = true;
+ has_unknown = 1;
break;
}
/* Memory Phis in endless loops must be kept alive.
As we can't distinguish these easily we keep all of them alive. */
if ((res->op == op_Phi) && (mode == mode_M))
- add_End_keepalive(irg->end, res);
+ add_End_keepalive(get_irg_end(irg), res);
return res;
}
-ir_node *
-new_rd_Const_type (dbg_info* db, ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con, type *tp)
+static ir_node *
+new_bd_Const_type (dbg_info *db, ir_node *block, ir_mode *mode, tarval *con, ir_type *tp)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
- res = new_ir_node (db, irg, irg->start_block, op_Const, mode, 0, NULL);
+ res = new_ir_node (db, irg, get_irg_start_block(irg), op_Const, mode, 0, NULL);
res->attr.con.tv = con;
set_Const_type(res, tp); /* Call method because of complex assertion. */
res = optimize_node (res);
return res;
}
-ir_node *
-new_rd_Const (dbg_info* db, ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con)
+static ir_node *
+new_bd_Const (dbg_info *db, ir_node *block, ir_mode *mode, tarval *con)
{
+ ir_graph *irg = current_ir_graph;
+
return new_rd_Const_type (db, irg, block, mode, con, firm_unknown_type);
}
-ir_node *
-new_rd_Const_long (dbg_info* db, ir_graph *irg, ir_node *block, ir_mode *mode, long value)
+static ir_node *
+new_bd_Const_long (dbg_info *db, ir_node *block, ir_mode *mode, long value)
{
- return new_rd_Const(db, irg, block, mode, new_tarval_from_long(value, mode));
+ ir_graph *irg = current_ir_graph;
+
+ return new_rd_Const(db, irg, block, mode, new_tarval_from_long(value, mode));
}
-ir_node *
-new_rd_Id (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *val, ir_mode *mode)
+static ir_node *
+new_bd_Id (dbg_info *db, ir_node *block, ir_node *val, ir_mode *mode)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
res = new_ir_node(db, irg, block, op_Id, mode, 1, &val);
res = optimize_node(res);
return res;
}
-ir_node *
-new_rd_Proj (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode,
+static ir_node *
+new_bd_Proj (dbg_info *db, ir_node *block, ir_node *arg, ir_mode *mode,
long proj)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
res = new_ir_node (db, irg, block, op_Proj, mode, 1, &arg);
res->attr.proj = proj;
}
-ir_node *
-new_rd_defaultProj (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *arg,
+static ir_node *
+new_bd_defaultProj (dbg_info *db, ir_node *block, ir_node *arg,
long max_proj)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
+
assert(arg->op == op_Cond);
arg->attr.c.kind = fragmentary;
arg->attr.c.default_proj = max_proj;
return res;
}
-ir_node *
-new_rd_Conv (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *op, ir_mode *mode)
+static ir_node *
+new_bd_Conv (dbg_info *db, ir_node *block, ir_node *op, ir_mode *mode)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
res = new_ir_node(db, irg, block, op_Conv, mode, 1, &op);
res = optimize_node(res);
return res;
}
-ir_node *
-new_rd_Cast (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *op, type *to_tp)
+static ir_node *
+new_bd_Cast (dbg_info *db, ir_node *block, ir_node *op, ir_type *to_tp)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
assert(is_atomic_type(to_tp));
return res;
}
-ir_node *
-new_rd_Tuple (dbg_info* db, ir_graph *irg, ir_node *block, int arity, ir_node **in)
+static ir_node *
+new_bd_Tuple (dbg_info *db, ir_node *block, int arity, ir_node **in)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
res = new_ir_node(db, irg, block, op_Tuple, mode_T, arity, in);
res = optimize_node (res);
return res;
}
-ir_node *
-new_rd_Add (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op1, ir_node *op2, ir_mode *mode)
-{
- ir_node *in[2];
- ir_node *res;
+NEW_BD_BINOP(Add)
+NEW_BD_BINOP(Sub)
+NEW_BD_UNOP(Minus)
+NEW_BD_BINOP(Mul)
+NEW_BD_DIVOP(Quot)
+NEW_BD_DIVOP(DivMod)
+NEW_BD_DIVOP(Div)
+NEW_BD_DIVOP(Mod)
+NEW_BD_BINOP(And)
+NEW_BD_BINOP(Or)
+NEW_BD_BINOP(Eor)
+NEW_BD_UNOP(Not)
+NEW_BD_BINOP(Shl)
+NEW_BD_BINOP(Shr)
+NEW_BD_BINOP(Shrs)
+NEW_BD_BINOP(Rot)
+NEW_BD_UNOP(Abs)
+NEW_BD_BINOP(Carry)
+NEW_BD_BINOP(Borrow)
+static ir_node *
+new_bd_Cmp (dbg_info *db, ir_node *block, ir_node *op1, ir_node *op2)
+{
+ ir_node *in[2];
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
in[0] = op1;
in[1] = op2;
- res = new_ir_node(db, irg, block, op_Add, mode, 2, in);
+ res = new_ir_node(db, irg, block, op_Cmp, mode_T, 2, in);
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Sub (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op1, ir_node *op2, ir_mode *mode)
+static ir_node *
+new_bd_Jmp (dbg_info *db, ir_node *block)
{
- ir_node *in[2];
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
- in[0] = op1;
- in[1] = op2;
- res = new_ir_node (db, irg, block, op_Sub, mode, 2, in);
+ res = new_ir_node (db, irg, block, op_Jmp, mode_X, 0, NULL);
+ res = optimize_node (res);
+ IRN_VRFY_IRG (res, irg);
+ return res;
+}
+
+static ir_node *
+new_bd_IJmp (dbg_info *db, ir_node *block, ir_node *tgt)
+{
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
+
+ res = new_ir_node (db, irg, block, op_IJmp, mode_X, 1, &tgt);
+ res = optimize_node (res);
+ IRN_VRFY_IRG (res, irg);
+
+ if (get_irn_op(res) == op_IJmp) /* still an IJmp */
+ keep_alive(res);
+ return res;
+}
+
+static ir_node *
+new_bd_Cond (dbg_info *db, ir_node *block, ir_node *c)
+{
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
+
+ res = new_ir_node (db, irg, block, op_Cond, mode_T, 1, &c);
+ res->attr.c.kind = dense;
+ res->attr.c.default_proj = 0;
+ res->attr.c.pred = COND_JMP_PRED_NONE;
res = optimize_node (res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Minus (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op, ir_mode *mode)
+static ir_node *
+new_bd_Call (dbg_info *db, ir_node *block, ir_node *store,
+ ir_node *callee, int arity, ir_node **in, ir_type *tp)
{
- ir_node *res;
+ ir_node **r_in;
+ ir_node *res;
+ int r_arity;
+ ir_graph *irg = current_ir_graph;
+
+ r_arity = arity+2;
+ NEW_ARR_A(ir_node *, r_in, r_arity);
+ r_in[0] = store;
+ r_in[1] = callee;
+ memcpy(&r_in[2], in, sizeof(ir_node *) * arity);
+
+ res = new_ir_node(db, irg, block, op_Call, mode_T, r_arity, r_in);
- res = new_ir_node(db, irg, block, op_Minus, mode, 1, &op);
+ assert((get_unknown_type() == tp) || is_Method_type(tp));
+ set_Call_type(res, tp);
+ res->attr.call.exc.pin_state = op_pin_state_pinned;
+ res->attr.call.callee_arr = NULL;
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Mul (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op1, ir_node *op2, ir_mode *mode)
+static ir_node *
+new_bd_Return (dbg_info *db, ir_node *block,
+ ir_node *store, int arity, ir_node **in)
{
- ir_node *in[2];
- ir_node *res;
+ ir_node **r_in;
+ ir_node *res;
+ int r_arity;
+ ir_graph *irg = current_ir_graph;
- in[0] = op1;
- in[1] = op2;
- res = new_ir_node(db, irg, block, op_Mul, mode, 2, in);
+ r_arity = arity+1;
+ NEW_ARR_A (ir_node *, r_in, r_arity);
+ r_in[0] = store;
+ memcpy(&r_in[1], in, sizeof(ir_node *) * arity);
+ res = new_ir_node(db, irg, block, op_Return, mode_X, r_arity, r_in);
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Quot (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *memop, ir_node *op1, ir_node *op2)
+static ir_node *
+new_bd_Load (dbg_info *db, ir_node *block,
+ ir_node *store, ir_node *adr, ir_mode *mode)
{
- ir_node *in[3];
- ir_node *res;
+ ir_node *in[2];
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
- in[0] = memop;
- in[1] = op1;
- in[2] = op2;
- res = new_ir_node(db, irg, block, op_Quot, mode_T, 3, in);
+ in[0] = store;
+ in[1] = adr;
+ res = new_ir_node(db, irg, block, op_Load, mode_T, 2, in);
+ res->attr.load.exc.pin_state = op_pin_state_pinned;
+ res->attr.load.load_mode = mode;
+ res->attr.load.volatility = volatility_non_volatile;
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_DivMod (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *memop, ir_node *op1, ir_node *op2)
+static ir_node *
+new_bd_Store (dbg_info *db, ir_node *block,
+ ir_node *store, ir_node *adr, ir_node *val)
{
- ir_node *in[3];
- ir_node *res;
+ ir_node *in[3];
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
- in[0] = memop;
- in[1] = op1;
- in[2] = op2;
- res = new_ir_node(db, irg, block, op_DivMod, mode_T, 3, in);
+ in[0] = store;
+ in[1] = adr;
+ in[2] = val;
+ res = new_ir_node(db, irg, block, op_Store, mode_T, 3, in);
+ res->attr.store.exc.pin_state = op_pin_state_pinned;
+ res->attr.store.volatility = volatility_non_volatile;
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Div (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *memop, ir_node *op1, ir_node *op2)
+static ir_node *
+new_bd_Alloc (dbg_info *db, ir_node *block, ir_node *store,
+ ir_node *size, ir_type *alloc_type, where_alloc where)
{
- ir_node *in[3];
- ir_node *res;
+ ir_node *in[2];
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
- in[0] = memop;
- in[1] = op1;
- in[2] = op2;
- res = new_ir_node(db, irg, block, op_Div, mode_T, 3, in);
+ in[0] = store;
+ in[1] = size;
+ res = new_ir_node(db, irg, block, op_Alloc, mode_T, 2, in);
+ res->attr.a.exc.pin_state = op_pin_state_pinned;
+ res->attr.a.where = where;
+ res->attr.a.type = alloc_type;
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Mod (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *memop, ir_node *op1, ir_node *op2)
+static ir_node *
+new_bd_Free (dbg_info *db, ir_node *block, ir_node *store,
+ ir_node *ptr, ir_node *size, ir_type *free_type, where_alloc where)
{
- ir_node *in[3];
- ir_node *res;
+ ir_node *in[3];
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
- in[0] = memop;
- in[1] = op1;
- in[2] = op2;
- res = new_ir_node(db, irg, block, op_Mod, mode_T, 3, in);
+ in[0] = store;
+ in[1] = ptr;
+ in[2] = size;
+ res = new_ir_node (db, irg, block, op_Free, mode_M, 3, in);
+ res->attr.f.where = where;
+ res->attr.f.type = free_type;
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_And (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op1, ir_node *op2, ir_mode *mode)
+static ir_node *
+new_bd_Sel (dbg_info *db, ir_node *block, ir_node *store, ir_node *objptr,
+ int arity, ir_node **in, entity *ent)
{
- ir_node *in[2];
- ir_node *res;
+ ir_node **r_in;
+ ir_node *res;
+ int r_arity;
+ ir_graph *irg = current_ir_graph;
- in[0] = op1;
- in[1] = op2;
- res = new_ir_node(db, irg, block, op_And, mode, 2, in);
+ assert(ent != NULL && is_entity(ent) && "entity expected in Sel construction");
+
+ r_arity = arity + 2;
+ NEW_ARR_A(ir_node *, r_in, r_arity); /* uses alloca */
+ r_in[0] = store;
+ r_in[1] = objptr;
+ memcpy(&r_in[2], in, sizeof(ir_node *) * arity);
+ /*
+ * FIXM: Sel's can select functions which should be of mode mode_P_code.
+ */
+ res = new_ir_node(db, irg, block, op_Sel, mode_P_data, r_arity, r_in);
+ res->attr.s.ent = ent;
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Or (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op1, ir_node *op2, ir_mode *mode)
+static ir_node *
+new_bd_SymConst_type (dbg_info *db, ir_node *block, symconst_symbol value,
+ symconst_kind symkind, ir_type *tp) {
+ ir_node *res;
+ ir_mode *mode;
+ ir_graph *irg = current_ir_graph;
+
+ if ((symkind == symconst_addr_name) || (symkind == symconst_addr_ent))
+ mode = mode_P_data; /* FIXME: can be mode_P_code */
+ else
+ mode = mode_Iu;
+
+ res = new_ir_node(db, irg, block, op_SymConst, mode, 0, NULL);
+
+ res->attr.i.num = symkind;
+ res->attr.i.sym = value;
+ res->attr.i.tp = tp;
+
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
+ return res;
+}
+
+static ir_node *
+new_bd_SymConst (dbg_info *db, ir_node *block, symconst_symbol value,
+ symconst_kind symkind)
{
- ir_node *in[2];
- ir_node *res;
+ ir_graph *irg = current_ir_graph;
- in[0] = op1;
- in[1] = op2;
- res = new_ir_node(db, irg, block, op_Or, mode, 2, in);
+ ir_node *res = new_rd_SymConst_type(db, irg, block, value, symkind, firm_unknown_type);
+ return res;
+}
+
+static ir_node *
+new_bd_Sync (dbg_info *db, ir_node *block, int arity, ir_node **in)
+{
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
+
+ res = new_ir_node(db, irg, block, op_Sync, mode_M, arity, in);
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Eor (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op1, ir_node *op2, ir_mode *mode)
+static ir_node *
+new_bd_Confirm (dbg_info *db, ir_node *block, ir_node *val, ir_node *bound, pn_Cmp cmp)
{
- ir_node *in[2];
- ir_node *res;
+ ir_node *in[2], *res;
+ ir_graph *irg = current_ir_graph;
- in[0] = op1;
- in[1] = op2;
- res = new_ir_node (db, irg, block, op_Eor, mode, 2, in);
+ in[0] = val;
+ in[1] = bound;
+ res = new_ir_node (db, irg, block, op_Confirm, get_irn_mode(val), 2, in);
+ res->attr.confirm_cmp = cmp;
res = optimize_node (res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Not (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op, ir_mode *mode)
+/* this function is often called with current_ir_graph unset */
+static ir_node *
+new_bd_Unknown (ir_mode *m)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
+
+ res = new_ir_node(NULL, irg, get_irg_start_block(irg), op_Unknown, m, 0, NULL);
+ res = optimize_node(res);
+ return res;
+}
+
+static ir_node *
+new_bd_CallBegin (dbg_info *db, ir_node *block, ir_node *call)
+{
+ ir_node *in[1];
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
- res = new_ir_node(db, irg, block, op_Not, mode, 1, &op);
+ in[0] = get_Call_ptr(call);
+ res = new_ir_node(db, irg, block, op_CallBegin, mode_T, 1, in);
+ /* res->attr.callbegin.irg = irg; */
+ res->attr.callbegin.call = call;
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Shl (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op, ir_node *k, ir_mode *mode)
+static ir_node *
+new_bd_EndReg (dbg_info *db, ir_node *block)
{
- ir_node *in[2];
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
- in[0] = op;
- in[1] = k;
- res = new_ir_node(db, irg, block, op_Shl, mode, 2, in);
+ res = new_ir_node(db, irg, block, op_EndReg, mode_T, -1, NULL);
+ set_irg_end_reg(irg, res);
+ IRN_VRFY_IRG(res, irg);
+ return res;
+}
+
+static ir_node *
+new_bd_EndExcept (dbg_info *db, ir_node *block)
+{
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
+
+ res = new_ir_node(db, irg, block, op_EndExcept, mode_T, -1, NULL);
+ set_irg_end_except(irg, res);
+ IRN_VRFY_IRG (res, irg);
+ return res;
+}
+
+static ir_node *
+new_bd_Break (dbg_info *db, ir_node *block)
+{
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
+
+ res = new_ir_node(db, irg, block, op_Break, mode_X, 0, NULL);
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Shr (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op, ir_node *k, ir_mode *mode)
+static ir_node *
+new_bd_Filter (dbg_info *db, ir_node *block, ir_node *arg, ir_mode *mode,
+ long proj)
{
- ir_node *in[2];
- ir_node *res;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
+
+ res = new_ir_node(db, irg, block, op_Filter, mode, 1, &arg);
+ res->attr.filter.proj = proj;
+ res->attr.filter.in_cg = NULL;
+ res->attr.filter.backedge = NULL;
+
+ assert(res);
+ assert(get_Proj_pred(res));
+ assert(get_nodes_block(get_Proj_pred(res)));
- in[0] = op;
- in[1] = k;
- res = new_ir_node(db, irg, block, op_Shr, mode, 2, in);
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Shrs (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op, ir_node *k, ir_mode *mode)
+static ir_node *
+new_bd_Mux (dbg_info *db, ir_node *block,
+ ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode)
{
- ir_node *in[2];
- ir_node *res;
+ ir_node *in[3];
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
+
+ in[0] = sel;
+ in[1] = ir_false;
+ in[2] = ir_true;
+
+ res = new_ir_node(db, irg, block, op_Mux, mode, 3, in);
+ assert(res);
- in[0] = op;
- in[1] = k;
- res = new_ir_node(db, irg, block, op_Shrs, mode, 2, in);
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Rot (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op, ir_node *k, ir_mode *mode)
+static ir_node *
+new_bd_Psi (dbg_info *db, ir_node *block,
+ int arity, ir_node *cond[], ir_node *vals[], ir_mode *mode)
{
- ir_node *in[2];
- ir_node *res;
+ ir_node **in;
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
+ int i;
+
+ NEW_ARR_A(ir_node *, in, 2 * arity + 1);
+
+ for (i = 0; i < arity; ++i) {
+ in[2 * i] = cond[i];
+ in[2 * i + 1] = vals[i];
+ }
+ in[2 * i] = vals[i];
+
+ res = new_ir_node(db, irg, block, op_Psi, mode, 2 * arity + 1, in);
+ assert(res);
- in[0] = op;
- in[1] = k;
- res = new_ir_node(db, irg, block, op_Rot, mode, 2, in);
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Abs (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op, ir_mode *mode)
+static ir_node *
+new_bd_CopyB (dbg_info *db, ir_node *block,
+ ir_node *store, ir_node *dst, ir_node *src, ir_type *data_type)
{
- ir_node *res;
+ ir_node *in[3];
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
- res = new_ir_node(db, irg, block, op_Abs, mode, 1, &op);
- res = optimize_node (res);
+ in[0] = store;
+ in[1] = dst;
+ in[2] = src;
+
+ res = new_ir_node(db, irg, block, op_CopyB, mode_T, 3, in);
+
+ res->attr.copyb.exc.pin_state = op_pin_state_pinned;
+ res->attr.copyb.data_type = data_type;
+ res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
-ir_node *
-new_rd_Cmp (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op1, ir_node *op2)
+static ir_node *
+new_bd_InstOf (dbg_info *db, ir_node *block, ir_node *store,
+ ir_node *objptr, ir_type *type)
{
- ir_node *in[2];
- ir_node *res;
- in[0] = op1;
- in[1] = op2;
+ ir_node *in[2];
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
- res = new_ir_node(db, irg, block, op_Cmp, mode_T, 2, in);
+ in[0] = store;
+ in[1] = objptr;
+ res = new_ir_node(db, irg, block, op_Sel, mode_T, 2, in);
+ res->attr.io.type = type;
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
+ return res;
+}
+
+static ir_node *
+new_bd_Raise (dbg_info *db, ir_node *block, ir_node *store, ir_node *obj)
+{
+ ir_node *in[2];
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
+
+ in[0] = store;
+ in[1] = obj;
+ res = new_ir_node(db, irg, block, op_Raise, mode_T, 2, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
+ return res;
+}
+
+static ir_node *
+new_bd_Bound (dbg_info *db, ir_node *block,
+ ir_node *store, ir_node *idx, ir_node *lower, ir_node *upper)
+{
+ ir_node *in[4];
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
+
+ in[0] = store;
+ in[1] = idx;
+ in[2] = lower;
+ in[3] = upper;
+ res = new_ir_node(db, irg, block, op_Bound, mode_T, 4, in);
+ res->attr.bound.exc.pin_state = op_pin_state_pinned;
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
return res;
}
+/* --------------------------------------------- */
+/* private interfaces, for professional use only */
+/* --------------------------------------------- */
+
+/* Constructs a Block with a fixed number of predecessors.
+ Does not set current_block. Can not be used with automatic
+ Phi node construction. */
ir_node *
-new_rd_Jmp (dbg_info* db, ir_graph *irg, ir_node *block)
+new_rd_Block (dbg_info *db, ir_graph *irg, int arity, ir_node **in)
{
- ir_node *res;
+ ir_graph *rem = current_ir_graph;
+ ir_node *res;
+
+ current_ir_graph = irg;
+ res = new_bd_Block (db, arity, in);
+ current_ir_graph = rem;
- res = new_ir_node (db, irg, block, op_Jmp, mode_X, 0, NULL);
- res = optimize_node (res);
- IRN_VRFY_IRG (res, irg);
return res;
}
ir_node *
-new_rd_IJmp (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *tgt)
+new_rd_Start (dbg_info *db, ir_graph *irg, ir_node *block)
{
- ir_node *res;
+ ir_graph *rem = current_ir_graph;
+ ir_node *res;
- res = new_ir_node (db, irg, block, op_IJmp, mode_X, 1, &tgt);
- res = optimize_node (res);
- IRN_VRFY_IRG (res, irg);
+ current_ir_graph = irg;
+ res = new_bd_Start (db, block);
+ current_ir_graph = rem;
- if (get_irn_op(res) == op_IJmp) /* still an IJmp */
- keep_alive(res);
return res;
}
ir_node *
-new_rd_Cond (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *c)
+new_rd_End (dbg_info *db, ir_graph *irg, ir_node *block)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = rem;
+ res = new_bd_End (db, block);
+ current_ir_graph = rem;
- res = new_ir_node (db, irg, block, op_Cond, mode_T, 1, &c);
- res->attr.c.kind = dense;
- res->attr.c.default_proj = 0;
- res = optimize_node (res);
- IRN_VRFY_IRG(res, irg);
return res;
}
+/* Creates a Phi node with all predecessors. Calling this constructor
+ is only allowed if the corresponding block is mature. */
ir_node *
-new_rd_Call (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *store,
- ir_node *callee, int arity, ir_node **in, type *tp)
+new_rd_Phi (dbg_info *db, ir_graph *irg, ir_node *block, int arity, ir_node **in, ir_mode *mode)
{
- ir_node **r_in;
- ir_node *res;
- int r_arity;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
- r_arity = arity+2;
- NEW_ARR_A(ir_node *, r_in, r_arity);
- r_in[0] = store;
- r_in[1] = callee;
- memcpy(&r_in[2], in, sizeof(ir_node *) * arity);
+ current_ir_graph = irg;
+ res = new_bd_Phi (db, block,arity, in, mode);
+ current_ir_graph = rem;
- res = new_ir_node(db, irg, block, op_Call, mode_T, r_arity, r_in);
+ return res;
+}
+
+ir_node *
+new_rd_Const_type (dbg_info *db, ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con, ir_type *tp)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Const_type (db, block, mode, con, tp);
+ current_ir_graph = rem;
- assert((get_unknown_type() == tp) || is_Method_type(tp));
- set_Call_type(res, tp);
- res->attr.call.exc.pin_state = op_pin_state_pinned;
- res->attr.call.callee_arr = NULL;
- res = optimize_node(res);
- IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *
-new_rd_Return (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *store, int arity, ir_node **in)
+new_rd_Const (dbg_info *db, ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con)
{
- ir_node **r_in;
- ir_node *res;
- int r_arity;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Const_type (db, block, mode, con, firm_unknown_type);
+ current_ir_graph = rem;
- r_arity = arity+1;
- NEW_ARR_A (ir_node *, r_in, r_arity);
- r_in[0] = store;
- memcpy(&r_in[1], in, sizeof(ir_node *) * arity);
- res = new_ir_node(db, irg, block, op_Return, mode_X, r_arity, r_in);
- res = optimize_node(res);
- IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *
-new_rd_Raise (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *store, ir_node *obj)
+new_rd_Const_long (dbg_info *db, ir_graph *irg, ir_node *block, ir_mode *mode, long value)
{
- ir_node *in[2];
- ir_node *res;
+ return new_rd_Const(db, irg, block, mode, new_tarval_from_long(value, mode));
+}
+
+ir_node *
+new_rd_Id (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *val, ir_mode *mode)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Id(db, block, val, mode);
+ current_ir_graph = rem;
- in[0] = store;
- in[1] = obj;
- res = new_ir_node(db, irg, block, op_Raise, mode_T, 2, in);
- res = optimize_node(res);
- IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *
-new_rd_Load (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *store, ir_node *adr, ir_mode *mode)
+new_rd_Proj (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode,
+ long proj)
{
- ir_node *in[2];
- ir_node *res;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Proj(db, block, arg, mode, proj);
+ current_ir_graph = rem;
- in[0] = store;
- in[1] = adr;
- res = new_ir_node(db, irg, block, op_Load, mode_T, 2, in);
- res->attr.load.exc.pin_state = op_pin_state_pinned;
- res->attr.load.load_mode = mode;
- res->attr.load.volatility = volatility_non_volatile;
- res = optimize_node(res);
- IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *
-new_rd_Store (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *store, ir_node *adr, ir_node *val)
+new_rd_defaultProj (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg,
+ long max_proj)
{
- ir_node *in[3];
- ir_node *res;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_defaultProj(db, block, arg, max_proj);
+ current_ir_graph = rem;
- in[0] = store;
- in[1] = adr;
- in[2] = val;
- res = new_ir_node(db, irg, block, op_Store, mode_T, 3, in);
- res->attr.store.exc.pin_state = op_pin_state_pinned;
- res->attr.store.volatility = volatility_non_volatile;
- res = optimize_node(res);
- IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *
-new_rd_Alloc (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *store,
- ir_node *size, type *alloc_type, where_alloc where)
+new_rd_Conv (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *op, ir_mode *mode)
{
- ir_node *in[2];
- ir_node *res;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Conv(db, block, op, mode);
+ current_ir_graph = rem;
- in[0] = store;
- in[1] = size;
- res = new_ir_node(db, irg, block, op_Alloc, mode_T, 2, in);
- res->attr.a.exc.pin_state = op_pin_state_pinned;
- res->attr.a.where = where;
- res->attr.a.type = alloc_type;
- res = optimize_node(res);
- IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *
-new_rd_Free (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *store,
- ir_node *ptr, ir_node *size, type *free_type, where_alloc where)
+new_rd_Cast (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *op, ir_type *to_tp)
{
- ir_node *in[3];
- ir_node *res;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Cast(db, block, op, to_tp);
+ current_ir_graph = rem;
- in[0] = store;
- in[1] = ptr;
- in[2] = size;
- res = new_ir_node (db, irg, block, op_Free, mode_M, 3, in);
- res->attr.f.where = where;
- res->attr.f.type = free_type;
- res = optimize_node(res);
- IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *
-new_rd_Sel (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
- int arity, ir_node **in, entity *ent)
+new_rd_Tuple (dbg_info *db, ir_graph *irg, ir_node *block, int arity, ir_node **in)
{
- ir_node **r_in;
- ir_node *res;
- int r_arity;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
- assert(ent != NULL && is_entity(ent) && "entity expected in Sel construction");
+ current_ir_graph = irg;
+ res = new_bd_Tuple(db, block, arity, in);
+ current_ir_graph = rem;
+
+ return res;
+}
+
+NEW_RD_BINOP(Add)
+NEW_RD_BINOP(Sub)
+NEW_RD_UNOP(Minus)
+NEW_RD_BINOP(Mul)
+NEW_RD_DIVOP(Quot)
+NEW_RD_DIVOP(DivMod)
+NEW_RD_DIVOP(Div)
+NEW_RD_DIVOP(Mod)
+NEW_RD_BINOP(And)
+NEW_RD_BINOP(Or)
+NEW_RD_BINOP(Eor)
+NEW_RD_UNOP(Not)
+NEW_RD_BINOP(Shl)
+NEW_RD_BINOP(Shr)
+NEW_RD_BINOP(Shrs)
+NEW_RD_BINOP(Rot)
+NEW_RD_UNOP(Abs)
+NEW_RD_BINOP(Carry)
+NEW_RD_BINOP(Borrow)
+
+ir_node *
+new_rd_Cmp (dbg_info *db, ir_graph *irg, ir_node *block,
+ ir_node *op1, ir_node *op2)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Cmp(db, block, op1, op2);
+ current_ir_graph = rem;
+
+ return res;
+}
+
+ir_node *
+new_rd_Jmp (dbg_info *db, ir_graph *irg, ir_node *block)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Jmp(db, block);
+ current_ir_graph = rem;
+
+ return res;
+}
+
+ir_node *
+new_rd_IJmp (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *tgt)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_IJmp(db, block, tgt);
+ current_ir_graph = rem;
+
+ return res;
+}
+
+ir_node *
+new_rd_Cond (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *c)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Cond(db, block, c);
+ current_ir_graph = rem;
+
+ return res;
+}
+
+ir_node *
+new_rd_Call (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
+ ir_node *callee, int arity, ir_node **in, ir_type *tp)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Call(db, block, store, callee, arity, in, tp);
+ current_ir_graph = rem;
+
+ return res;
+}
+
+ir_node *
+new_rd_Return (dbg_info *db, ir_graph *irg, ir_node *block,
+ ir_node *store, int arity, ir_node **in)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Return(db, block, store, arity, in);
+ current_ir_graph = rem;
+
+ return res;
+}
+
+ir_node *
+new_rd_Load (dbg_info *db, ir_graph *irg, ir_node *block,
+ ir_node *store, ir_node *adr, ir_mode *mode)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Load(db, block, store, adr, mode);
+ current_ir_graph = rem;
+
+ return res;
+}
+
+ir_node *
+new_rd_Store (dbg_info *db, ir_graph *irg, ir_node *block,
+ ir_node *store, ir_node *adr, ir_node *val)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Store(db, block, store, adr, val);
+ current_ir_graph = rem;
+
+ return res;
+}
+
+ir_node *
+new_rd_Alloc (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
+ ir_node *size, ir_type *alloc_type, where_alloc where)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Alloc (db, block, store, size, alloc_type, where);
+ current_ir_graph = rem;
+
+ return res;
+}
+
+ir_node *
+new_rd_Free (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
+ ir_node *ptr, ir_node *size, ir_type *free_type, where_alloc where)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Free(db, block, store, ptr, size, free_type, where);
+ current_ir_graph = rem;
- r_arity = arity + 2;
- NEW_ARR_A(ir_node *, r_in, r_arity); /* uses alloca */
- r_in[0] = store;
- r_in[1] = objptr;
- memcpy(&r_in[2], in, sizeof(ir_node *) * arity);
- /*
- * FIXM: Sel's can select functions which should be of mode mode_P_code.
- */
- res = new_ir_node(db, irg, block, op_Sel, mode_P_data, r_arity, r_in);
- res->attr.s.ent = ent;
- res = optimize_node(res);
- IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *
-new_rd_InstOf (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
- ir_node *objptr, type *ent)
+new_rd_simpleSel (dbg_info *db, ir_graph *irg, ir_node *block,
+ ir_node *store, ir_node *objptr, entity *ent)
{
- ir_node **r_in;
- ir_node *res;
- int r_arity;
-
- r_arity = 2;
- NEW_ARR_A(ir_node *, r_in, r_arity);
- r_in[0] = store;
- r_in[1] = objptr;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
- res = new_ir_node(db, irg, block, op_Sel, mode_T, r_arity, r_in);
- res->attr.io.ent = ent;
+ current_ir_graph = irg;
+ res = new_bd_Sel(db, block, store, objptr, 0, NULL, ent);
+ current_ir_graph = rem;
- /* res = optimize(res); */
- IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *
-new_rd_SymConst_type (dbg_info* db, ir_graph *irg, ir_node *block, symconst_symbol value,
- symconst_kind symkind, type *tp) {
- ir_node *res;
- ir_mode *mode;
+new_rd_Sel (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
+ int arity, ir_node **in, entity *ent)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
- if ((symkind == symconst_addr_name) || (symkind == symconst_addr_ent))
- mode = mode_P_data; /* FIXME: can be mode_P_code */
- else
- mode = mode_Iu;
+ current_ir_graph = irg;
+ res = new_bd_Sel(db, block, store, objptr, arity, in, ent);
+ current_ir_graph = rem;
- res = new_ir_node(db, irg, block, op_SymConst, mode, 0, NULL);
+ return res;
+}
- res->attr.i.num = symkind;
- res->attr.i.sym = value;
- res->attr.i.tp = tp;
+ir_node *
+new_rd_SymConst_type (dbg_info *db, ir_graph *irg, ir_node *block, symconst_symbol value,
+ symconst_kind symkind, ir_type *tp)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_SymConst_type(db, block, value, symkind, tp);
+ current_ir_graph = rem;
- res = optimize_node(res);
- IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *
-new_rd_SymConst (dbg_info* db, ir_graph *irg, ir_node *block, symconst_symbol value,
+new_rd_SymConst (dbg_info *db, ir_graph *irg, ir_node *block, symconst_symbol value,
symconst_kind symkind)
{
ir_node *res = new_rd_SymConst_type(db, irg, block, value, symkind, firm_unknown_type);
return res;
}
-ir_node *new_rd_SymConst_addr_ent (dbg_info *db, ir_graph *irg, entity *symbol, type *tp) {
- symconst_symbol sym = {(type *)symbol};
- return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_addr_ent, tp);
+ir_node *new_rd_SymConst_addr_ent (dbg_info *db, ir_graph *irg, entity *symbol, ir_type *tp)
+{
+ symconst_symbol sym = {(ir_type *)symbol};
+ return new_rd_SymConst_type(db, irg, get_irg_start_block(irg), sym, symconst_addr_ent, tp);
}
-ir_node *new_rd_SymConst_addr_name (dbg_info *db, ir_graph *irg, ident *symbol, type *tp) {
- symconst_symbol sym = {(type *)symbol};
- return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_addr_name, tp);
+ir_node *new_rd_SymConst_addr_name (dbg_info *db, ir_graph *irg, ident *symbol, ir_type *tp) {
+ symconst_symbol sym = {(ir_type *)symbol};
+ return new_rd_SymConst_type(db, irg, get_irg_start_block(irg), sym, symconst_addr_name, tp);
}
-ir_node *new_rd_SymConst_type_tag (dbg_info *db, ir_graph *irg, type *symbol, type *tp) {
+ir_node *new_rd_SymConst_type_tag (dbg_info *db, ir_graph *irg, ir_type *symbol, ir_type *tp) {
symconst_symbol sym = {symbol};
- return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_type_tag, tp);
+ return new_rd_SymConst_type(db, irg, get_irg_start_block(irg), sym, symconst_type_tag, tp);
}
-ir_node *new_rd_SymConst_size (dbg_info *db, ir_graph *irg, type *symbol, type *tp) {
+ir_node *new_rd_SymConst_size (dbg_info *db, ir_graph *irg, ir_type *symbol, ir_type *tp) {
symconst_symbol sym = {symbol};
- return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_size, tp);
+ return new_rd_SymConst_type(db, irg, get_irg_start_block(irg), sym, symconst_size, tp);
}
ir_node *
-new_rd_Sync (dbg_info* db, ir_graph *irg, ir_node *block, int arity, ir_node **in)
+new_rd_Sync (dbg_info *db, ir_graph *irg, ir_node *block, int arity, ir_node **in)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Sync(db, block, arity, in);
+ current_ir_graph = rem;
- res = new_ir_node(db, irg, block, op_Sync, mode_M, arity, in);
- res = optimize_node(res);
- IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *
-new_rd_Bad (ir_graph *irg)
-{
- return irg->bad;
+new_rd_Bad (ir_graph *irg) {
+ return get_irg_bad(irg);
}
ir_node *
new_rd_Confirm (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *val, ir_node *bound, pn_Cmp cmp)
{
- ir_node *in[2], *res;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Confirm(db, block, val, bound, cmp);
+ current_ir_graph = rem;
- in[0] = val;
- in[1] = bound;
- res = new_ir_node (db, irg, block, op_Confirm, get_irn_mode(val), 2, in);
- res->attr.confirm_cmp = cmp;
- res = optimize_node (res);
- IRN_VRFY_IRG(res, irg);
return res;
}
+/* this function is often called with current_ir_graph unset */
ir_node *
new_rd_Unknown (ir_graph *irg, ir_mode *m)
{
- ir_node *res = new_ir_node(NULL, irg, irg->start_block, op_Unknown, m, 0, NULL);
- res = optimize_node(res);
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Unknown(m);
+ current_ir_graph = rem;
+
return res;
}
ir_node *
new_rd_CallBegin (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *call)
{
- ir_node *in[1];
- ir_node *res;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_CallBegin(db, block, call);
+ current_ir_graph = rem;
- in[0] = get_Call_ptr(call);
- res = new_ir_node(db, irg, block, op_CallBegin, mode_T, 1, in);
- /* res->attr.callbegin.irg = irg; */
- res->attr.callbegin.call = call;
- res = optimize_node(res);
- IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *res;
res = new_ir_node(db, irg, block, op_EndReg, mode_T, -1, NULL);
- irg->end_reg = res;
+ set_irg_end_reg(irg, res);
IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *res;
res = new_ir_node(db, irg, block, op_EndExcept, mode_T, -1, NULL);
- irg->end_except = res;
+ set_irg_end_except(irg, res);
IRN_VRFY_IRG (res, irg);
return res;
}
ir_node *
new_rd_Break (dbg_info *db, ir_graph *irg, ir_node *block)
{
- ir_node *res;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Break(db, block);
+ current_ir_graph = rem;
- res = new_ir_node(db, irg, block, op_Break, mode_X, 0, NULL);
- res = optimize_node(res);
- IRN_VRFY_IRG(res, irg);
return res;
}
new_rd_Filter (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode,
long proj)
{
- ir_node *res;
-
- res = new_ir_node(db, irg, block, op_Filter, mode, 1, &arg);
- res->attr.filter.proj = proj;
- res->attr.filter.in_cg = NULL;
- res->attr.filter.backedge = NULL;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
- assert(res);
- assert(get_Proj_pred(res));
- assert(get_nodes_block(get_Proj_pred(res)));
+ current_ir_graph = irg;
+ res = new_bd_Filter(db, block, arg, mode, proj);
+ current_ir_graph = rem;
- res = optimize_node(res);
- IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *
new_rd_NoMem (ir_graph *irg) {
- return irg->no_mem;
+ return get_irg_no_mem(irg);
}
ir_node *
new_rd_Mux (dbg_info *db, ir_graph *irg, ir_node *block,
ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode)
{
- ir_node *in[3];
- ir_node *res;
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
- in[0] = sel;
- in[1] = ir_false;
- in[2] = ir_true;
+ current_ir_graph = irg;
+ res = new_bd_Mux(db, block, sel, ir_false, ir_true, mode);
+ current_ir_graph = rem;
- res = new_ir_node(db, irg, block, op_Mux, mode, 3, in);
- assert(res);
+ return res;
+}
+
+ir_node *
+new_rd_Psi (dbg_info *db, ir_graph *irg, ir_node *block,
+ int arity, ir_node *cond[], ir_node *vals[], ir_mode *mode)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Psi(db, block, arity, cond, vals, mode);
+ current_ir_graph = rem;
+
+ return res;
+}
+
+ir_node *new_rd_CopyB(dbg_info *db, ir_graph *irg, ir_node *block,
+ ir_node *store, ir_node *dst, ir_node *src, ir_type *data_type)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_CopyB(db, block, store, dst, src, data_type);
+ current_ir_graph = rem;
+
+ return res;
+}
+
+ir_node *
+new_rd_InstOf (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
+ ir_node *objptr, ir_type *type)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_InstOf(db, block, store, objptr, type);
+ current_ir_graph = rem;
+
+ return res;
+}
+
+ir_node *
+new_rd_Raise (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store, ir_node *obj)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Raise(db, block, store, obj);
+ current_ir_graph = rem;
- res = optimize_node(res);
- IRN_VRFY_IRG(res, irg);
return res;
}
+ir_node *new_rd_Bound(dbg_info *db, ir_graph *irg, ir_node *block,
+ ir_node *store, ir_node *idx, ir_node *lower, ir_node *upper)
+{
+ ir_node *res;
+ ir_graph *rem = current_ir_graph;
+
+ current_ir_graph = irg;
+ res = new_bd_Bound(db, block, store, idx, lower, upper);
+ current_ir_graph = rem;
+
+ return res;
+}
ir_node *new_r_Block (ir_graph *irg, int arity, ir_node **in) {
return new_rd_Block(NULL, irg, arity, in);
ir_node *store, int arity, ir_node **in) {
return new_rd_Return(NULL, irg, block, store, arity, in);
}
-ir_node *new_r_Raise (ir_graph *irg, ir_node *block,
- ir_node *store, ir_node *obj) {
- return new_rd_Raise(NULL, irg, block, store, obj);
-}
ir_node *new_r_Const (ir_graph *irg, ir_node *block,
ir_mode *mode, tarval *con) {
return new_rd_Const(NULL, irg, block, mode, con);
}
-
ir_node *new_r_Const_long(ir_graph *irg, ir_node *block,
ir_mode *mode, long value) {
return new_rd_Const_long(NULL, irg, block, mode, value);
}
-
ir_node *new_r_Const_type(ir_graph *irg, ir_node *block,
- ir_mode *mode, tarval *con, type *tp) {
+ ir_mode *mode, tarval *con, ir_type *tp) {
return new_rd_Const_type(NULL, irg, block, mode, con, tp);
}
-
ir_node *new_r_SymConst (ir_graph *irg, ir_node *block,
symconst_symbol value, symconst_kind symkind) {
return new_rd_SymConst(NULL, irg, block, value, symkind);
}
+ir_node *new_r_simpleSel(ir_graph *irg, ir_node *block, ir_node *store,
+ ir_node *objptr, entity *ent) {
+ return new_rd_Sel(NULL, irg, block, store, objptr, 0, NULL, ent);
+}
ir_node *new_r_Sel (ir_graph *irg, ir_node *block, ir_node *store,
ir_node *objptr, int n_index, ir_node **index,
entity *ent) {
return new_rd_Sel(NULL, irg, block, store, objptr, n_index, index, ent);
}
-ir_node *new_r_InstOf (ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
- type *ent) {
- return (new_rd_InstOf (NULL, irg, block, store, objptr, ent));
-}
ir_node *new_r_Call (ir_graph *irg, ir_node *block, ir_node *store,
ir_node *callee, int arity, ir_node **in,
- type *tp) {
+ ir_type *tp) {
return new_rd_Call(NULL, irg, block, store, callee, arity, in, tp);
}
ir_node *new_r_Add (ir_graph *irg, ir_node *block,
ir_node *op, ir_mode *mode) {
return new_rd_Not(NULL, irg, block, op, mode);
}
-ir_node *new_r_Cmp (ir_graph *irg, ir_node *block,
- ir_node *op1, ir_node *op2) {
- return new_rd_Cmp(NULL, irg, block, op1, op2);
-}
ir_node *new_r_Shl (ir_graph *irg, ir_node *block,
ir_node *op, ir_node *k, ir_mode *mode) {
return new_rd_Shl(NULL, irg, block, op, k, mode);
ir_node *op, ir_node *k, ir_mode *mode) {
return new_rd_Rot(NULL, irg, block, op, k, mode);
}
+ir_node *new_r_Carry (ir_graph *irg, ir_node *block,
+ ir_node *op, ir_node *k, ir_mode *mode) {
+ return new_rd_Carry(NULL, irg, block, op, k, mode);
+}
+ir_node *new_r_Borrow (ir_graph *irg, ir_node *block,
+ ir_node *op, ir_node *k, ir_mode *mode) {
+ return new_rd_Borrow(NULL, irg, block, op, k, mode);
+}
+ir_node *new_r_Cmp (ir_graph *irg, ir_node *block,
+ ir_node *op1, ir_node *op2) {
+ return new_rd_Cmp(NULL, irg, block, op1, op2);
+}
ir_node *new_r_Conv (ir_graph *irg, ir_node *block,
ir_node *op, ir_mode *mode) {
return new_rd_Conv(NULL, irg, block, op, mode);
}
-ir_node *new_r_Cast (ir_graph *irg, ir_node *block, ir_node *op, type *to_tp) {
+ir_node *new_r_Cast (ir_graph *irg, ir_node *block, ir_node *op, ir_type *to_tp) {
return new_rd_Cast(NULL, irg, block, op, to_tp);
}
ir_node *new_r_Phi (ir_graph *irg, ir_node *block, int arity,
return new_rd_Store(NULL, irg, block, store, adr, val);
}
ir_node *new_r_Alloc (ir_graph *irg, ir_node *block, ir_node *store,
- ir_node *size, type *alloc_type, where_alloc where) {
+ ir_node *size, ir_type *alloc_type, where_alloc where) {
return new_rd_Alloc(NULL, irg, block, store, size, alloc_type, where);
}
ir_node *new_r_Free (ir_graph *irg, ir_node *block, ir_node *store,
- ir_node *ptr, ir_node *size, type *free_type, where_alloc where) {
+ ir_node *ptr, ir_node *size, ir_type *free_type, where_alloc where) {
return new_rd_Free(NULL, irg, block, store, ptr, size, free_type, where);
}
ir_node *new_r_Sync (ir_graph *irg, ir_node *block, int arity, ir_node **in) {
ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode) {
return new_rd_Mux(NULL, irg, block, sel, ir_false, ir_true, mode);
}
-
+ir_node *new_r_Psi (ir_graph *irg, ir_node *block,
+ int arity, ir_node *conds[], ir_node *vals[], ir_mode *mode) {
+ return new_rd_Psi(NULL, irg, block, arity, conds, vals, mode);
+}
+ir_node *new_r_CopyB(ir_graph *irg, ir_node *block,
+ ir_node *store, ir_node *dst, ir_node *src, ir_type *data_type) {
+ return new_rd_CopyB(NULL, irg, block, store, dst, src, data_type);
+}
+ir_node *new_r_InstOf (ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
+ ir_type *type) {
+ return (new_rd_InstOf (NULL, irg, block, store, objptr, type));
+}
+ir_node *new_r_Raise (ir_graph *irg, ir_node *block,
+ ir_node *store, ir_node *obj) {
+ return new_rd_Raise(NULL, irg, block, store, obj);
+}
+ir_node *new_r_Bound(ir_graph *irg, ir_node *block,
+ ir_node *store, ir_node *idx, ir_node *lower, ir_node *upper) {
+ return new_rd_Bound(NULL, irg, block, store, idx, lower, upper);
+}
/** ********************/
/** public interfaces */
*
*/
ir_node *
-new_d_Start (dbg_info* db)
+new_d_Start (dbg_info *db)
{
ir_node *res;
}
ir_node *
-new_d_End (dbg_info* db)
+new_d_End (dbg_info *db)
{
ir_node *res;
res = new_ir_node(db, current_ir_graph, current_ir_graph->current_block,
Does set current_block. Can be used with automatic Phi
node construction. */
ir_node *
-new_d_Block (dbg_info* db, int arity, ir_node **in)
+new_d_Block (dbg_info *db, int arity, ir_node **in)
{
ir_node *res;
int i;
- bool has_unknown = false;
+ int has_unknown = 0;
- res = new_rd_Block(db, current_ir_graph, arity, in);
+ res = new_bd_Block(db, arity, in);
/* Create and initialize array for Phi-node construction. */
if (get_irg_phase_state(current_ir_graph) == phase_building) {
for (i = arity-1; i >= 0; i--)
if (get_irn_op(in[i]) == op_Unknown) {
- has_unknown = true;
+ has_unknown = 1;
break;
}
/* Memory Phis in endless loops must be kept alive.
As we can't distinguish these easily we keep all of them alive. */
if ((res->op == op_Phi) && (mode == mode_M))
- add_End_keepalive(irg->end, res);
+ add_End_keepalive(get_irg_end(irg), res);
}
return res;
/* Here we rely on the fact that all frag ops have Memory as first result! */
if (get_irn_op(n) == op_Call)
arr[0] = new_Proj(n, mode_M, pn_Call_M_except);
+ else if (get_irn_op(n) == op_CopyB)
+ arr[0] = new_Proj(n, mode_M, pn_CopyB_M_except);
+ else if (get_irn_op(n) == op_Bound)
+ arr[0] = new_Proj(n, mode_M, pn_Bound_M_except);
else {
assert((pn_Quot_M == pn_DivMod_M) &&
(pn_Quot_M == pn_Div_M) &&
}
return res;
}
-#endif
+#endif /* PRECISE_EXC_CONTEXT */
/**
computes the predecessors for the real phi node, and then
(bad, jmp). In this case we call the function needlessly, eventually
generating an non existent error.
However, this SHOULD NOT HAPPEN, as bad control flow nodes are intercepted
- before recuring.
+ before recurring.
*/
- if (default_initialize_local_variable)
+ if (default_initialize_local_variable) {
+ ir_node *rem = get_cur_block();
+
+ set_cur_block(block);
block->attr.block.graph_arr[pos] = default_initialize_local_variable(current_ir_graph, mode, pos - 1);
+ set_cur_block(rem);
+ }
else
block->attr.block.graph_arr[pos] = new_Const(mode, tarval_bad);
/* We don't need to care about exception ops in the start block.
}
ir_node *
-new_d_Phi (dbg_info* db, int arity, ir_node **in, ir_mode *mode)
+new_d_Phi (dbg_info *db, int arity, ir_node **in, ir_mode *mode)
{
- return new_rd_Phi(db, current_ir_graph, current_ir_graph->current_block,
- arity, in, mode);
+ return new_bd_Phi(db, current_ir_graph->current_block, arity, in, mode);
}
ir_node *
-new_d_Const (dbg_info* db, ir_mode *mode, tarval *con)
+new_d_Const (dbg_info *db, ir_mode *mode, tarval *con)
{
- return new_rd_Const(db, current_ir_graph, current_ir_graph->start_block,
- mode, con);
+ return new_bd_Const(db, get_irg_start_block(current_ir_graph), mode, con);
}
ir_node *
-new_d_Const_long(dbg_info* db, ir_mode *mode, long value)
+new_d_Const_long(dbg_info *db, ir_mode *mode, long value)
{
- return new_rd_Const_long(db, current_ir_graph, current_ir_graph->start_block, mode, value);
+ return new_bd_Const_long(db, get_irg_start_block(current_ir_graph), mode, value);
}
ir_node *
-new_d_Const_type (dbg_info* db, ir_mode *mode, tarval *con, type *tp)
+new_d_Const_type (dbg_info *db, ir_mode *mode, tarval *con, ir_type *tp)
{
- return new_rd_Const_type(db, current_ir_graph, current_ir_graph->start_block,
- mode, con, tp);
+ return new_bd_Const_type(db, get_irg_start_block(current_ir_graph), mode, con, tp);
}
ir_node *
-new_d_Id (dbg_info* db, ir_node *val, ir_mode *mode)
+new_d_Id (dbg_info *db, ir_node *val, ir_mode *mode)
{
- return new_rd_Id(db, current_ir_graph, current_ir_graph->current_block,
- val, mode);
+ return new_bd_Id(db, current_ir_graph->current_block, val, mode);
}
ir_node *
-new_d_Proj (dbg_info* db, ir_node *arg, ir_mode *mode, long proj)
+new_d_Proj (dbg_info *db, ir_node *arg, ir_mode *mode, long proj)
{
- return new_rd_Proj(db, current_ir_graph, current_ir_graph->current_block,
- arg, mode, proj);
+ return new_bd_Proj(db, current_ir_graph->current_block, arg, mode, proj);
}
ir_node *
-new_d_defaultProj (dbg_info* db, ir_node *arg, long max_proj)
+new_d_defaultProj (dbg_info *db, ir_node *arg, long max_proj)
{
ir_node *res;
assert(arg->op == op_Cond);
}
ir_node *
-new_d_Conv (dbg_info* db, ir_node *op, ir_mode *mode)
-{
- return new_rd_Conv(db, current_ir_graph, current_ir_graph->current_block,
- op, mode);
-}
-
-ir_node *
-new_d_Cast (dbg_info* db, ir_node *op, type *to_tp)
-{
- return new_rd_Cast(db, current_ir_graph, current_ir_graph->current_block, op, to_tp);
-}
-
-ir_node *
-new_d_Tuple (dbg_info* db, int arity, ir_node **in)
-{
- return new_rd_Tuple(db, current_ir_graph, current_ir_graph->current_block,
- arity, in);
-}
-
-ir_node *
-new_d_Add (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode)
+new_d_Conv (dbg_info *db, ir_node *op, ir_mode *mode)
{
- return new_rd_Add(db, current_ir_graph, current_ir_graph->current_block,
- op1, op2, mode);
+ return new_bd_Conv(db, current_ir_graph->current_block, op, mode);
}
ir_node *
-new_d_Sub (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode)
+new_d_Cast (dbg_info *db, ir_node *op, ir_type *to_tp)
{
- return new_rd_Sub(db, current_ir_graph, current_ir_graph->current_block,
- op1, op2, mode);
+ return new_bd_Cast(db, current_ir_graph->current_block, op, to_tp);
}
-
ir_node *
-new_d_Minus (dbg_info* db, ir_node *op, ir_mode *mode)
+new_d_Tuple (dbg_info *db, int arity, ir_node **in)
{
- return new_rd_Minus(db, current_ir_graph, current_ir_graph->current_block,
- op, mode);
+ return new_bd_Tuple(db, current_ir_graph->current_block, arity, in);
}
-ir_node *
-new_d_Mul (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode)
-{
- return new_rd_Mul(db, current_ir_graph, current_ir_graph->current_block,
- op1, op2, mode);
-}
+NEW_D_BINOP(Add)
+NEW_D_BINOP(Sub)
+NEW_D_UNOP(Minus)
+NEW_D_BINOP(Mul)
/**
* allocate the frag array
}
}
-
ir_node *
-new_d_Quot (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2)
+new_d_Quot (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
{
ir_node *res;
- res = new_rd_Quot (db, current_ir_graph, current_ir_graph->current_block,
- memop, op1, op2);
+ res = new_bd_Quot (db, current_ir_graph->current_block, memop, op1, op2);
res->attr.except.pin_state = op_pin_state_pinned;
#if PRECISE_EXC_CONTEXT
allocate_frag_arr(res, op_Quot, &res->attr.except.frag_arr); /* Could be optimized away. */
}
ir_node *
-new_d_DivMod (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2)
+new_d_DivMod (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
{
ir_node *res;
- res = new_rd_DivMod (db, current_ir_graph, current_ir_graph->current_block,
- memop, op1, op2);
+ res = new_bd_DivMod (db, current_ir_graph->current_block, memop, op1, op2);
res->attr.except.pin_state = op_pin_state_pinned;
#if PRECISE_EXC_CONTEXT
allocate_frag_arr(res, op_DivMod, &res->attr.except.frag_arr); /* Could be optimized away. */
}
ir_node *
-new_d_Div (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2)
+new_d_Div (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
{
ir_node *res;
- res = new_rd_Div (db, current_ir_graph, current_ir_graph->current_block,
- memop, op1, op2);
+ res = new_bd_Div (db, current_ir_graph->current_block, memop, op1, op2);
res->attr.except.pin_state = op_pin_state_pinned;
#if PRECISE_EXC_CONTEXT
allocate_frag_arr(res, op_Div, &res->attr.except.frag_arr); /* Could be optimized away. */
}
ir_node *
-new_d_Mod (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2)
+new_d_Mod (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
{
ir_node *res;
- res = new_rd_Mod (db, current_ir_graph, current_ir_graph->current_block,
- memop, op1, op2);
+ res = new_bd_Mod (db, current_ir_graph->current_block, memop, op1, op2);
res->attr.except.pin_state = op_pin_state_pinned;
#if PRECISE_EXC_CONTEXT
allocate_frag_arr(res, op_Mod, &res->attr.except.frag_arr); /* Could be optimized away. */
return res;
}
-ir_node *
-new_d_And (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode)
-{
- return new_rd_And (db, current_ir_graph, current_ir_graph->current_block,
- op1, op2, mode);
-}
-
-ir_node *
-new_d_Or (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode)
-{
- return new_rd_Or (db, current_ir_graph, current_ir_graph->current_block,
- op1, op2, mode);
-}
-
-ir_node *
-new_d_Eor (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode)
-{
- return new_rd_Eor (db, current_ir_graph, current_ir_graph->current_block,
- op1, op2, mode);
-}
-
-ir_node *
-new_d_Not (dbg_info* db, ir_node *op, ir_mode *mode)
-{
- return new_rd_Not (db, current_ir_graph, current_ir_graph->current_block,
- op, mode);
-}
-
-ir_node *
-new_d_Shl (dbg_info* db, ir_node *op, ir_node *k, ir_mode *mode)
-{
- return new_rd_Shl (db, current_ir_graph, current_ir_graph->current_block,
- op, k, mode);
-}
-
-ir_node *
-new_d_Shr (dbg_info* db, ir_node *op, ir_node *k, ir_mode *mode)
-{
- return new_rd_Shr (db, current_ir_graph, current_ir_graph->current_block,
- op, k, mode);
-}
-
-ir_node *
-new_d_Shrs (dbg_info* db, ir_node *op, ir_node *k, ir_mode *mode)
-{
- return new_rd_Shrs (db, current_ir_graph, current_ir_graph->current_block,
- op, k, mode);
-}
-
-ir_node *
-new_d_Rot (dbg_info* db, ir_node *op, ir_node *k, ir_mode *mode)
-{
- return new_rd_Rot (db, current_ir_graph, current_ir_graph->current_block,
- op, k, mode);
-}
-
-ir_node *
-new_d_Abs (dbg_info* db, ir_node *op, ir_mode *mode)
-{
- return new_rd_Abs (db, current_ir_graph, current_ir_graph->current_block,
- op, mode);
-}
+NEW_D_BINOP(And)
+NEW_D_BINOP(Or)
+NEW_D_BINOP(Eor)
+NEW_D_UNOP(Not)
+NEW_D_BINOP(Shl)
+NEW_D_BINOP(Shr)
+NEW_D_BINOP(Shrs)
+NEW_D_BINOP(Rot)
+NEW_D_UNOP(Abs)
+NEW_D_BINOP(Carry)
+NEW_D_BINOP(Borrow)
ir_node *
-new_d_Cmp (dbg_info* db, ir_node *op1, ir_node *op2)
+new_d_Cmp (dbg_info *db, ir_node *op1, ir_node *op2)
{
- return new_rd_Cmp (db, current_ir_graph, current_ir_graph->current_block,
- op1, op2);
+ return new_bd_Cmp(db, current_ir_graph->current_block, op1, op2);
}
ir_node *
-new_d_Jmp (dbg_info* db)
+new_d_Jmp (dbg_info *db)
{
- return new_rd_Jmp (db, current_ir_graph, current_ir_graph->current_block);
+ return new_bd_Jmp (db, current_ir_graph->current_block);
}
ir_node *
-new_d_IJmp (dbg_info* db, ir_node *tgt)
+new_d_IJmp (dbg_info *db, ir_node *tgt)
{
- return new_rd_IJmp (db, current_ir_graph, current_ir_graph->current_block, tgt);
+ return new_bd_IJmp (db, current_ir_graph->current_block, tgt);
}
ir_node *
-new_d_Cond (dbg_info* db, ir_node *c)
+new_d_Cond (dbg_info *db, ir_node *c)
{
- return new_rd_Cond (db, current_ir_graph, current_ir_graph->current_block, c);
+ return new_bd_Cond (db, current_ir_graph->current_block, c);
}
ir_node *
-new_d_Call (dbg_info* db, ir_node *store, ir_node *callee, int arity, ir_node **in,
- type *tp)
+new_d_Call (dbg_info *db, ir_node *store, ir_node *callee, int arity, ir_node **in,
+ ir_type *tp)
{
ir_node *res;
- res = new_rd_Call (db, current_ir_graph, current_ir_graph->current_block,
+ res = new_bd_Call (db, current_ir_graph->current_block,
store, callee, arity, in, tp);
#if PRECISE_EXC_CONTEXT
allocate_frag_arr(res, op_Call, &res->attr.call.exc.frag_arr); /* Could be optimized away. */
}
ir_node *
-new_d_Return (dbg_info* db, ir_node* store, int arity, ir_node **in)
+new_d_Return (dbg_info *db, ir_node* store, int arity, ir_node **in)
{
- return new_rd_Return (db, current_ir_graph, current_ir_graph->current_block,
+ return new_bd_Return (db, current_ir_graph->current_block,
store, arity, in);
}
ir_node *
-new_d_Raise (dbg_info* db, ir_node *store, ir_node *obj)
-{
- return new_rd_Raise (db, current_ir_graph, current_ir_graph->current_block,
- store, obj);
-}
-
-ir_node *
-new_d_Load (dbg_info* db, ir_node *store, ir_node *addr, ir_mode *mode)
+new_d_Load (dbg_info *db, ir_node *store, ir_node *addr, ir_mode *mode)
{
ir_node *res;
- res = new_rd_Load (db, current_ir_graph, current_ir_graph->current_block,
+ res = new_bd_Load (db, current_ir_graph->current_block,
store, addr, mode);
#if PRECISE_EXC_CONTEXT
allocate_frag_arr(res, op_Load, &res->attr.load.exc.frag_arr); /* Could be optimized away. */
}
ir_node *
-new_d_Store (dbg_info* db, ir_node *store, ir_node *addr, ir_node *val)
+new_d_Store (dbg_info *db, ir_node *store, ir_node *addr, ir_node *val)
{
ir_node *res;
- res = new_rd_Store (db, current_ir_graph, current_ir_graph->current_block,
+ res = new_bd_Store (db, current_ir_graph->current_block,
store, addr, val);
#if PRECISE_EXC_CONTEXT
allocate_frag_arr(res, op_Store, &res->attr.store.exc.frag_arr); /* Could be optimized away. */
}
ir_node *
-new_d_Alloc (dbg_info* db, ir_node *store, ir_node *size, type *alloc_type,
+new_d_Alloc (dbg_info *db, ir_node *store, ir_node *size, ir_type *alloc_type,
where_alloc where)
{
ir_node *res;
- res = new_rd_Alloc (db, current_ir_graph, current_ir_graph->current_block,
+ res = new_bd_Alloc (db, current_ir_graph->current_block,
store, size, alloc_type, where);
#if PRECISE_EXC_CONTEXT
allocate_frag_arr(res, op_Alloc, &res->attr.a.exc.frag_arr); /* Could be optimized away. */
}
ir_node *
-new_d_Free (dbg_info* db, ir_node *store, ir_node *ptr,
- ir_node *size, type *free_type, where_alloc where)
+new_d_Free (dbg_info *db, ir_node *store, ir_node *ptr,
+ ir_node *size, ir_type *free_type, where_alloc where)
{
- return new_rd_Free (db, current_ir_graph, current_ir_graph->current_block,
+ return new_bd_Free (db, current_ir_graph->current_block,
store, ptr, size, free_type, where);
}
ir_node *
-new_d_simpleSel (dbg_info* db, ir_node *store, ir_node *objptr, entity *ent)
+new_d_simpleSel (dbg_info *db, ir_node *store, ir_node *objptr, entity *ent)
/* GL: objptr was called frame before. Frame was a bad choice for the name
as the operand could as well be a pointer to a dynamic object. */
{
- return new_rd_Sel (db, current_ir_graph, current_ir_graph->current_block,
+ return new_bd_Sel (db, current_ir_graph->current_block,
store, objptr, 0, NULL, ent);
}
ir_node *
-new_d_Sel (dbg_info* db, ir_node *store, ir_node *objptr, int n_index, ir_node **index, entity *sel)
+new_d_Sel (dbg_info *db, ir_node *store, ir_node *objptr, int n_index, ir_node **index, entity *sel)
{
- return new_rd_Sel (db, current_ir_graph, current_ir_graph->current_block,
+ return new_bd_Sel (db, current_ir_graph->current_block,
store, objptr, n_index, index, sel);
}
ir_node *
-new_d_InstOf (dbg_info *db, ir_node *store, ir_node *objptr, type *ent)
-{
- return (new_rd_InstOf (db, current_ir_graph, current_ir_graph->current_block,
- store, objptr, ent));
-}
-
-ir_node *
-new_d_SymConst_type (dbg_info* db, symconst_symbol value, symconst_kind kind, type *tp)
+new_d_SymConst_type (dbg_info *db, symconst_symbol value, symconst_kind kind, ir_type *tp)
{
- return new_rd_SymConst_type (db, current_ir_graph, current_ir_graph->start_block,
+ return new_bd_SymConst_type (db, get_irg_start_block(current_ir_graph),
value, kind, tp);
}
ir_node *
-new_d_SymConst (dbg_info* db, symconst_symbol value, symconst_kind kind)
+new_d_SymConst (dbg_info *db, symconst_symbol value, symconst_kind kind)
{
- return new_rd_SymConst (db, current_ir_graph, current_ir_graph->start_block,
+ return new_bd_SymConst (db, get_irg_start_block(current_ir_graph),
value, kind);
}
ir_node *
-new_d_Sync (dbg_info* db, int arity, ir_node** in)
+new_d_Sync (dbg_info *db, int arity, ir_node** in)
{
- return new_rd_Sync (db, current_ir_graph, current_ir_graph->current_block,
- arity, in);
+ return new_bd_Sync (db, current_ir_graph->current_block, arity, in);
}
ir_node *
new_d_Confirm (dbg_info *db, ir_node *val, ir_node *bound, pn_Cmp cmp)
{
- return new_rd_Confirm (db, current_ir_graph, current_ir_graph->current_block,
+ return new_bd_Confirm (db, current_ir_graph->current_block,
val, bound, cmp);
}
ir_node *
new_d_Unknown (ir_mode *m)
{
- return new_rd_Unknown(current_ir_graph, m);
+ return new_bd_Unknown(m);
}
ir_node *
new_d_CallBegin (dbg_info *db, ir_node *call)
{
ir_node *res;
- res = new_rd_CallBegin (db, current_ir_graph, current_ir_graph->current_block, call);
+ res = new_bd_CallBegin (db, current_ir_graph->current_block, call);
return res;
}
new_d_EndReg (dbg_info *db)
{
ir_node *res;
- res = new_rd_EndReg(db, current_ir_graph, current_ir_graph->current_block);
+ res = new_bd_EndReg(db, current_ir_graph->current_block);
return res;
}
new_d_EndExcept (dbg_info *db)
{
ir_node *res;
- res = new_rd_EndExcept(db, current_ir_graph, current_ir_graph->current_block);
+ res = new_bd_EndExcept(db, current_ir_graph->current_block);
return res;
}
ir_node *
new_d_Break (dbg_info *db)
{
- return new_rd_Break (db, current_ir_graph, current_ir_graph->current_block);
+ return new_bd_Break (db, current_ir_graph->current_block);
}
ir_node *
new_d_Filter (dbg_info *db, ir_node *arg, ir_mode *mode, long proj)
{
- return new_rd_Filter (db, current_ir_graph, current_ir_graph->current_block,
+ return new_bd_Filter (db, current_ir_graph->current_block,
arg, mode, proj);
}
ir_node *
new_d_Mux (dbg_info *db, ir_node *sel, ir_node *ir_false,
ir_node *ir_true, ir_mode *mode) {
- return new_rd_Mux (db, current_ir_graph, current_ir_graph->current_block,
+ return new_bd_Mux (db, current_ir_graph->current_block,
sel, ir_false, ir_true, mode);
}
+ir_node *
+new_d_Psi (dbg_info *db,int arity, ir_node *conds[], ir_node *vals[], ir_mode *mode) {
+ return new_bd_Psi (db, current_ir_graph->current_block,
+ arity, conds, vals, mode);
+}
+
+ir_node *new_d_CopyB(dbg_info *db,ir_node *store,
+ ir_node *dst, ir_node *src, ir_type *data_type) {
+ ir_node *res;
+ res = new_bd_CopyB(db, current_ir_graph->current_block,
+ store, dst, src, data_type);
+#if PRECISE_EXC_CONTEXT
+ allocate_frag_arr(res, op_CopyB, &res->attr.copyb.exc.frag_arr);
+#endif
+ return res;
+}
+
+ir_node *
+new_d_InstOf (dbg_info *db, ir_node *store, ir_node *objptr, ir_type *type)
+{
+ return new_bd_InstOf (db, current_ir_graph->current_block,
+ store, objptr, type);
+}
+
+ir_node *
+new_d_Raise (dbg_info *db, ir_node *store, ir_node *obj)
+{
+ return new_bd_Raise (db, current_ir_graph->current_block,
+ store, obj);
+}
+
+ir_node *new_d_Bound(dbg_info *db,ir_node *store,
+ ir_node *idx, ir_node *lower, ir_node *upper) {
+ ir_node *res;
+ res = new_bd_Bound(db, current_ir_graph->current_block,
+ store, idx, lower, upper);
+#if PRECISE_EXC_CONTEXT
+ allocate_frag_arr(res, op_Bound, &res->attr.bound.exc.frag_arr);
+#endif
+ return res;
+}
+
/* ********************************************************************* */
/* Comfortable interface with automatic Phi node construction. */
/* (Uses also constructors of ?? interface, except new_Block. */
/* Block construction */
/* immature Block without predecessors */
-ir_node *new_d_immBlock (dbg_info* db) {
+ir_node *new_d_immBlock (dbg_info *db) {
ir_node *res;
assert(get_irg_phase_state (current_ir_graph) == phase_building);
/* get a value from the parameter array from the current block by its index */
ir_node *
-get_d_value (dbg_info* db, int pos, ir_mode *mode)
+get_d_value (dbg_info *db, int pos, ir_mode *mode)
{
assert(get_irg_phase_state (current_ir_graph) == phase_building);
inc_irg_visited(current_ir_graph);
current_ir_graph->current_block->attr.block.graph_arr[pos + 1] = value;
}
+int
+find_value(ir_node *value)
+{
+ int i;
+ ir_node *bl = current_ir_graph->current_block;
+
+ for (i = 1; i < ARR_LEN(bl->attr.block.graph_arr); ++i)
+ if (bl->attr.block.graph_arr[i] == value)
+ return i - 1;
+ return -1;
+}
+
/* get the current store */
ir_node *
get_store (void)
void
keep_alive (ir_node *ka) {
- add_End_keepalive(current_ir_graph->end, ka);
+ add_End_keepalive(get_irg_end(current_ir_graph), ka);
}
/* --- Useful access routines --- */
}
/* Returns the frame type of the current graph */
-type *get_cur_frame_type(void) {
+ir_type *get_cur_frame_type(void) {
return get_irg_frame_type(current_ir_graph);
}
default_initialize_local_variable = func;
}
-/* call for each graph */
-void
-irg_finalize_cons (ir_graph *irg) {
- irg->phase_state = phase_high;
-}
-
void
irp_finalize_cons (void) {
- int i, n_irgs = get_irp_n_irgs();
- for (i = 0; i < n_irgs; i++) {
+ int i;
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
irg_finalize_cons(get_irp_irg(i));
}
- irp->phase_state = phase_high;\
+ irp->phase_state = phase_high;
}
-
-
ir_node *new_Block(int arity, ir_node **in) {
return new_d_Block(NULL, arity, in);
}
ir_node *new_Return (ir_node *store, int arity, ir_node *in[]) {
return new_d_Return(NULL, store, arity, in);
}
-ir_node *new_Raise (ir_node *store, ir_node *obj) {
- return new_d_Raise(NULL, store, obj);
-}
ir_node *new_Const (ir_mode *mode, tarval *con) {
return new_d_Const(NULL, mode, con);
}
return new_d_Const_long(NULL, mode, value);
}
-ir_node *new_Const_type(tarval *con, type *tp) {
+ir_node *new_Const_type(tarval *con, ir_type *tp) {
return new_d_Const_type(NULL, get_type_mode(tp), con, tp);
}
entity *ent) {
return new_d_Sel(NULL, store, objptr, arity, in, ent);
}
-ir_node *new_InstOf (ir_node *store, ir_node *objptr, type *ent) {
- return new_d_InstOf (NULL, store, objptr, ent);
-}
ir_node *new_Call (ir_node *store, ir_node *callee, int arity, ir_node **in,
- type *tp) {
+ ir_type *tp) {
return new_d_Call(NULL, store, callee, arity, in, tp);
}
ir_node *new_Add (ir_node *op1, ir_node *op2, ir_mode *mode) {
ir_node *new_Rot (ir_node *op, ir_node *k, ir_mode *mode) {
return new_d_Rot(NULL, op, k, mode);
}
+ir_node *new_Carry (ir_node *op1, ir_node *op2, ir_mode *mode) {
+ return new_d_Carry(NULL, op1, op2, mode);
+}
+ir_node *new_Borrow (ir_node *op1, ir_node *op2, ir_mode *mode) {
+ return new_d_Borrow(NULL, op1, op2, mode);
+}
ir_node *new_Cmp (ir_node *op1, ir_node *op2) {
return new_d_Cmp(NULL, op1, op2);
}
ir_node *new_Conv (ir_node *op, ir_mode *mode) {
return new_d_Conv(NULL, op, mode);
}
-ir_node *new_Cast (ir_node *op, type *to_tp) {
+ir_node *new_Cast (ir_node *op, ir_type *to_tp) {
return new_d_Cast(NULL, op, to_tp);
}
ir_node *new_Phi (int arity, ir_node **in, ir_mode *mode) {
ir_node *new_Store (ir_node *store, ir_node *addr, ir_node *val) {
return new_d_Store(NULL, store, addr, val);
}
-ir_node *new_Alloc (ir_node *store, ir_node *size, type *alloc_type,
+ir_node *new_Alloc (ir_node *store, ir_node *size, ir_type *alloc_type,
where_alloc where) {
return new_d_Alloc(NULL, store, size, alloc_type, where);
}
ir_node *new_Free (ir_node *store, ir_node *ptr, ir_node *size,
- type *free_type, where_alloc where) {
+ ir_type *free_type, where_alloc where) {
return new_d_Free(NULL, store, ptr, size, free_type, where);
}
ir_node *new_Sync (int arity, ir_node **in) {
ir_node *new_Mux (ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode) {
return new_d_Mux(NULL, sel, ir_false, ir_true, mode);
}
+ir_node *new_Psi (int arity, ir_node *conds[], ir_node *vals[], ir_mode *mode) {
+ return new_d_Psi(NULL, arity, conds, vals, mode);
+}
+ir_node *new_CopyB(ir_node *store, ir_node *dst, ir_node *src, ir_type *data_type) {
+ return new_d_CopyB(NULL, store, dst, src, data_type);
+}
+ir_node *new_InstOf (ir_node *store, ir_node *objptr, ir_type *ent) {
+ return new_d_InstOf (NULL, store, objptr, ent);
+}
+ir_node *new_Raise (ir_node *store, ir_node *obj) {
+ return new_d_Raise(NULL, store, obj);
+}
+ir_node *new_Bound(ir_node *store, ir_node *idx, ir_node *lower, ir_node *upper) {
+ return new_d_Bound(NULL, store, idx, lower, upper);
+}