typedef struct Phi_in_stack Phi_in_stack;
#endif
+/*
+ * language dependant initialization variable
+ */
+static default_initialize_local_variable_func_t *default_initialize_local_variable = NULL;
+
/*** ******************************************** */
/** privat interfaces, for professional use only */
res->attr.block.in_cg = NULL;
res->attr.block.cg_backedge = NULL;
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res = new_ir_node (db, irg, block, op_Start, mode_T, 0, NULL);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res = new_ir_node (db, irg, block, op_End, mode_X, -1, NULL);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res->attr.phi_backedge = new_backedge_arr(irg->obst, arity);
res = optimize_node (res);
- irn_vrfy (res);
+ 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. */
res = new_ir_node (db, irg, block, op_Const, mode, 0, NULL);
res->attr.con = con;
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
#if 0
res = local_optimize_newby (res);
ir_node *res;
res = new_ir_node (db, irg, block, op_Id, mode, 1, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Conv, mode, 1, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res = new_ir_node (db, irg, block, op_Tuple, mode_T, arity, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Add, mode, 2, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Sub, mode, 2, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Minus, mode, 1, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Mul, mode, 2, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Quot, mode_T, 3, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_DivMod, mode_T, 3, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Div, mode_T, 3, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Mod, mode_T, 3, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_And, mode, 2, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Or, mode, 2, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Eor, mode, 2, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Not, mode, 1, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Shl, mode, 2, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Shr, mode, 2, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Shrs, mode, 2, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Rot, mode, 2, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Abs, mode, 1, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Cmp, mode_T, 2, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Jmp, mode_X, 0, NULL);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res->attr.c.kind = dense;
res->attr.c.default_proj = 0;
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
set_Call_type(res, tp);
res->attr.call.callee_arr = NULL;
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
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 (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Raise, mode_T, 2, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res = new_ir_node (db, irg, block, op_Load, mode_T, 2, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res->attr.a.type = alloc_type;
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res->attr.f = free_type;
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res->attr.s.ent = ent;
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res->attr.io.ent = ent;
/* res = optimize (res);
- * irn_vrfy (res); */
+ * irn_vrfy_irg (res, irg); */
return (res);
}
res->attr.i.tori.typ = (type *)value;
}
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res = new_ir_node (db, irg, block, op_Sync, mode_M, arity, in);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
INLINE ir_node *
-new_rd_Bad ()
+new_rd_Bad (ir_graph *irg)
{
- return current_ir_graph->bad;
+ return irg->bad;
}
INLINE ir_node *
-new_rd_Unknown ()
+new_rd_Unknown (ir_graph *irg)
{
- return current_ir_graph->unknown;
+ return irg->unknown;
}
INLINE ir_node *
res->attr.callbegin.irg = irg;
res->attr.callbegin.call = call;
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res = new_ir_node (db, irg, block, op_EndReg, mode_T, -1, NULL);
res->attr.end.irg = irg;
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res = new_ir_node (db, irg, block, op_EndExcept, mode_T, -1, NULL);
res->attr.end.irg = irg;
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *res;
res = new_ir_node (db, irg, block, op_Break, mode_X, 0, NULL);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
ir_node *val, ir_mode *mode) {
return new_rd_Id(NULL, irg, block, val, mode);
}
-INLINE ir_node *new_r_Bad () {
- return new_rd_Bad();
+INLINE ir_node *new_r_Bad (ir_graph *irg) {
+ return new_rd_Bad(irg);
}
-INLINE ir_node *new_r_Unknown () {
- return new_rd_Unknown();
+INLINE ir_node *new_r_Unknown (ir_graph *irg) {
+ return new_rd_Unknown(irg);
}
INLINE ir_node *new_r_CallBegin (ir_graph *irg, ir_node *block, ir_node *callee) {
return new_rd_CallBegin(NULL, irg, block, callee);
op_Start, mode_T, 0, NULL);
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, current_ir_graph);
return res;
}
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 (res);
+ irn_vrfy_irg (res, current_ir_graph);
return res;
}
res = optimize_node (res);
current_ir_graph->current_block = res;
- irn_vrfy (res);
+ irn_vrfy_irg (res, current_ir_graph);
return res;
}
{
ir_node *res;
res = new_ir_node (NULL, irg, block, op_Phi, mode, 0, NULL);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
return res;
}
res = known;
} else {
res = optimize_node (res);
- irn_vrfy (res);
+ irn_vrfy_irg (res, irg);
}
/* return the pointer to the Phi node. This node might be deallocated! */
}
} else {
res = optimize_node (res);
- irn_vrfy (res);
+ 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 the alive. */
if ((res->op == op_Phi) && (mode == mode_M))
Else we may not set graph_arr as there a later value is remembered. */
phi0 = NULL;
if (!block->attr.block.graph_arr[pos]) {
- /* This is commented out as collapsing to Bads is no good idea.
- Either we need an assert here, or we need to call a routine
- that deals with this case as appropriate for the given language.
- Right now a self referencing Id is created which will crash irg_vrfy().
-
- Even if all variables are defined before use, it can happen that
- we get to the start block, if a cond has been replaced by a tuple
- (bad, jmp). As the start has a self referencing control flow edge,
- we get a self referencing Id, which is hard to optimize away. We avoid
- this by defining the value as a Bad node.
- Returning a const with tarval_bad is a preliminary solution. In some
- situations we might want a Warning or an Error. */
-
if (block == get_irg_start_block(current_ir_graph)) {
- block->attr.block.graph_arr[pos] = new_Const(mode, tarval_bad);
+ /* Collapsing to Bad tarvals is no good idea.
+ So we call a user-supplied routine here that deals with this case as
+ appropriate for the given language. Sorryly the only help we can give
+ here is the position.
+
+ Even if all variables are defined before use, it can happen that
+ we get to the start block, if a cond has been replaced by a tuple
+ (bad, jmp). In this case we call the function needlessly, eventually
+ generating an non existant error.
+ However, this SHOULD NOT HAPPEN, as bad control flow nodes are intercepted
+ before recuring.
+ */
+ if (default_initialize_local_variable)
+ block->attr.block.graph_arr[pos] = default_initialize_local_variable(mode, pos);
+ 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.
There are none by definition. */
return block->attr.block.graph_arr[pos];
printf("Error: no value set. Use of undefined variable. Initializing to zero.\n");
assert (mode->code >= irm_F && mode->code <= irm_P);
res = new_rd_Const (NULL, current_ir_graph, block, mode,
- tarval_mode_null[mode->code]);
+ get_mode_null(mode));
}
/* The local valid value is available now. */
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(block);
+ irn_vrfy_irg(block, current_ir_graph);
}
}
memset(res->attr.block.graph_arr, 0, sizeof(ir_node *)*current_ir_graph->n_loc);
/* Immature block may not be optimized! */
- irn_vrfy (res);
+ irn_vrfy_irg (res, current_ir_graph);
return res;
}
/* call once for each run of the library */
void
-init_cons (void)
+init_cons (default_initialize_local_variable_func_t *func)
{
+ default_initialize_local_variable = func;
}
/* call for each graph */