#include "irnode_t.h"
#include "irgwalk.h"
+/** Note: start and finish must use the same kind of walker */
+static void (*ssa_cons_walker)(ir_graph *, irg_walk_func *, irg_walk_func *, void *)
+ = irg_block_walk_graph;
+
/**
- * Post-walker: prepare the graph nodes for new SSA construction cycle by allocation
- * new arrays.
+ * Post-walker: prepare the graph nodes for new SSA construction cycle by
+ * allocation new arrays.
*/
-static void prepare_nodes(ir_node *irn, void *env) {
- (void)env;
-
- switch (get_irn_opcode(irn)) {
- case iro_Block:
- /* reset mature flag */
- irn->attr.block.is_matured = 0;
- irn->attr.block.graph_arr = NEW_ARR_D(ir_node *, current_ir_graph->obst,
- current_ir_graph->n_loc);
- memset(irn->attr.block.graph_arr, 0, sizeof(ir_node *) * current_ir_graph->n_loc);
- irn->attr.block.phis = NULL;
- break;
-#if PRECISE_EXC_CONTEXT
- /* note that the frag array must be cleared first, else firm_alloc_frag_arr()
- will not allocate new memory. */
- case iro_Quot:
- irn->attr.except.frag_arr = NULL;
- firm_alloc_frag_arr(irn, op_Quot, &irn->attr.except.frag_arr);
- break;
- case iro_DivMod:
- irn->attr.except.frag_arr = NULL;
- firm_alloc_frag_arr(irn, op_DivMod, &irn->attr.except.frag_arr);
- break;
- case iro_Div:
- irn->attr.except.frag_arr = NULL;
- firm_alloc_frag_arr(irn, op_Div, &irn->attr.except.frag_arr);
- break;
- case iro_Mod:
- irn->attr.except.frag_arr = NULL;
- firm_alloc_frag_arr(irn, op_Mod, &irn->attr.except.frag_arr);
- break;
- case iro_Call:
- irn->attr.call.exc.frag_arr = NULL;
- firm_alloc_frag_arr(irn, op_Call, &irn->attr.call.exc.frag_arr);
- break;
- case iro_Load:
- irn->attr.load.exc.frag_arr = NULL;
- firm_alloc_frag_arr(irn, op_Load, &irn->attr.load.exc.frag_arr);
- break;
- case iro_Store:
- irn->attr.store.exc.frag_arr = NULL;
- firm_alloc_frag_arr(irn, op_Store, &irn->attr.store.exc.frag_arr);
- break;
- case iro_Alloc:
- irn->attr.alloc.exc.frag_arr = NULL;
- firm_alloc_frag_arr(irn, op_Alloc, &irn->attr.alloc.exc.frag_arr);
- break;
- case iro_CopyB:
- irn->attr.copyb.exc.frag_arr = NULL;
- firm_alloc_frag_arr(irn, op_CopyB, &irn->attr.copyb.exc.frag_arr);
- break;
- case iro_Raise:
- irn->attr.bound.exc.frag_arr = NULL;
- firm_alloc_frag_arr(irn, op_Bound, &irn->attr.bound.exc.frag_arr);
- break;
-#endif
- default:
- ;
- }
+static void prepare_blocks(ir_node *block, void *env)
+{
+ unsigned n_loc = current_ir_graph->n_loc;
+ struct obstack *obst = current_ir_graph->obst;
+ (void)env;
+ /* reset mature flag */
+ set_Block_matured(block, 0);
+ block->attr.block.graph_arr = NEW_ARR_D(ir_node *, obst, n_loc);
+ memset(block->attr.block.graph_arr, 0, sizeof(ir_node*) * n_loc);
+ set_Block_phis(block, NULL);
}
/*
* again and set_value()/get_value() and mature_block() can be used
* to construct new values.
*/
-void ssa_cons_start(ir_graph *irg, int n_loc) {
+void ssa_cons_start(ir_graph *irg, int n_loc)
+{
/* for now we support only phase_high graphs */
assert(irg->phase_state == phase_high);
* seems worth to do this. First, we have to check if they really exists and
* then clear them. We do not expect SSA construction is used often.
*/
- irg_walk_graph(irg, NULL, prepare_nodes, NULL);
+ ssa_cons_walker(irg, NULL, prepare_blocks, NULL);
}
/**
* mature all immature Blocks.
*/
-static void finish_block(ir_node *block, void *env) {
+static void finish_block(ir_node *block, void *env)
+{
(void)env;
if (!get_Block_matured(block))
* Finalize the (restarted) SSA construction. Matures all blocks that are
* not matured yet and reset the graph state to phase_high.
*/
-void ssa_cons_finish(ir_graph *irg) {
- irg_block_walk_graph(irg, NULL, finish_block, NULL);
+void ssa_cons_finish(ir_graph *irg)
+{
+ ssa_cons_walker(irg, NULL, finish_block, NULL);
irg_finalize_cons(irg);
}