Added test case for pbqp construction: There seems to be missing skip patterns, so...
[libfirm] / ir / be / ia32 / ia32_optimize.c
index fe0525a..ce3e949 100644 (file)
@@ -97,17 +97,17 @@ static int produces_zero_flag(ir_node *node, int pn)
 
        case iro_ia32_ShlD:
        case iro_ia32_ShrD:
+               assert(n_ia32_ShlD_count == n_ia32_ShrD_count);
+               count = get_irn_n(node, n_ia32_ShlD_count);
+               goto check_shift_amount;
+
        case iro_ia32_Shl:
        case iro_ia32_Shr:
        case iro_ia32_Sar:
-               assert(n_ia32_ShlD_count == n_ia32_ShrD_count);
                assert(n_ia32_Shl_count == n_ia32_Shr_count
                                && n_ia32_Shl_count == n_ia32_Sar_count);
-               if (is_ia32_ShlD(node) || is_ia32_ShrD(node)) {
-                       count = get_irn_n(node, n_ia32_ShlD_count);
-               } else {
-                       count = get_irn_n(node, n_ia32_Shl_count);
-               }
+               count = get_irn_n(node, n_ia32_Shl_count);
+check_shift_amount:
                /* when shift count is zero the flags are not affected, so we can only
                 * do this for constants != 0 */
                if (!is_ia32_Immediate(count))
@@ -331,9 +331,7 @@ static void peephole_ia32_Return(ir_node *node) {
                }
        }
 
-       /* ensure, that the 3 byte return is generated
-        * actually the emitter tests again if the block beginning has a label and
-        * isn't just a fallthrough */
+       /* ensure, that the 3 byte return is generated */
        be_Return_set_emit_pop(node, 1);
 }
 
@@ -515,7 +513,6 @@ static void peephole_Load_IncSP_to_pop(ir_node *irn)
        maxslot = -1;
        pred_sp = be_get_IncSP_pred(irn);
        for (node = sched_prev(irn); !sched_is_end(node); node = sched_prev(node)) {
-               ir_node *mem;
                int offset;
                int loadslot;
                const arch_register_t *sreg, *dreg;
@@ -554,10 +551,6 @@ static void peephole_Load_IncSP_to_pop(ir_node *irn)
                         * but we do not check this */
                        break;
                }
-               /* Load has to be attached to Spill-Mem */
-               mem = skip_Proj(get_irn_n(node, n_ia32_mem));
-               if (!is_Phi(mem) && !is_ia32_Store(mem) && !is_ia32_Push(mem))
-                       break;
 
                /* should have NO index */
                if (!is_ia32_NoReg_GP(get_irn_n(node, n_ia32_index)))