Added support for SymConst(ofs_ent)
[libfirm] / ir / be / belower.c
index 89a6a0d..0ff5504 100644 (file)
@@ -23,6 +23,7 @@
 #include "bechordal_t.h"
 #include "besched_t.h"
 #include "bestat.h"
+#include "benodesets.h"
 
 #include "irgmod.h"
 #include "iredges_t.h"
@@ -337,6 +338,7 @@ static void lower_perm_node(ir_node *irn, void *walk_env) {
 
                        /* reroute the edges from the proj to the argument */
                        edges_reroute(pairs[i].out_node, pairs[i].in_node, env->chord_env->irg);
+                       set_irn_n(pairs[i].out_node, 0, new_Bad());
 
                        pairs[i].checked = 1;
                }
@@ -498,8 +500,13 @@ static void lower_perm_node(ir_node *irn, void *walk_env) {
        }
 
        /* remove the perm from schedule */
-       if (! keep_perm)
+       if (! keep_perm) {
+               int arity = get_irn_arity(irn);
+               for(i = 0; i < arity; ++i) {
+                       set_irn_n(irn, i, new_Bad());
+               }
                sched_remove(irn);
+       }
 }
 
 
@@ -568,7 +575,7 @@ static void gen_assure_different_pattern(ir_node *irn, ir_node *other_different,
        /* insert the other different and it's copies into the set */
        key.op         = other_different;
        key.copies     = NULL;
-       entry          = pset_find(op_set, &key, HASH_PTR(other_different));
+       entry          = pset_find(op_set, &key, nodeset_hash(other_different));
 
        if (! entry) {
                entry         = obstack_alloc(&env->obst, sizeof(*entry));
@@ -583,7 +590,7 @@ static void gen_assure_different_pattern(ir_node *irn, ir_node *other_different,
        if (be_is_CopyKeep(keep))
                pset_insert_ptr(entry->copies, keep);
 
-       pset_insert(op_set, entry, HASH_PTR(other_different));
+       pset_insert(op_set, entry, nodeset_hash(other_different));
 
        DBG((mod, LEVEL_1, "created %+F for %+F to assure should_be_different\n", keep, irn));
 }
@@ -687,11 +694,11 @@ void assure_constraints(be_irg_t *birg) {
                                keep = be_new_Keep(arch_get_irn_reg_class(birg->main_env->arch_env, cp, -1),
                                        birg->irg, get_nodes_block(cp), n, (ir_node **)&get_irn_in(cp)[1]);
                                sched_add_before(cp, keep);
-                               sched_remove(cp);
 
                                /* Set all ins (including the block) of the CopyKeep BAD to keep the verifier happy. */
                                while (--n >= -1)
-                                       set_irn_n(cp, n, get_irg_bad(birg->irg));
+                                       set_irn_n(cp, n, new_Bad());
+                               sched_remove(cp);
                        }
                }