From fbddf0fabc65af802bdfd62eac66ed575b4e4057 Mon Sep 17 00:00:00 2001 From: Adam Szalkowski Date: Tue, 5 Sep 2006 20:30:43 +0000 Subject: [PATCH] fixed studd to make it run again after matze's commit --- ir/be/arm/arm_emitter.c | 2 +- ir/be/bemain.c | 4 +- ir/be/beprofile.c | 81 +++++++++++++++++++++++++++++++------- ir/be/ppc32/bearch_ppc32.c | 2 +- 4 files changed, 71 insertions(+), 18 deletions(-) diff --git a/ir/be/arm/arm_emitter.c b/ir/be/arm/arm_emitter.c index 540595d33..e213e8139 100644 --- a/ir/be/arm/arm_emitter.c +++ b/ir/be/arm/arm_emitter.c @@ -959,7 +959,7 @@ void arm_gen_routine(FILE *F, ir_graph *irg, const arm_code_gen_t *cg) { arm_register_emitters(); /* create the block schedule. For now, we don't need it earlier. */ - blk_sched = sched_create_block_schedule(cg->irg); + blk_sched = sched_create_block_schedule(cg->irg, cg->birg->execfreqs); arm_emit_start(F, irg); irg_block_walk_graph(irg, arm_gen_labels, NULL, &emit_env); diff --git a/ir/be/bemain.c b/ir/be/bemain.c index aa2ce9a91..bce8e07c3 100644 --- a/ir/be/bemain.c +++ b/ir/be/bemain.c @@ -355,8 +355,6 @@ static void initialize_birg(be_irg_t *birg, ir_graph *irg, be_main_env_t *env) /* Make just one return node. */ normalize_one_return(irg); - optimize_cf(irg); - /* Remove critical edges */ remove_critical_cf_edges(irg); @@ -470,6 +468,8 @@ static void be_main_loop(FILE *file_handle) ir_graph *irg = get_irp_irg(i); initialize_birg(&birgs[i], irg, &env); + edges_deactivate(irg); + edges_activate(irg); } /* please FIXME! I'm a dirty hack. */ diff --git a/ir/be/beprofile.c b/ir/be/beprofile.c index 0bdcd9ad6..03bf6bdf2 100644 --- a/ir/be/beprofile.c +++ b/ir/be/beprofile.c @@ -100,25 +100,61 @@ static void instrument_block(ir_node * bb, ir_node * address, unsigned int id) { ir_graph *irg = get_irn_irg(bb); - ir_node *start_block = get_irg_start_block(irg); - ir_node *load, *store, *offset, *add, *projm, *proji; - ir_node *cnst; + ir_node *start_block = get_irg_start_block(irg); + ir_node *load, *store, *offset, *add, *projm, *proji, *unknown; + ir_node *cnst; if(bb == start_block || bb == get_irg_end_block(irg)) return; - cnst = new_r_Const_long(irg, start_block, mode_Iu, get_mode_size_bytes(mode_Iu) * id); - offset = new_r_Add(irg, bb, address, cnst, mode_P); - load = new_r_Load(irg, bb, new_NoMem(), offset, mode_Iu); - projm = new_r_Proj(irg, bb, load, mode_M, pn_Load_M); - proji = new_r_Proj(irg, bb, load, mode_Iu, pn_Load_res); - cnst = new_r_Const_long(irg, start_block, mode_Iu, 1); - add = new_r_Add(irg, bb, proji, cnst, mode_Iu); - store = new_r_Store(irg, bb, projm, offset, add); - projm = new_r_Proj(irg, bb, store, mode_M, pn_Store_M); - keep_alive(projm); + unknown = new_r_Unknown(irg, mode_M); + cnst = new_r_Const_long(irg, start_block, mode_Iu, get_mode_size_bytes(mode_Iu) * id); + offset = new_r_Add(irg, bb, address, cnst, mode_P); + load = new_r_Load(irg, bb, unknown, offset, mode_Iu); + projm = new_r_Proj(irg, bb, load, mode_M, pn_Load_M); + proji = new_r_Proj(irg, bb, load, mode_Iu, pn_Load_res); + cnst = new_r_Const_long(irg, start_block, mode_Iu, 1); + add = new_r_Add(irg, bb, proji, cnst, mode_Iu); + store = new_r_Store(irg, bb, projm, offset, add); + projm = new_r_Proj(irg, bb, store, mode_M, pn_Store_M); + set_irn_link(bb, projm); + set_irn_link(projm, load); } +/** + * SSA Construction for instumenation code memory + */ +static void +fix_ssa(ir_node * bb, void * data) +{ + ir_node *mem; + int arity = get_Block_n_cfgpreds(bb); + + /* start and end block are not instrumented, skip! */ + if(bb == get_irg_end_block(current_ir_graph) || bb == get_irg_start_block(current_ir_graph)) + return; + + /* first block gets NoMem */ + if(get_Block_cfgpred_block(bb, 0) == get_irg_start_block(current_ir_graph)) { + mem = new_NoMem(); + } else { + if(arity == 1) { + mem = get_irn_link(get_Block_cfgpred_block(bb, 0)); + } else { + int n; + ir_node **ins; + + NEW_ARR_A(ir_node*, ins, arity); + for(n=arity-1; n>=0; --n) { + ins[n]=get_irn_link(get_Block_cfgpred_block(bb, n)); + } + mem = new_r_Phi(get_irn_irg(bb), bb, arity, ins, mode_M); + } + } + set_Load_mem(get_irn_link(get_irn_link(bb)), mem); +} + + /** * Generates a new irg which calls the initializer */ @@ -258,13 +294,30 @@ be_profile_instrument(char * filename) wd.array = tarval_array; wd.id = 0; for (n = get_irp_n_irgs() - 1; n >= 0; --n) { - ir_graph *irg = get_irp_irg(n); + ir_graph *irg = get_irp_irg(n); + int i; + ir_node *endbb = get_irg_end_block(irg); + + set_current_ir_graph(irg); /* generate a symbolic constant pointing to the count array */ sym.entity_p = bblock_counts; wd.symconst = new_r_SymConst(irg, get_irg_start_block(irg), sym, symconst_addr_ent); irg_block_walk_graph(irg, block_id_walker, NULL, &wd); + irg_block_walk_graph(irg, fix_ssa, NULL, NULL); + for(i=get_Block_n_cfgpreds(endbb)-1; i>=0; --i) { + ir_node *ret = get_Block_cfgpred(endbb, i); + ir_node *bb = get_Block_cfgpred_block(endbb, i); + ir_node *sync; + ir_node *ins[2]; + + ins[0] = get_irn_link(bb); + ins[1] = get_Return_mem(ret); + sync = new_r_Sync(irg, bb, 2, ins); + + set_Return_mem(ret, sync); + } } set_array_entity_values(bblock_id, tarval_array, n_blocks); diff --git a/ir/be/ppc32/bearch_ppc32.c b/ir/be/ppc32/bearch_ppc32.c index 20a4d4ede..6dd6b78b9 100644 --- a/ir/be/ppc32/bearch_ppc32.c +++ b/ir/be/ppc32/bearch_ppc32.c @@ -470,7 +470,7 @@ static void ppc32_before_sched(void *self) { */ static void ppc32_before_ra(void *self) { ppc32_code_gen_t *cg = self; - cg->blk_sched = sched_create_block_schedule(cg->irg); + cg->blk_sched = sched_create_block_schedule(cg->irg, cg->birg->execfreqs); } static void ppc32_transform_spill(ir_node *node, void *env) -- 2.20.1