fixed debug output of unary x87 nodes
[libfirm] / ir / be / ia32 / ia32_optimize.c
index ba160ad..46d529a 100644 (file)
@@ -1041,6 +1041,7 @@ static ir_node *fold_addr(ia32_code_gen_t *cg, ir_node *irn, ir_node *noreg) {
        entity     *lea_ent    = NULL;
        ir_node    *left, *right, *temp;
        ir_node    *base, *index;
+       int consumed_left_shift;
        ia32_am_flavour_t am_flav;
        DEBUG_ONLY(firm_dbg_module_t *mod = cg->mod;)
 
@@ -1126,8 +1127,9 @@ static ir_node *fold_addr(ia32_code_gen_t *cg, ir_node *irn, ir_node *noreg) {
 
        if (isadd) {
                /* default for add -> make right operand to index */
-               index = right;
-               dolea = 1;
+               index               = right;
+               dolea               = 1;
+               consumed_left_shift = -1;
 
                DBG((mod, LEVEL_1, "\tgot LEA candidate with index %+F\n", index));
 
@@ -1135,6 +1137,7 @@ static ir_node *fold_addr(ia32_code_gen_t *cg, ir_node *irn, ir_node *noreg) {
                temp = left;
                if (is_ia32_Lea(left)) {
                        temp = right;
+                       consumed_left_shift = 0;
                }
 
                /* check for SHL 1,2,3 */
@@ -1146,7 +1149,8 @@ static ir_node *fold_addr(ia32_code_gen_t *cg, ir_node *irn, ir_node *noreg) {
                                scale = get_tarval_long(get_ia32_Immop_tarval(temp));
 
                                if (scale <= 3) {
-                                       index = get_irn_n(temp, 2);
+                                       index               = get_irn_n(temp, 2);
+                                       consumed_left_shift = consumed_left_shift < 0 ? 1 : 0;
 
                                        DBG((mod, LEVEL_1, "\tgot scaled index %+F\n", index));
                                }
@@ -1163,10 +1167,8 @@ static ir_node *fold_addr(ia32_code_gen_t *cg, ir_node *irn, ir_node *noreg) {
                        if (left == right) {
                                base = noreg;
                        }
-                       else if (! is_ia32_Lea(left) && (index != right)) {
-                               /* index != right -> we found a good Shl           */
-                               /* left  != LEA   -> this Shl was the left operand */
-                               /* -> base is right operand                        */
+                       else if (consumed_left_shift == 1) {
+                               /* -> base is right operand  */
                                base = (right == lea_o) ? noreg : right;
                        }
                }