# include "irgraph_t.h"
# include "irnode_t.h"
# include "irmode_t.h"
-# include "ircons.h"
+# include "ircons_t.h"
# include "firm_common_t.h"
# include "irvrfy.h"
-# include "irop.h"
+# include "irop_t.h"
# include "iropt_t.h"
# include "irgmod.h"
# include "array.h"
typedef struct Phi_in_stack Phi_in_stack;
#endif
+/* when we need verifying */
+#ifdef NDEBUG
+# define IRN_VRFY_IRG(res, irg)
+#else
+# define IRN_VRFY_IRG(res, irg) irn_vrfy_irg(res, irg)
+#endif
+
/*
* language dependant initialization variable
*/
res->attr.block.in_cg = NULL;
res->attr.block.cg_backedge = NULL;
- irn_vrfy_irg (res, irg);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *res;
- res = new_ir_node (db, irg, block, op_Start, mode_T, 0, NULL);
+ res = new_ir_node(db, irg, block, op_Start, mode_T, 0, NULL);
/* res->attr.start.irg = irg; */
- irn_vrfy_irg (res, irg);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *res;
- res = new_ir_node (db, irg, block, op_End, mode_X, -1, NULL);
+ res = new_ir_node(db, irg, block, op_End, mode_X, -1, NULL);
- irn_vrfy_irg (res, irg);
+ IRN_VRFY_IRG(res, irg);
return res;
}
/* Don't assert that block matured: the use of this constructor is strongly
restricted ... */
if ( get_Block_matured(block) )
- assert( intern_get_irn_arity(block) == arity );
+ assert( get_irn_arity(block) == arity );
- res = new_ir_node (db, irg, block, op_Phi, mode, arity, in);
+ res = new_ir_node(db, irg, block, op_Phi, mode, arity, in);
res->attr.phi_backedge = new_backedge_arr(irg->obst, arity);
for (i = arity-1; i >= 0; i--)
- if (intern_get_irn_op(in[i]) == op_Unknown) {
+ if (get_irn_op(in[i]) == op_Unknown) {
has_unknown = true;
break;
}
if (!has_unknown) res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ IRN_VRFY_IRG(res, irg);
/* Memory Phis in endless loops must be kept alive.
As we can't distinguish these easily we keep all of them alive. */
new_rd_Const_type (dbg_info* db, ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con, type *tp)
{
ir_node *res;
- res = new_ir_node (db, irg, block, op_Const, mode, 0, NULL);
+
+ res = new_ir_node (db, irg, irg->start_block, 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);
assert(get_Const_type(res) == tp);
- irn_vrfy_irg (res, irg);
-
-#if 0
- res = local_optimize_newby (res);
-# endif
+ IRN_VRFY_IRG(res, irg);
return res;
}
new_rd_Const (dbg_info* db, ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con)
{
type *tp = unknown_type;
+ /* removing this somehow causes errors in jack. */
if (tarval_is_entity(con))
tp = find_pointer_type_to_type(get_entity_type(get_tarval_entity(con)));
+
return new_rd_Const_type (db, irg, block, mode, con, tp);
}
INLINE ir_node *
new_rd_Id (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *val, ir_mode *mode)
{
- ir_node *in[1];
ir_node *res;
- in[0]=val;
- res = new_ir_node (db, irg, block, op_Id, mode, 1, in);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+
+ res = new_ir_node(db, irg, block, op_Id, mode, 1, &val);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
new_rd_Proj (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode,
long proj)
{
- ir_node *in[1];
ir_node *res;
- in[0]=arg;
- res = new_ir_node (db, irg, block, op_Proj, mode, 1, in);
+
+ res = new_ir_node (db, irg, block, op_Proj, mode, 1, &arg);
res->attr.proj = proj;
assert(res);
assert(get_Proj_pred(res));
assert(get_nodes_Block(get_Proj_pred(res)));
- res = optimize_node (res);
+ res = optimize_node(res);
- irn_vrfy_irg (res, irg);
+ IRN_VRFY_IRG(res, irg);
return res;
}
INLINE ir_node *
new_rd_Conv (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *op, ir_mode *mode)
{
- ir_node *in[1];
ir_node *res;
- in[0]=op;
- res = new_ir_node (db, irg, block, op_Conv, mode, 1, in);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+
+ res = new_ir_node(db, irg, block, op_Conv, mode, 1, &op);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
new_rd_Cast (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *op, type *to_tp)
{
ir_node *res;
- res = new_ir_node (db, irg, block, op_Cast, intern_get_irn_mode(op), 1, &op);
+
+ res = new_ir_node(db, irg, block, op_Cast, get_irn_mode(op), 1, &op);
res->attr.cast.totype = to_tp;
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *res;
- res = new_ir_node (db, irg, block, op_Tuple, mode_T, arity, in);
+ res = new_ir_node(db, irg, block, op_Tuple, mode_T, arity, in);
res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *in[2];
ir_node *res;
+
in[0] = op1;
in[1] = op2;
- res = new_ir_node (db, irg, block, op_Add, mode, 2, in);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = new_ir_node(db, irg, block, op_Add, mode, 2, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *in[2];
ir_node *res;
+
in[0] = op1;
in[1] = op2;
res = new_ir_node (db, irg, block, op_Sub, mode, 2, in);
res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ IRN_VRFY_IRG(res, irg);
return res;
}
INLINE ir_node *
new_rd_Minus (dbg_info* db, ir_graph *irg, ir_node *block,
- ir_node *op, ir_mode *mode)
+ ir_node *op, ir_mode *mode)
{
- ir_node *in[1];
ir_node *res;
- in[0]=op;
- res = new_ir_node (db, irg, block, op_Minus, mode, 1, in);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+
+ res = new_ir_node(db, irg, block, op_Minus, mode, 1, &op);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *in[2];
ir_node *res;
+
in[0] = op1;
in[1] = op2;
- res = new_ir_node (db, irg, block, op_Mul, mode, 2, in);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = new_ir_node(db, irg, block, op_Mul, mode, 2, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
new_rd_Quot (dbg_info* db, ir_graph *irg, ir_node *block,
ir_node *memop, ir_node *op1, ir_node *op2)
{
- ir_node *in[3] ;
+ ir_node *in[3];
ir_node *res;
+
in[0] = memop;
in[1] = op1;
in[2] = op2;
- res = new_ir_node (db, irg, block, op_Quot, mode_T, 3, in);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = new_ir_node(db, irg, block, op_Quot, mode_T, 3, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *in[3];
ir_node *res;
+
in[0] = memop;
in[1] = op1;
in[2] = op2;
- res = new_ir_node (db, irg, block, op_DivMod, mode_T, 3, in);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = new_ir_node(db, irg, block, op_DivMod, mode_T, 3, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *in[3];
ir_node *res;
+
in[0] = memop;
in[1] = op1;
in[2] = op2;
- res = new_ir_node (db, irg, block, op_Div, mode_T, 3, in);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = new_ir_node(db, irg, block, op_Div, mode_T, 3, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *in[3];
ir_node *res;
+
in[0] = memop;
in[1] = op1;
in[2] = op2;
- res = new_ir_node (db, irg, block, op_Mod, mode_T, 3, in);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = new_ir_node(db, irg, block, op_Mod, mode_T, 3, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *in[2];
ir_node *res;
+
in[0] = op1;
in[1] = op2;
- res = new_ir_node (db, irg, block, op_And, mode, 2, in);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = new_ir_node(db, irg, block, op_And, mode, 2, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *in[2];
ir_node *res;
+
in[0] = op1;
in[1] = op2;
- res = new_ir_node (db, irg, block, op_Or, mode, 2, in);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = new_ir_node(db, irg, block, op_Or, mode, 2, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *in[2];
ir_node *res;
+
in[0] = op1;
in[1] = op2;
res = new_ir_node (db, irg, block, op_Eor, mode, 2, in);
res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ IRN_VRFY_IRG(res, irg);
return res;
}
new_rd_Not (dbg_info* db, ir_graph *irg, ir_node *block,
ir_node *op, ir_mode *mode)
{
- ir_node *in[1];
ir_node *res;
- in[0] = op;
- res = new_ir_node (db, irg, block, op_Not, mode, 1, in);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+
+ res = new_ir_node(db, irg, block, op_Not, mode, 1, &op);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *in[2];
ir_node *res;
+
in[0] = op;
in[1] = k;
- res = new_ir_node (db, irg, block, op_Shl, mode, 2, in);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = new_ir_node(db, irg, block, op_Shl, mode, 2, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *in[2];
ir_node *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);
+ 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 *in[2];
ir_node *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);
+ 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 *in[2];
ir_node *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);
+ res = new_ir_node(db, irg, block, op_Rot, mode, 2, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
new_rd_Abs (dbg_info* db, ir_graph *irg, ir_node *block,
ir_node *op, ir_mode *mode)
{
- ir_node *in[1];
ir_node *res;
- in[0] = op;
- res = new_ir_node (db, irg, block, op_Abs, mode, 1, in);
+
+ res = new_ir_node(db, irg, block, op_Abs, mode, 1, &op);
res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ IRN_VRFY_IRG(res, irg);
return res;
}
ir_node *res;
in[0] = op1;
in[1] = op2;
- res = new_ir_node (db, irg, block, op_Cmp, mode_T, 2, in);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+
+ res = new_ir_node(db, irg, block, op_Cmp, mode_T, 2, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
new_rd_Jmp (dbg_info* db, ir_graph *irg, ir_node *block)
{
ir_node *res;
+
res = new_ir_node (db, irg, block, op_Jmp, mode_X, 0, NULL);
res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ IRN_VRFY_IRG (res, irg);
return res;
}
INLINE ir_node *
new_rd_Cond (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *c)
{
- ir_node *in[1];
ir_node *res;
- in[0] = c;
- res = new_ir_node (db, irg, block, op_Cond, mode_T, 1, in);
- res->attr.c.kind = dense;
+
+ 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);
+ IRN_VRFY_IRG(res, irg);
return res;
}
int r_arity;
r_arity = arity+2;
- NEW_ARR_A (ir_node *, r_in, r_arity);
+ 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);
+ 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_Call, mode_T, r_arity, r_in);
assert(is_method_type(tp));
set_Call_type(res, tp);
res->attr.call.callee_arr = NULL;
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
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);
+ 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 *in[2];
ir_node *res;
+
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);
+ 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 *in[2];
ir_node *res;
+
in[0] = store;
in[1] = adr;
- res = new_ir_node (db, irg, block, op_Load, mode_T, 2, in);
-
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = new_ir_node(db, irg, block, op_Load, mode_T, 2, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *in[3];
ir_node *res;
+
in[0] = store;
in[1] = adr;
in[2] = val;
- res = new_ir_node (db, irg, block, op_Store, mode_T, 3, in);
-
- res = optimize_node (res);
-
- irn_vrfy_irg (res, irg);
+ res = new_ir_node(db, irg, block, op_Store, mode_T, 3, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *in[2];
ir_node *res;
+
in[0] = store;
in[1] = size;
- res = new_ir_node (db, irg, block, op_Alloc, mode_T, 2, in);
-
+ res = new_ir_node(db, irg, block, op_Alloc, mode_T, 2, in);
res->attr.a.where = where;
- res->attr.a.type = alloc_type;
-
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res->attr.a.type = alloc_type;
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *in[3];
ir_node *res;
+
in[0] = store;
in[1] = ptr;
in[2] = size;
res = new_ir_node (db, irg, block, op_Free, mode_T, 3, in);
-
res->attr.f = free_type;
-
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
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 */
+ 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);
- res = new_ir_node (db, irg, block, op_Sel, mode_P_mach, r_arity, r_in);
-
+ memcpy(&r_in[2], in, sizeof(ir_node *) * arity);
+ res = new_ir_node(db, irg, block, op_Sel, mode_P_mach, r_arity, r_in);
res->attr.s.ent = ent;
-
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
int r_arity;
r_arity = 2;
- NEW_ARR_A (ir_node *, r_in, r_arity);
- r_in [0] = store;
- r_in [1] = objptr;
-
- res = new_ir_node (db, irg, block, op_Sel, mode_T, r_arity, r_in);
+ NEW_ARR_A(ir_node *, r_in, r_arity);
+ r_in[0] = store;
+ r_in[1] = objptr;
+ res = new_ir_node(db, irg, block, op_Sel, mode_T, r_arity, r_in);
res->attr.io.ent = ent;
- /* res = optimize (res);
- * irn_vrfy_irg (res, irg); */
- return (res);
+ /* res = optimize(res); */
+ IRN_VRFY_IRG(res, irg);
+ return res;
}
INLINE ir_node *
-new_rd_SymConst (dbg_info* db, ir_graph *irg, ir_node *block, type_or_id_p value,
- symconst_kind symkind)
+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;
- if (symkind == linkage_ptr_info)
+
+ if ((symkind == symconst_addr_name) || (symkind == symconst_addr_ent))
mode = mode_P_mach;
else
mode = mode_Iu;
- res = new_ir_node (db, irg, block, op_SymConst, mode, 0, NULL);
+ res = new_ir_node(db, irg, block, op_SymConst, mode, 0, NULL);
res->attr.i.num = symkind;
- if (symkind == linkage_ptr_info) {
- res->attr.i.tori.ptrinfo = (ident *)value;
- } else {
- assert ( ( (symkind == type_tag)
- || (symkind == size))
- && (is_type(value)));
- res->attr.i.tori.typ = (type *)value;
- }
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res->attr.i.sym = value;
+ res->attr.i.tp = tp;
+
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
+ return res;
+}
+
+INLINE ir_node *
+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, 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_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_type_tag (dbg_info *db, ir_graph *irg, type *symbol, type *tp) {
+ symconst_symbol sym = {symbol};
+ return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_type_tag, tp);
+}
+
+ir_node *new_rd_SymConst_size (dbg_info *db, ir_graph *irg, type *symbol, type *tp) {
+ symconst_symbol sym = {symbol};
+ return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_size, tp);
+}
+
INLINE ir_node *
new_rd_Sync (dbg_info* db, ir_graph *irg, ir_node *block, int arity, ir_node **in)
{
ir_node *res;
- res = new_ir_node (db, irg, block, op_Sync, mode_M, arity, in);
-
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = new_ir_node(db, irg, block, op_Sync, mode_M, arity, in);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
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;
+
in[0] = val;
in[1] = bound;
-
- res = new_ir_node (db, irg, block, op_Confirm, intern_get_irn_mode(val), 2, in);
-
+ 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);
+ IRN_VRFY_IRG(res, irg);
return res;
}
INLINE ir_node *
new_rd_Unknown (ir_graph *irg, ir_mode *m)
{
- return new_ir_node (NULL, irg, irg->start_block, op_Unknown, m, 0, NULL);
+ return new_ir_node(NULL, irg, irg->start_block, op_Unknown, m, 0, NULL);
}
INLINE ir_node *
{
ir_node *in[1];
ir_node *res;
+
in[0] = get_Call_ptr(call);
- res = new_ir_node (db, irg, block, op_CallBegin, mode_T, 1, in);
+ 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);
+ 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);
+ res = new_ir_node(db, irg, block, op_EndReg, mode_T, -1, NULL);
irg->end_reg = res;
-
- irn_vrfy_irg (res, irg);
+ IRN_VRFY_IRG(res, irg);
return res;
}
{
ir_node *res;
- res = new_ir_node (db, irg, block, op_EndExcept, mode_T, -1, NULL);
+ res = new_ir_node(db, irg, block, op_EndExcept, mode_T, -1, NULL);
irg->end_except = res;
-
- irn_vrfy_irg (res, irg);
+ IRN_VRFY_IRG (res, irg);
return res;
}
new_rd_Break (dbg_info *db, ir_graph *irg, ir_node *block)
{
ir_node *res;
- res = new_ir_node (db, irg, block, op_Break, mode_X, 0, NULL);
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+
+ 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 *in[1];
ir_node *res;
- in[0] = arg;
- res = new_ir_node (db, irg, block, op_Filter, mode, 1, in);
+
+ 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(get_Proj_pred(res));
assert(get_nodes_Block(get_Proj_pred(res)));
- res = optimize_node (res);
-
- irn_vrfy_irg (res, irg);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
int r_arity;
r_arity = arity+1;
- NEW_ARR_A (ir_node *, r_in, r_arity);
+ NEW_ARR_A(ir_node *, r_in, r_arity);
r_in[0] = callee;
- memcpy (&r_in[1], in, sizeof (ir_node *) * arity);
+ memcpy(&r_in[1], in, sizeof (ir_node *) * arity);
- res = new_ir_node (db, irg, block, op_FuncCall, mode_T, r_arity, r_in);
+ res = new_ir_node(db, irg, block, op_FuncCall, mode_T, r_arity, r_in);
assert(is_method_type(tp));
set_FuncCall_type(res, tp);
res->attr.call.callee_arr = NULL;
- res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
return res;
}
return new_rd_Const(NULL, irg, block, mode, con);
}
INLINE ir_node *new_r_SymConst (ir_graph *irg, ir_node *block,
- type_or_id_p value, symconst_kind symkind) {
+ symconst_symbol value, symconst_kind symkind) {
return new_rd_SymConst(NULL, irg, block, value, symkind);
}
INLINE ir_node *new_r_Sel (ir_graph *irg, ir_node *block, ir_node *store,
op_Start, mode_T, 0, NULL);
/* res->attr.start.irg = current_ir_graph; */
- res = optimize_node (res);
- irn_vrfy_irg (res, current_ir_graph);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, current_ir_graph);
return res;
}
new_d_End (dbg_info* db)
{
ir_node *res;
- res = new_ir_node (db, current_ir_graph, current_ir_graph->current_block,
+ res = new_ir_node(db, current_ir_graph, current_ir_graph->current_block,
op_End, mode_X, -1, NULL);
- res = optimize_node (res);
- irn_vrfy_irg (res, current_ir_graph);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, current_ir_graph);
return res;
}
int i;
bool has_unknown = false;
- res = new_rd_Block (db, current_ir_graph, arity, in);
+ res = new_rd_Block(db, current_ir_graph, arity, in);
/* Create and initialize array for Phi-node construction. */
- res->attr.block.graph_arr = NEW_ARR_D (ir_node *, current_ir_graph->obst,
- current_ir_graph->n_loc);
- memset(res->attr.block.graph_arr, 0, sizeof(ir_node *)*current_ir_graph->n_loc);
+ if (get_irg_phase_state(current_ir_graph) == phase_building) {
+ res->attr.block.graph_arr = NEW_ARR_D(ir_node *, current_ir_graph->obst,
+ current_ir_graph->n_loc);
+ memset(res->attr.block.graph_arr, 0, sizeof(ir_node *)*current_ir_graph->n_loc);
+ }
- for (i = arity-1; i >= 0; i--) if (intern_get_irn_op(in[i]) == op_Unknown) has_unknown = true;
+ for (i = arity-1; i >= 0; i--)
+ if (get_irn_op(in[i]) == op_Unknown) {
+ has_unknown = true;
+ break;
+ }
- if (!has_unknown) res = optimize_node (res);
+ if (!has_unknown) res = optimize_node(res);
current_ir_graph->current_block = res;
- irn_vrfy_irg (res, current_ir_graph);
+ IRN_VRFY_IRG(res, current_ir_graph);
return res;
}
new_rd_Phi0 (ir_graph *irg, ir_node *block, ir_mode *mode)
{
ir_node *res;
- res = new_ir_node (NULL, irg, block, op_Phi, mode, 0, NULL);
- irn_vrfy_irg (res, irg);
+
+ res = new_ir_node(NULL, irg, block, op_Phi, mode, 0, NULL);
+ IRN_VRFY_IRG(res, irg);
return res;
}
res = (Phi_in_stack *) malloc ( sizeof (Phi_in_stack));
- res->stack = NEW_ARR_F (ir_node *, 1);
+ res->stack = NEW_ARR_F (ir_node *, 0);
res->pos = 0;
return res;
res = known;
} else {
res = optimize_node (res);
- irn_vrfy_irg (res, irg);
+ IRN_VRFY_IRG(res, irg);
}
/* return the pointer to the Phi node. This node might be deallocated! */
if (block->attr.block.matured) { /* case 3 */
/* The Phi has the same amount of ins as the corresponding block. */
- int ins = intern_get_irn_arity(block);
+ int ins = get_irn_arity(block);
ir_node **nin;
NEW_ARR_A (ir_node *, nin, ins);
Phi node merges the same definition on several paths and therefore
is not needed. Don't consider Bad nodes! */
known = res;
- //DDMN(res); // GL
- //if (phi0) DDMN(phi0); else printf(" phi0 == NULL\n");
-
for (i=0; i < ins; ++i)
{
assert(in[i]);
- // GL
- //if (get_irn_op(in[i]) == op_Id)
- //{ printf(" "); DDMN(in[i]); }
-
in[i] = skip_Id(in[i]); /* increasses the number of freed Phis. */
/* Optimize self referencing Phis: We can't detect them yet properly, as
they still refer to the Phi0 they will replace. So replace right now. */
if (phi0 && in[i] == phi0) in[i] = res;
- //{ printf(" "); DDMN(in[i]); } // GL
-
if (in[i]==res || in[i]==known || is_Bad(in[i])) continue;
if (known==res)
/* i==ins: there is at most one predecessor, we don't need a phi node. */
if (i == ins) {
- //printf(" removing Phi node\n"); // GL
if (res != known) {
obstack_free (current_ir_graph->obst, res);
- res = known;
+ if (is_Phi(known)) {
+ /* If pred is a phi node we want to optmize it: If loops are matured in a bad
+ order, an enclosing Phi know may get superfluous. */
+ res = optimize_in_place_2(known);
+ if (res != known) { exchange(known, res); }
+ } else {
+ res = known;
+ }
} else {
/* A undefined value, e.g., in unreachable code. */
res = new_Bad();
}
} else {
- // GL ir_node *old = res;
- // GL dump_node (res);
res = optimize_node (res); /* This is necessary to add the node to the hash table for cse. */
- // GL if (res != old) { printf("optimize not useless!!! \n"); assert(0); }
- irn_vrfy_irg (res, irg);
+ IRN_VRFY_IRG(res, irg);
/* 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))
{
ir_node **arr;
int opt;
+
arr = NEW_ARR_D (ir_node *, current_ir_graph->obst, current_ir_graph->n_loc);
memcpy(arr, current_ir_graph->current_block->attr.block.graph_arr,
sizeof(ir_node *)*current_ir_graph->n_loc);
+
/* turn off optimization before allocating Proj nodes, as res isn't
finished yet. */
opt = get_opt_optimize(); set_optimize(0);
/* Here we rely on the fact that all frag ops have Memory as first result! */
- if (intern_get_irn_op(n) == op_Call)
- arr[0] = new_Proj(n, mode_M, 3);
- else
- arr[0] = new_Proj(n, mode_M, 0);
+ if (get_irn_op(n) == op_Call)
+ arr[0] = new_Proj(n, mode_M, pn_Call_M_except);
+ else {
+ assert((pn_Quot_M == pn_DivMod_M) &&
+ (pn_Quot_M == pn_Div_M) &&
+ (pn_Quot_M == pn_Mod_M) &&
+ (pn_Quot_M == pn_Load_M) &&
+ (pn_Quot_M == pn_Store_M) &&
+ (pn_Quot_M == pn_Alloc_M) );
+ arr[0] = new_Proj(n, mode_M, pn_Alloc_M);
+ }
set_optimize(opt);
+
current_ir_graph->current_block->attr.block.graph_arr[current_ir_graph->n_loc-1] = n;
return arr;
}
static INLINE ir_node **
get_frag_arr (ir_node *n) {
- if (intern_get_irn_op(n) == op_Call) {
+ if (get_irn_op(n) == op_Call) {
return n->attr.call.frag_arr;
- } else if (intern_get_irn_op(n) == op_Alloc) {
+ } else if (get_irn_op(n) == op_Alloc) {
return n->attr.a.frag_arr;
} else {
return n->attr.frag_arr;
static void
set_frag_value(ir_node **frag_arr, int pos, ir_node *val) {
+#if 0
if (!frag_arr[pos]) frag_arr[pos] = val;
if (frag_arr[current_ir_graph->n_loc - 1]) {
ir_node **arr = get_frag_arr(frag_arr[current_ir_graph->n_loc - 1]);
+ assert(arr != frag_arr && "Endless recursion detected");
set_frag_value(arr, pos, val);
}
+#else
+ int i;
+
+ for (i = 0; i < 1000; ++i) {
+ if (!frag_arr[pos]) {
+ frag_arr[pos] = val;
+ }
+ if (frag_arr[current_ir_graph->n_loc - 1]) {
+ ir_node **arr = get_frag_arr(frag_arr[current_ir_graph->n_loc - 1]);
+ frag_arr = arr;
+ }
+ else
+ return;
+ }
+ assert(0 && "potential endless recursion");
+#endif
}
static ir_node *
/* There was a set_value after the cfOp and no get_value before that
set_value. We must build a Phi node now. */
if (block->attr.block.matured) {
- int ins = intern_get_irn_arity(block);
+ int ins = get_irn_arity(block);
ir_node **nin;
NEW_ARR_A (ir_node *, nin, ins);
res = phi_merge(block, pos, mode, nin, ins);
before recuring.
*/
if (default_initialize_local_variable)
- block->attr.block.graph_arr[pos] = default_initialize_local_variable(mode, pos);
+ block->attr.block.graph_arr[pos] = default_initialize_local_variable(mode, pos - 1);
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.
phi0 = new_rd_Phi0(current_ir_graph, block, mode);
block->attr.block.graph_arr[pos] = phi0;
#if PRECISE_EXC_CONTEXT
- /* Set graph_arr for fragile ops. Also here we should break recursion.
- We could choose a cyclic path through an cfop. But the recursion would
- break at some point. */
- set_frag_value(block->attr.block.graph_arr, pos, phi0);
+ if (get_opt_precise_exc_context()) {
+ /* Set graph_arr for fragile ops. Also here we should break recursion.
+ We could choose a cyclic path through an cfop. But the recursion would
+ break at some point. */
+ set_frag_value(block->attr.block.graph_arr, pos, phi0);
+ }
#endif
}
}
assert (prevBlock);
if (!is_Bad(prevBlock)) {
#if PRECISE_EXC_CONTEXT
- if (is_fragile_op(prevCfOp) && (intern_get_irn_op (prevCfOp) != op_Bad)) {
- assert(get_r_frag_value_internal (prevBlock, prevCfOp, pos, mode));
- nin[i-1] = get_r_frag_value_internal (prevBlock, prevCfOp, pos, mode);
+ if (get_opt_precise_exc_context() &&
+ is_fragile_op(prevCfOp) && (get_irn_op (prevCfOp) != op_Bad)) {
+ assert(get_r_frag_value_internal (prevBlock, prevCfOp, pos, mode));
+ nin[i-1] = get_r_frag_value_internal (prevBlock, prevCfOp, pos, mode);
} else
#endif
- nin[i-1] = get_r_value_internal (prevBlock, pos, mode);
+ nin[i-1] = get_r_value_internal (prevBlock, pos, mode);
} else {
nin[i-1] = new_Bad();
}
if (block->attr.block.matured) { /* case 3 */
/* The Phi has the same amount of ins as the corresponding block. */
- int ins = intern_get_irn_arity(block);
+ int ins = get_irn_arity(block);
ir_node **nin;
NEW_ARR_A (ir_node *, nin, ins);
ir_node *n, **nin;
ir_node *next;
- //DDMN(block); // GL
-
assert (get_irn_opcode(block) == iro_Block);
/* @@@ should be commented in
assert (!get_Block_matured(block) && "Block already matured"); */
nodes refer to the unoptimized node.
We can call _2, as global cse has no effect on blocks. */
block = optimize_in_place_2(block);
- irn_vrfy_irg(block, current_ir_graph);
+ IRN_VRFY_IRG(block, current_ir_graph);
}
}
ir_node *
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,
+ return new_rd_Phi(db, current_ir_graph, current_ir_graph->current_block,
arity, in, mode);
}
ir_node *
new_d_Const (dbg_info* db, ir_mode *mode, tarval *con)
{
- return new_rd_Const (db, current_ir_graph, current_ir_graph->start_block,
+ return new_rd_Const(db, current_ir_graph, current_ir_graph->start_block,
mode, con);
}
ir_node *
new_d_Const_type (dbg_info* db, ir_mode *mode, tarval *con, type *tp)
{
- return new_rd_Const_type (db, current_ir_graph, current_ir_graph->start_block,
+ return new_rd_Const_type(db, current_ir_graph, current_ir_graph->start_block,
mode, con, tp);
}
ir_node *
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,
+ return new_rd_Id(db, current_ir_graph, current_ir_graph->current_block,
val, mode);
}
ir_node *
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,
+ return new_rd_Proj(db, current_ir_graph, current_ir_graph->current_block,
arg, mode, proj);
}
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,
+ 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);
+ 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,
+ 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)
{
- return new_rd_Add (db, current_ir_graph, current_ir_graph->current_block,
+ return new_rd_Add(db, current_ir_graph, current_ir_graph->current_block,
op1, op2, mode);
}
ir_node *
new_d_Sub (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode)
{
- return new_rd_Sub (db, current_ir_graph, current_ir_graph->current_block,
+ return new_rd_Sub(db, current_ir_graph, current_ir_graph->current_block,
op1, op2, mode);
}
ir_node *
-new_d_Minus (dbg_info* db, ir_node *op, ir_mode *mode)
+new_d_Minus (dbg_info* db, ir_node *op, ir_mode *mode)
{
- return new_rd_Minus (db, current_ir_graph, current_ir_graph->current_block,
+ return new_rd_Minus(db, current_ir_graph, current_ir_graph->current_block,
op, mode);
}
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,
+ return new_rd_Mul(db, current_ir_graph, current_ir_graph->current_block,
op1, op2, mode);
}
+/**
+ * allocate the frag array
+ */
+static void allocate_frag_arr(ir_node *res, ir_op *op, ir_node ***frag_store) {
+ if (get_opt_precise_exc_context()) {
+ if ((current_ir_graph->phase_state == phase_building) &&
+ (get_irn_op(res) == op) && /* Could be optimized away. */
+ !*frag_store) /* Could be a cse where the arr is already set. */ {
+ *frag_store = new_frag_arr(res);
+ }
+ }
+}
+
+
ir_node *
new_d_Quot (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2)
{
res = new_rd_Quot (db, current_ir_graph, current_ir_graph->current_block,
memop, op1, op2);
#if PRECISE_EXC_CONTEXT
- if ((current_ir_graph->phase_state == phase_building) &&
- (intern_get_irn_op(res) == op_Quot)) /* Could be optimized away. */
- res->attr.frag_arr = new_frag_arr(res);
+ allocate_frag_arr(res, op_Quot, &res->attr.frag_arr); /* Could be optimized away. */
#endif
return res;
res = new_rd_DivMod (db, current_ir_graph, current_ir_graph->current_block,
memop, op1, op2);
#if PRECISE_EXC_CONTEXT
- if ((current_ir_graph->phase_state == phase_building) &&
- (intern_get_irn_op(res) == op_DivMod)) /* Could be optimized away. */
- res->attr.frag_arr = new_frag_arr(res);
+ allocate_frag_arr(res, op_DivMod, &res->attr.frag_arr); /* Could be optimized away. */
#endif
return res;
res = new_rd_Div (db, current_ir_graph, current_ir_graph->current_block,
memop, op1, op2);
#if PRECISE_EXC_CONTEXT
- if ((current_ir_graph->phase_state == phase_building) &&
- (intern_get_irn_op(res) == op_Div)) /* Could be optimized away. */
- res->attr.frag_arr = new_frag_arr(res);
+ allocate_frag_arr(res, op_Div, &res->attr.frag_arr); /* Could be optimized away. */
#endif
return res;
res = new_rd_Mod (db, current_ir_graph, current_ir_graph->current_block,
memop, op1, op2);
#if PRECISE_EXC_CONTEXT
- if ((current_ir_graph->phase_state == phase_building) &&
- (intern_get_irn_op(res) == op_Mod)) /* Could be optimized away. */
- res->attr.frag_arr = new_frag_arr(res);
+ allocate_frag_arr(res, op_Mod, &res->attr.frag_arr); /* Could be optimized away. */
#endif
return res;
res = new_rd_Call (db, current_ir_graph, current_ir_graph->current_block,
store, callee, arity, in, tp);
#if PRECISE_EXC_CONTEXT
- if ((current_ir_graph->phase_state == phase_building) &&
- (intern_get_irn_op(res) == op_Call)) /* Could be optimized away. */
- res->attr.call.frag_arr = new_frag_arr(res);
+ allocate_frag_arr(res, op_Call, &res->attr.call.frag_arr); /* Could be optimized away. */
#endif
return res;
res = new_rd_Load (db, current_ir_graph, current_ir_graph->current_block,
store, addr);
#if PRECISE_EXC_CONTEXT
- if ((current_ir_graph->phase_state == phase_building) &&
- (intern_get_irn_op(res) == op_Load)) /* Could be optimized away. */
- res->attr.frag_arr = new_frag_arr(res);
+ allocate_frag_arr(res, op_Load, &res->attr.frag_arr); /* Could be optimized away. */
#endif
return res;
res = new_rd_Store (db, current_ir_graph, current_ir_graph->current_block,
store, addr, val);
#if PRECISE_EXC_CONTEXT
- if ((current_ir_graph->phase_state == phase_building) &&
- (intern_get_irn_op(res) == op_Store)) /* Could be optimized away. */
- res->attr.frag_arr = new_frag_arr(res);
+ allocate_frag_arr(res, op_Store, &res->attr.frag_arr); /* Could be optimized away. */
#endif
return res;
res = new_rd_Alloc (db, current_ir_graph, current_ir_graph->current_block,
store, size, alloc_type, where);
#if PRECISE_EXC_CONTEXT
- if ((current_ir_graph->phase_state == phase_building) &&
- (intern_get_irn_op(res) == op_Alloc)) /* Could be optimized away. */
- res->attr.a.frag_arr = new_frag_arr(res);
+ allocate_frag_arr(res, op_Alloc, &res->attr.a.frag_arr); /* Could be optimized away. */
#endif
return res;
}
ir_node *
-new_d_SymConst (dbg_info* db, type_or_id_p value, symconst_kind kind)
+new_d_SymConst_type (dbg_info* db, symconst_symbol value, symconst_kind kind, type *tp)
+{
+ return new_rd_SymConst_type (db, current_ir_graph, current_ir_graph->start_block,
+ value, kind, tp);
+}
+
+ir_node *
+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,
value, kind);
ir_node *
-new_d_Bad (void)
+(new_d_Bad)(void)
{
- return current_ir_graph->bad;
+ return __new_d_Bad();
}
ir_node *
memset(res->attr.block.graph_arr, 0, sizeof(ir_node *)*current_ir_graph->n_loc);
/* Immature block may not be optimized! */
- irn_vrfy_irg (res, current_ir_graph);
+ IRN_VRFY_IRG(res, current_ir_graph);
return res;
}
INLINE ir_node *
-new_immBlock () {
+new_immBlock (void) {
return new_d_immBlock(NULL);
}
assert(0 && "Error: Block already matured!\n");
}
else {
- assert (jmp != NULL);
- ARR_APP1 (ir_node *, block->in, jmp);
+ assert(jmp != NULL);
+ ARR_APP1(ir_node *, block->in, jmp);
}
}
ir_node *new_Const (ir_mode *mode, tarval *con) {
return new_d_Const(NULL, mode, con);
}
-ir_node *new_SymConst (type_or_id_p value, symconst_kind kind) {
+ir_node *new_SymConst (symconst_symbol value, symconst_kind kind) {
return new_d_SymConst(NULL, value, kind);
}
ir_node *new_simpleSel(ir_node *store, ir_node *objptr, entity *ent) {