Commit e36a82c5 authored by Matthias Braun's avatar Matthias Braun
Browse files

cleanup ircons code; add current_ir_graph independent construction bits;...

cleanup ircons code; add current_ir_graph independent construction bits; new_ir_graph does not set current_ir_graph anymore

[r28042]
parent 842280b6
......@@ -1148,17 +1148,15 @@ FIRM_API ir_node *new_rd_Block(dbg_info *db, ir_graph *irg, int arity, ir_node *
*
* @param *db A pointer for debug information.
* @param *irg The IR graph the node belongs to.
* @param *block The IR block the node belongs to.
*/
FIRM_API ir_node *new_rd_Start(dbg_info *db, ir_node *block);
FIRM_API ir_node *new_rd_Start(dbg_info *db, ir_graph *irg);
/** Constructor for a End node.
*
* @param *db A pointer for debug information.
* @param *irg The IR graph the node belongs to.
* @param *block The IR block the node belongs to.
*/
FIRM_API ir_node *new_rd_End(dbg_info *db, ir_node *block);
FIRM_API ir_node *new_rd_End(dbg_info *db, ir_graph *irg);
/** Constructor for a Jmp node.
*
......@@ -1975,17 +1973,11 @@ FIRM_API ir_node *new_rd_ASM(dbg_info *db, ir_node *block,
*/
FIRM_API ir_node *new_r_Block(ir_graph *irg, int arity, ir_node *in[]);
/** Constructor for a Start node.
*
* @param *block The IR block the node belongs to.
*/
FIRM_API ir_node *new_r_Start(ir_node *block);
/** Constructor for a Start node. */
FIRM_API ir_node *new_r_Start(ir_graph *irg);
/** Constructor for a End node.
*
* @param *block The IR block the node belongs to.
*/
FIRM_API ir_node *new_r_End(ir_node *block);
/** Constructor for a End node. */
FIRM_API ir_node *new_r_End(ir_graph *irg);
/** Constructor for a Jmp node.
*
......@@ -2682,9 +2674,11 @@ FIRM_API ir_node *new_r_ASM(ir_node *block,
* @param target The new current block.
*/
FIRM_API void set_cur_block(ir_node *target);
FIRM_API void set_r_cur_block(ir_graph *irg, ir_node *target);
/** Returns the current block of the current graph. */
FIRM_API ir_node *get_cur_block(void);
FIRM_API ir_node *get_r_cur_block(ir_graph *irg);
/** Constructor for a Block node.
*
......@@ -4215,6 +4209,8 @@ FIRM_API ir_node *new_Dummy(ir_mode *mode);
*/
FIRM_API ir_node *new_d_immBlock(dbg_info *db);
FIRM_API ir_node *new_immBlock(void);
FIRM_API ir_node *new_r_immBlock(ir_graph *irg);
FIRM_API ir_node *new_rd_immBlock(dbg_info *db, ir_graph *irg);
/** Add a control flow edge to an immature block. */
FIRM_API void add_immBlock_pred(ir_node *immblock, ir_node *jmp);
......@@ -4232,8 +4228,8 @@ FIRM_API void mature_immBlock(ir_node *block);
* @param pos The position/id of the local variable.
* @param *mode The mode of the value to get.
*/
FIRM_API ir_node *get_d_value(dbg_info *db, int pos, ir_mode *mode);
FIRM_API ir_node *get_value(int pos, ir_mode *mode);
FIRM_API ir_node *get_r_value(ir_graph *irg, int pos, ir_mode *mode);
/**
* Try to guess the mode of a local variable.
......@@ -4256,6 +4252,7 @@ FIRM_API ir_mode *ir_guess_mode(int pos);
* @param *value The new value written to the local variable.
*/
FIRM_API void set_value(int pos, ir_node *value);
FIRM_API void set_r_value(ir_graph *irg, int pos, ir_node *value);
/**
* Find the value number for a node in the current block.
......@@ -4274,6 +4271,7 @@ FIRM_API int find_value(ir_node *value);
* state value.
*/
FIRM_API ir_node *get_store(void);
FIRM_API ir_node *get_r_store(ir_graph *irg);
/** Remark a new definition of the memory state.
*
......@@ -4283,6 +4281,7 @@ FIRM_API ir_node *get_store(void);
* @param *store The new memory state.
*/
FIRM_API void set_store(ir_node *store);
FIRM_API void set_r_store(ir_graph *irg, ir_node *store);
/** keep this node alive even if End is not control-reachable from it
*
......@@ -4290,10 +4289,6 @@ FIRM_API void set_store(ir_node *store);
*/
FIRM_API void keep_alive(ir_node *ka);
/** Returns the frame type of the current graph */
FIRM_API ir_type *get_cur_frame_type(void);
/* --- initialize and finalize IR construction --- */
/** Puts the graph into state "phase_high" */
......
......@@ -135,9 +135,8 @@ FIRM_API void set_current_ir_graph(ir_graph *graph);
* represent a procedure in FIRM.
*
* It allocates an ir_graph and sets the field irg of the entity ent
* as well as current_ir_graph to point to this graph.
* Further it allocates the following nodes needed for every
* procedure:
* to point to this graph. Further it allocates the following nodes needed
* for every procedure:
*
* - The start block containing a start node and Proj nodes for it's
* seven results (X, M, P, P, P, T, P).
......@@ -243,11 +242,6 @@ FIRM_API ir_node *get_irg_args(const ir_graph *irg);
/** Sets the node that represents the argument pointer of the given IR graph. */
FIRM_API void set_irg_args(ir_graph *irg, ir_node *node);
/** Returns the current block of an IR graph. */
FIRM_API ir_node *get_irg_current_block(const ir_graph *irg);
/** Sets the current block of an IR graph. */
FIRM_API void set_irg_current_block(ir_graph *irg, ir_node *node);
/** Returns the Bad node of the given IR graph. Use new_Bad() instead!! */
FIRM_API ir_node *get_irg_bad(const ir_graph *irg);
FIRM_API void set_irg_bad(ir_graph *irg, ir_node *node);
......
......@@ -701,7 +701,6 @@ static ir_node *get_end_of_block_insertion_point(ir_node* block)
static void create_memperms(be_fec_env_t *env)
{
ir_graph *irg = env->irg;
memperm_t *memperm;
for (memperm = set_first(env->memperms); memperm != NULL; memperm = set_next(env->memperms)) {
......@@ -733,7 +732,6 @@ static void create_memperms(be_fec_env_t *env)
be_set_MemPerm_in_entity(mempermnode, i, entry->in);
be_set_MemPerm_out_entity(mempermnode, i, entry->out);
set_irg_current_block(irg, memperm->block);
proj = new_r_Proj(mempermnode, get_irn_mode(arg), i);
set_irn_n(entry->node, entry->pos, proj);
......
......@@ -116,12 +116,14 @@ static ir_node *create_phi(be_ssa_construction_env_t *env, ir_node *block,
int i, n_preds = get_Block_n_cfgpreds(block);
ir_graph *irg = get_Block_irg(block);
ir_node **ins = ALLOCAN(ir_node*, n_preds);
ir_node *dummy;
ir_node *phi;
assert(n_preds > 1);
dummy = new_r_Dummy(irg, env->mode);
for (i = 0; i < n_preds; ++i) {
ins[i] = new_r_Unknown(irg, env->mode);
ins[i] = dummy;
}
phi = be_new_Phi(block, n_preds, ins, env->mode, env->phi_cls);
if (env->new_phis != NULL) {
......
......@@ -161,6 +161,7 @@ static void spill_phi(minibelady_env_t *env, ir_node *phi)
ir_node *block = get_nodes_block(phi);
int arity = get_irn_arity(phi);
ir_node **in = ALLOCAN(ir_node*, arity);
ir_node *dummy = new_r_Dummy(irg, mode_M);
ir_node *spill_to_kill = NULL;
spill_info_t *spill_info;
int i;
......@@ -175,7 +176,7 @@ static void spill_phi(minibelady_env_t *env, ir_node *phi)
/* create a new phi-M with bad preds */
for (i = 0; i < arity; ++i) {
in[i] = new_r_Unknown(irg, mode_M);
in[i] = dummy;
}
DBG((dbg, LEVEL_2, "\tcreate Phi-M for %+F\n", phi));
......
This diff is collapsed.
......@@ -161,8 +161,6 @@ ir_graph *new_r_ir_graph(ir_entity *ent, int n_loc)
/* inform statistics here, as blocks will be already build on this graph */
hook_new_graph(res, ent);
current_ir_graph = res;
/*-- initialized for each graph. --*/
res->kind = k_ir_graph;
res->obst = XMALLOC(struct obstack);
......@@ -213,17 +211,17 @@ ir_graph *new_r_ir_graph(ir_entity *ent, int n_loc)
res->anchor = new_r_Anchor(res);
/*-- Nodes needed in every graph --*/
set_irg_end_block (res, new_immBlock());
end = new_r_End(get_irg_end_block(res));
set_irg_end_block (res, new_r_immBlock(res));
end = new_r_End(res);
set_irg_end(res, end);
start_block = new_immBlock();
start_block = new_r_Block(res, 0, NULL);
set_irg_start_block(res, start_block);
bad = new_ir_node(NULL, res, start_block, op_Bad, mode_T, 0, NULL);
bad->attr.irg.irg = res;
set_irg_bad (res, bad);
set_irg_no_mem (res, new_ir_node(NULL, res, start_block, op_NoMem, mode_M, 0, NULL));
start = new_r_Start(start_block);
start = new_r_Start(res);
set_irg_start (res, start);
/* Proj results of start node */
......@@ -235,19 +233,17 @@ ir_graph *new_r_ir_graph(ir_entity *ent, int n_loc)
initial_mem = new_r_Proj(start, mode_M, pn_Start_M);
set_irg_initial_mem(res, initial_mem);
set_cur_block(start_block);
set_store(initial_mem);
res->index = get_irp_new_irg_idx();
#ifdef DEBUG_libfirm
res->graph_nr = get_irp_new_node_nr();
#endif
mature_immBlock(start_block);
set_r_cur_block(res, start_block);
set_r_store(res, initial_mem);
/*-- Make a block to start with --*/
first_block = new_immBlock();
set_cur_block(first_block);
first_block = new_r_immBlock(res);
set_r_cur_block(res, first_block);
add_immBlock_pred(first_block, projX);
res->method_execution_frequency = -1.0;
......@@ -280,7 +276,6 @@ ir_graph *new_const_code_irg(void)
/* inform statistics here, as blocks will be already build on this graph */
hook_new_graph(res, NULL);
current_ir_graph = res;
res->n_loc = 1; /* Only the memory. */
res->visited = 0; /* visited flag, for the ir walker */
res->block_visited = 0; /* visited flag, for the 'block'-walker */
......@@ -304,33 +299,29 @@ ir_graph *new_const_code_irg(void)
res->anchor = new_r_Anchor(res);
/* -- The end block -- */
end_block = new_immBlock();
end_block = new_r_Block(res, 0, NULL);
set_irg_end_block(res, end_block);
end = new_r_End(end_block);
end = new_r_End(res);
set_irg_end(res, end);
mature_immBlock(end_block);
/* -- The start block -- */
start_block = new_immBlock();
set_cur_block(start_block);
start_block = new_r_Block(res, 0, NULL);
set_irg_start_block(res, start_block);
bad = new_ir_node(NULL, res, start_block, op_Bad, mode_T, 0, NULL);
bad->attr.irg.irg = res;
set_irg_bad(res, bad);
no_mem = new_ir_node(NULL, res, start_block, op_NoMem, mode_M, 0, NULL);
set_irg_no_mem(res, no_mem);
start = new_r_Start(start_block);
start = new_r_Start(res);
set_irg_start(res, start);
/* Proj results of start node */
set_irg_initial_mem(res, new_r_Proj(start, mode_M, pn_Start_M));
projX = new_r_Proj(start, mode_X, pn_Start_X_initial_exec);
mature_immBlock(start_block);
body_block = new_immBlock();
add_immBlock_pred(body_block, projX);
mature_immBlock(body_block); /* mature the 'body' block for expressions */
set_cur_block(body_block);
body_block = new_r_Block(res, 1, &projX);
set_r_cur_block(res, body_block);
/* Set the visited flag high enough that the blocks will never be visited. */
set_irn_visited(body_block, -1);
......@@ -626,16 +617,6 @@ void (set_irg_no_mem)(ir_graph *irg, ir_node *node)
_set_irg_no_mem(irg, node);
}
ir_node *(get_irg_current_block)(const ir_graph *irg)
{
return _get_irg_current_block(irg);
}
void (set_irg_current_block)(ir_graph *irg, ir_node *node)
{
_set_irg_current_block(irg, node);
}
ir_entity *(get_irg_entity)(const ir_graph *irg)
{
return _get_irg_entity(irg);
......
......@@ -216,16 +216,6 @@ static inline void _set_irg_no_mem(ir_graph *irg, ir_node *node)
set_irn_n(irg->anchor, anchor_no_mem, node);
}
static inline ir_node *_get_irg_current_block(const ir_graph *irg)
{
return irg->current_block;
}
static inline void _set_irg_current_block(ir_graph *irg, ir_node *node)
{
irg->current_block = node;
}
static inline ir_entity *_get_irg_entity(const ir_graph *irg)
{
assert(irg);
......@@ -556,8 +546,6 @@ static inline ir_phase *irg_get_phase(const ir_graph *irg, ir_phase_id id)
#define set_irg_bad(irg, node) _set_irg_bad(irg, node)
#define get_irg_no_mem(irg) _get_irg_no_mem(irg)
#define set_irn_no_mem(irg, node) _set_irn_no_mem(irg, node)
#define get_irg_current_block(irg) _get_irg_current_block(irg)
#define set_irg_current_block(irg, node) _set_irg_current_block(irg, node)
#define get_irg_entity(irg) _get_irg_entity(irg)
#define set_irg_entity(irg, ent) _set_irg_entity(irg, ent)
#define get_irg_frame_type(irg) _get_irg_frame_type(irg)
......
......@@ -1456,7 +1456,7 @@ static ir_node *equivalent_node_Phi(ir_node *n)
}
}
if (i >= n_preds) {
if (i >= n_preds && !is_Dummy(first_val)) {
/* Fold, if no multiple distinct non-self-referencing inputs */
n = first_val;
DBG_OPT_PHI(oldn, n);
......
......@@ -116,6 +116,8 @@ static ir_prog *complete_ir_prog(ir_prog *irp, const char *module_name)
irp->class_cast_state = ir_class_casts_transitive;
irp->globals_entity_usage_state = ir_entity_usage_not_computed;
current_ir_graph = irp->const_code_irg;
return irp;
#undef IDENT
}
......
......@@ -2092,8 +2092,8 @@ static void lower_Phi(ir_node *phi, ir_mode *mode, lower_env_t *env)
/* first create a new in array */
NEW_ARR_A(ir_node *, inl, arity);
NEW_ARR_A(ir_node *, inh, arity);
unk_l = new_r_Unknown(irg, mode_l);
unk_h = new_r_Unknown(irg, mode);
unk_l = new_r_Dummy(irg, mode_l);
unk_h = new_r_Dummy(irg, mode);
for (i = 0; i < arity; ++i) {
ir_node *pred = get_Phi_pred(phi, i);
......
......@@ -201,13 +201,14 @@ static ir_node *lower_node(ir_node *node)
case iro_Phi: {
int i, arity;
ir_node **in;
ir_node *unknown, *new_phi;
ir_node *dummy;
ir_node *new_phi;
arity = get_irn_arity(node);
in = ALLOCAN(ir_node*, arity);
unknown = new_r_Unknown(irg, mode);
dummy = new_r_Dummy(irg, mode);
for (i = 0; i < arity; ++i) {
in[i] = unknown;
in[i] = dummy;
}
new_phi = new_r_Phi(block, arity, in, mode);
/* FIXME This does not correctly break cycles: The Phi might not be the
......
......@@ -81,6 +81,7 @@ static ir_node *search_def_and_create_phis(ir_node *block, ir_mode *mode,
ir_graph *irg;
ir_node *phi;
ir_node **in;
ir_node *dummy;
/* This is needed because we create bads sometimes */
if (is_Bad(block)) {
......@@ -119,8 +120,9 @@ static ir_node *search_def_and_create_phis(ir_node *block, ir_mode *mode,
/* create a new Phi */
NEW_ARR_A(ir_node*, in, n_cfgpreds);
dummy = new_r_Dummy(irg, mode);
for (i = 0; i < n_cfgpreds; ++i)
in[i] = new_r_Unknown(irg, mode);
in[i] = dummy;
phi = new_r_Phi(block, n_cfgpreds, in, mode);
set_irn_link(block, phi);
......
......@@ -364,6 +364,7 @@ static ir_node *search_def_and_create_phis(ir_node *block, ir_mode *mode, int fi
ir_graph *irg;
ir_node *phi;
ir_node **in;
ir_node *dummy;
DB((dbg, LEVEL_5, "ssa search_def_and_create_phis: block %N\n", block));
......@@ -407,8 +408,9 @@ static ir_node *search_def_and_create_phis(ir_node *block, ir_mode *mode, int fi
/* create a new Phi */
NEW_ARR_A(ir_node*, in, n_cfgpreds);
dummy = new_r_Dummy(irg, mode);
for (i = 0; i < n_cfgpreds; ++i)
in[i] = new_r_Unknown(irg, mode);
in[i] = dummy;
phi = new_r_Phi(block, n_cfgpreds, in, mode);
/* Important: always keep block phi list up to date. */
......
......@@ -309,7 +309,7 @@ ir_node *new_rd_{{node.constrname}}(
{%- if node.optimize != False %}
res = optimize_node(res);
{%- endif %}
IRN_VERIFY_IRG(res, irg);
irn_verify_irg(res, irg);
return res;
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment