slight bugfix
[libfirm] / ir / be / belower.c
index 67201f0..89a6a0d 100644 (file)
@@ -36,7 +36,7 @@
 #endif
 
 #undef is_Perm
-#define is_Perm(arch_env, irn) (arch_irn_classify(arch_env, irn) == arch_irn_class_perm)
+#define is_Perm(arch_env, irn) (arch_irn_class_is(arch_env, irn, perm))
 
 /* associates op with it's copy and CopyKeep */
 typedef struct {
@@ -269,8 +269,9 @@ static void lower_perm_node(ir_node *irn, void *walk_env) {
        const arch_register_class_t *reg_class;
        const arch_env_t            *arch_env;
        lower_env_t     *env         = walk_env;
-       int              real_size   = 0;
-       int              n, i, pn, do_copy, j, n_ops;
+       int             real_size    = 0;
+       int             keep_perm    = 0;
+       int             n, i, pn, do_copy, j, n_ops;
        reg_pair_t      *pairs;
        const ir_edge_t *edge;
        perm_cycle_t    *cycle;
@@ -365,11 +366,14 @@ static void lower_perm_node(ir_node *irn, void *walk_env) {
                }
                DB((mod, LEVEL_1, "\n"));
 
-               /* We don't need to do anything if we have a Perm with two
+               /*
+                       We don't need to do anything if we have a Perm with two
                        elements which represents a cycle, because those nodes
-                       already represent exchange nodes */
+                       already represent exchange nodes
+               */
                if (n == 2 && cycle->type == PERM_CYCLE) {
                        free(cycle);
+                       keep_perm = 1;
                        continue;
                }
 
@@ -493,10 +497,9 @@ static void lower_perm_node(ir_node *irn, void *walk_env) {
                free(cycle);
        }
 
-
-
        /* remove the perm from schedule */
-       sched_remove(irn);
+       if (! keep_perm)
+               sched_remove(irn);
 }