cfopt must maintain Bad structure
[libfirm] / ir / opt / ldstopt.c
index f69fbf6..6fd5f49 100644 (file)
@@ -215,7 +215,7 @@ static void collect_nodes(ir_node *node, void *env)
 
                        if (is_Proj(proj)) {
                                pred   = get_Proj_pred(proj);
-                               is_exc = get_Proj_proj(proj) == pn_Generic_X_except;
+                               is_exc = is_x_except_Proj(proj);
                        }
 
                        /* ignore Bad predecessors, they will be removed later */
@@ -913,7 +913,7 @@ static int try_load_after_store(ir_node *load,
        /* no exception */
        if (info->projs[pn_Load_X_except]) {
                ir_graph *irg = get_irn_irg(load);
-               exchange( info->projs[pn_Load_X_except], new_r_Bad(irg));
+               exchange( info->projs[pn_Load_X_except], new_r_Bad(irg, mode_X));
                res |= CF_CHANGED;
        }
        if (info->projs[pn_Load_X_regular]) {
@@ -1019,7 +1019,7 @@ static unsigned follow_Mem_chain(ir_node *load, ir_node *curr)
                                /* no exception */
                                if (info->projs[pn_Load_X_except]) {
                                        ir_graph *irg = get_irn_irg(load);
-                                       exchange(info->projs[pn_Load_X_except], new_r_Bad(irg));
+                                       exchange(info->projs[pn_Load_X_except], new_r_Bad(irg, mode_X));
                                        res |= CF_CHANGED;
                                }
                                if (info->projs[pn_Load_X_regular]) {
@@ -1156,7 +1156,7 @@ static unsigned optimize_load(ir_node *load)
                        /* no exception, clear the info field as it might be checked later again */
                        if (info->projs[pn_Load_X_except]) {
                                ir_graph *irg = get_irn_irg(load);
-                               exchange(info->projs[pn_Load_X_except], new_r_Bad(irg));
+                               exchange(info->projs[pn_Load_X_except], new_r_Bad(irg, mode_X));
                                info->projs[pn_Load_X_except] = NULL;
                                res |= CF_CHANGED;
                        }
@@ -1191,7 +1191,7 @@ static unsigned optimize_load(ir_node *load)
                /* we completely replace the load by this value */
                if (info->projs[pn_Load_X_except]) {
                        ir_graph *irg = get_irn_irg(load);
-                       exchange(info->projs[pn_Load_X_except], new_r_Bad(irg));
+                       exchange(info->projs[pn_Load_X_except], new_r_Bad(irg, mode_X));
                        info->projs[pn_Load_X_except] = NULL;
                        res |= CF_CHANGED;
                }
@@ -1480,7 +1480,10 @@ static unsigned optimize_store(ir_node *store)
 static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv)
 {
        int i, n;
-       ir_node *store, *old_store, *ptr, *block, *phi_block, *phiM, *phiD, *exc, *projM;
+       ir_node *store, *ptr, *block, *phi_block, *phiM, *phiD, *exc, *projM;
+#ifdef DO_CACHEOPT
+       ir_node *old_store;
+#endif
        ir_mode *mode;
        ir_node **inM, **inD, **projMs;
        int *idx;
@@ -1503,16 +1506,14 @@ static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv)
                return 0;
 
        store = skip_Proj(projM);
+#ifdef DO_CACHEOPT
        old_store = store;
+#endif
        if (!is_Store(store))
                return 0;
 
        block = get_nodes_block(store);
 
-       /* abort on dead blocks */
-       if (is_Block_dead(block))
-               return 0;
-
        /* check if the block is post dominated by Phi-block
           and has no exception exit */
        bl_info = (block_info_t*)get_irn_link(block);
@@ -1548,10 +1549,7 @@ static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv)
                if (exc != info->exc_block)
                        return 0;
 
-               /* abort on dead blocks */
                block = get_nodes_block(pred);
-               if (is_Block_dead(block))
-                       return 0;
 
                /* check if the block is post dominated by Phi-block
                   and has no exception exit. Note that block must be different from
@@ -1821,7 +1819,6 @@ static unsigned hash_cache_entry(const avail_entry_t *entry)
 static void move_loads_out_of_loops(scc *pscc, loop_env *env)
 {
        ir_node   *phi, *load, *next, *other, *next_other;
-       ir_entity *ent;
        int       j;
        phi_entry *phi_list = NULL;
        set       *avail;
@@ -1877,7 +1874,6 @@ static void move_loads_out_of_loops(scc *pscc, loop_env *env)
                        /* for now, we can only move Load(Global) */
                        if (! is_Global(ptr))
                                continue;
-                       ent       = get_Global_entity(ptr);
                        load_mode = get_Load_mode(load);
                        for (other = pscc->head; other != NULL; other = next_other) {
                                node_entry *ne = get_irn_ne(other, env);
@@ -1926,7 +1922,12 @@ static void move_loads_out_of_loops(scc *pscc, loop_env *env)
                                        ninfo = get_ldst_info(irn, phase_obst(&env->ph));
 
                                        ninfo->projs[pn_Load_M] = mem = new_r_Proj(irn, mode_M, pn_Load_M);
-                                       set_Phi_pred(phi, pos, mem);
+                                       if (res == NULL) {
+                                               /* irn is from cache, so do not set phi pred again.
+                                                * There might be other Loads between phi and irn already.
+                                                */
+                                               set_Phi_pred(phi, pos, mem);
+                                       }
 
                                        ninfo->projs[pn_Load_res] = new_r_Proj(irn, load_mode, pn_Load_res);
                                }
@@ -2285,8 +2286,8 @@ int optimize_load_store(ir_graph *irg)
 
        /* Handle graph state */
        if (env.changes) {
-               set_irg_outs_inconsistent(irg);
                set_irg_entity_usage_state(irg, ir_entity_usage_not_computed);
+               edges_deactivate(irg);
        }
 
        if (env.changes & CF_CHANGED) {