X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fopt%2Fldstopt.c;h=412686f3acd5312b7659d7dd99f2e30d1b71f074;hb=2198e37181132ff7ab566c94970c41e8c6b273c5;hp=d8cd2d3b69578cf645f411909671dc82f50521dc;hpb=8a98cf06c4fb193ea8025a6dfcdbe161187d143f;p=libfirm diff --git a/ir/opt/ldstopt.c b/ir/opt/ldstopt.c index d8cd2d3b6..412686f3a 100644 --- a/ir/opt/ldstopt.c +++ b/ir/opt/ldstopt.c @@ -35,6 +35,7 @@ #include "ircons_t.h" #include "irgmod.h" #include "irgwalk.h" +#include "irtools.h" #include "tv_t.h" #include "dbginfo_t.h" #include "iropt_dbg.h" @@ -45,7 +46,7 @@ #include "irpass.h" #include "opt_polymorphy.h" #include "irmemory.h" -#include "irphase_t.h" +#include "irnodehashmap.h" #include "irgopt.h" #include "set.h" #include "be.h" @@ -781,8 +782,8 @@ static unsigned is_Call_pure(ir_node *call) /* try the called entity */ ir_node *ptr = get_Call_ptr(call); - if (is_Global(ptr)) { - ir_entity *ent = get_Global_entity(ptr); + if (is_SymConst_addr_ent(ptr)) { + ir_entity *ent = get_SymConst_entity(ptr); prop = get_entity_additional_properties(ent); } @@ -1713,13 +1714,14 @@ typedef struct node_entry { /** A loop entry. */ typedef struct loop_env { - ir_phase ph; /**< the phase object */ - ir_node **stack; /**< the node stack */ - size_t tos; /**< tos index */ - unsigned nextDFSnum; /**< the current DFS number */ - unsigned POnum; /**< current post order number */ - - unsigned changes; /**< a bitmask of graph changes */ + ir_nodehashmap_t map; + struct obstack obst; + ir_node **stack; /**< the node stack */ + size_t tos; /**< tos index */ + unsigned nextDFSnum; /**< the current DFS number */ + unsigned POnum; /**< current post order number */ + + unsigned changes; /**< a bitmask of graph changes */ } loop_env; /** @@ -1727,13 +1729,12 @@ typedef struct loop_env { */ static node_entry *get_irn_ne(ir_node *irn, loop_env *env) { - ir_phase *ph = &env->ph; - node_entry *e = (node_entry*)phase_get_irn_data(&env->ph, irn); + node_entry *e = (node_entry*)ir_nodehashmap_get(&env->map, irn); - if (! e) { - e = (node_entry*)phase_alloc(ph, sizeof(*e)); + if (e == NULL) { + e = OALLOC(&env->obst, node_entry); memset(e, 0, sizeof(*e)); - phase_set_irn_data(ph, irn, e); + ir_nodehashmap_insert(&env->map, irn, e); } return e; } /* get_irn_ne */ @@ -1856,7 +1857,7 @@ static void move_loads_out_of_loops(scc *pscc, loop_env *env) if (pe->pscc != ne->pscc) { /* not in the same SCC, is region const */ - phi_entry *pe = (phi_entry*)phase_alloc(&env->ph, sizeof(*pe)); + phi_entry *pe = OALLOC(&env->obst, phi_entry); pe->phi = phi; pe->pos = j; @@ -1886,7 +1887,7 @@ static void move_loads_out_of_loops(scc *pscc, loop_env *env) continue; /* for now, we can only move Load(Global) */ - if (! is_Global(ptr)) + if (! is_SymConst_addr_ent(ptr)) continue; load_mode = get_Load_mode(load); for (other = pscc->head; other != NULL; other = next_other) { @@ -1933,7 +1934,7 @@ static void move_loads_out_of_loops(scc *pscc, loop_env *env) DB((dbg, LEVEL_1, " Created %+F in %+F\n", irn, pred)); } pe->load = irn; - ninfo = get_ldst_info(irn, phase_obst(&env->ph)); + ninfo = get_ldst_info(irn, &env->obst); ninfo->projs[pn_Load_M] = mem = new_r_Proj(irn, mode_M, pn_Load_M); if (res == NULL) { @@ -2173,7 +2174,7 @@ static void dfs(ir_node *irn, loop_env *env) } if (node->low == node->DFSnum) { - scc *pscc = (scc*)phase_alloc(&env->ph, sizeof(*pscc)); + scc *pscc = OALLOC(&env->obst, scc); ir_node *x; pscc->head = NULL; @@ -2247,13 +2248,15 @@ static int optimize_loops(ir_graph *irg) env.nextDFSnum = 0; env.POnum = 0; env.changes = 0; - phase_init(&env.ph, irg, phase_irn_init_default); + ir_nodehashmap_init(&env.map); + obstack_init(&env.obst); /* calculate the SCC's and drive loop optimization. */ do_dfs(irg, &env); DEL_ARR_F(env.stack); - phase_deinit(&env.ph); + obstack_free(&env.obst, NULL); + ir_nodehashmap_destroy(&env.map); return env.changes; } /* optimize_loops */ @@ -2292,23 +2295,19 @@ static ir_graph_state_t do_loadstore_opt(ir_graph *irg) /* Handle graph state */ if (env.changes) { - set_irg_entity_usage_state(irg, ir_entity_usage_not_computed); edges_deactivate(irg); } - if (env.changes & CF_CHANGED) { - /* control flow changed, block might have Bad() predecessors. */ - set_irg_doms_inconsistent(irg); - } else { - res |= IR_GRAPH_STATE_CONSISTENT_DOMINANCE | IR_GRAPH_STATE_NO_BAD_BLOCKS; + if (!(env.changes & CF_CHANGED)) { + res |= IR_GRAPH_STATE_CONSISTENT_DOMINANCE | IR_GRAPH_STATE_NO_BADS; } return res; } -optdesc_t opt_loadstore = { +static optdesc_t opt_loadstore = { "load-store", - IR_GRAPH_STATE_NO_UNREACHABLE_BLOCKS | IR_GRAPH_STATE_CONSISTENT_OUT_EDGES | IR_GRAPH_STATE_NO_CRITICAL_EDGES | IR_GRAPH_STATE_CONSISTENT_DOMINANCE | IR_GRAPH_STATE_CONSISTENT_ENTITY_USAGE, + IR_GRAPH_STATE_NO_UNREACHABLE_CODE | IR_GRAPH_STATE_CONSISTENT_OUT_EDGES | IR_GRAPH_STATE_NO_CRITICAL_EDGES | IR_GRAPH_STATE_CONSISTENT_DOMINANCE | IR_GRAPH_STATE_CONSISTENT_ENTITY_USAGE, do_loadstore_opt, };