Treat conversions between the same size as downconv to get rid of unnecessary convers...
[libfirm] / ir / lower / lower_dw.c
index c8bceeb..d516b31 100644 (file)
@@ -57,6 +57,7 @@
 #include "pmap.h"
 #include "pdeq.h"
 #include "irdump.h"
+#include "array_t.h"
 #include "xmalloc.h"
 
 /** A map from mode to a primitive type. */
@@ -998,24 +999,25 @@ static void lower_Shrs(ir_node *node, ir_mode *mode, lower_env_t *env) {
 
                if (tarval_is_long(tv) &&
                    get_tarval_long(tv) >= (long)get_mode_size_bits(mode)) {
-                       ir_node *block = get_nodes_block(node);
-                       ir_node *left = get_Shrs_left(node);
-                       long shf_cnt = get_tarval_long(tv) - get_mode_size_bits(mode);
+                       ir_node *block   = get_nodes_block(node);
+                       ir_node *left    = get_Shrs_left(node);
+                       long     shf_cnt = get_tarval_long(tv) - get_mode_size_bits(mode);
+                       int      idx     = get_irn_idx(left);
+                       ir_node *low;
                        ir_node *c;
-                       int idx = get_irn_idx(left);
 
                        left = env->entries[idx]->high_word;
                        idx = get_irn_idx(node);
 
                        if (shf_cnt > 0) {
-                               ir_node *tmp;
-                               c = new_r_Const_long(irg, block, mode_Iu, shf_cnt);
-                               tmp = new_r_Shrs(irg, block, left, c, mode);
-                               /* low word is expected to have mode_Iu */
-                               env->entries[idx]->low_word = new_r_Conv(irg, block, tmp, mode_Iu);
+                               c   = new_r_Const_long(irg, block, mode_Iu, shf_cnt);
+                               low = new_r_Shrs(irg, block, left, c, mode);
                        } else {
-                               env->entries[idx]->low_word = left;
+                               low = left;
                        }  /* if */
+                       /* low word is expected to have mode_Iu */
+                       env->entries[idx]->low_word = new_r_Conv(irg, block, low, mode_Iu);
+
                        c = new_r_Const_long(irg, block, mode_Iu, get_mode_size_bits(mode) - 1);
                        env->entries[idx]->high_word = new_r_Shrs(irg, block, left, c, mode);
 
@@ -1092,6 +1094,8 @@ static void lower_Rotl(ir_node *node, ir_mode *mode, lower_env_t *env) {
        ir_node *left = get_Rotl_left(node);
        ir_node *h, *l;
        int idx = get_irn_idx(left);
+       (void) right;
+       (void) mode;
 
        assert(get_mode_arithmetic(mode) == irma_twos_complement &&
               is_Const(right) && tarval_is_long(get_Const_tarval(right)) &&