Do not mark the transformed as visited. It makes no sense at all.
[libfirm] / ir / be / bespillbelady.c
index 12f84ce..ffb44f2 100644 (file)
@@ -593,7 +593,7 @@ static void decide_start_workset(const ir_node *block)
                loc = to_take_or_not_to_take(first, node, loop, available);
 
                if (! USES_IS_INFINITE(loc.time)) {
-                       if (USES_IS_PENDING(loc.time) && !all_preds_known)
+                       if (USES_IS_PENDING(loc.time))
                                ARR_APP1(loc_t, delayed, loc);
                        else
                                ARR_APP1(loc_t, starters, loc);
@@ -616,7 +616,7 @@ static void decide_start_workset(const ir_node *block)
                loc = to_take_or_not_to_take(first, node, loop, available);
 
                if (! USES_IS_INFINITE(loc.time)) {
-                       if (USES_IS_PENDING(loc.time) && !all_preds_known)
+                       if (USES_IS_PENDING(loc.time))
                                ARR_APP1(loc_t, delayed, loc);
                        else
                                ARR_APP1(loc_t, starters, loc);
@@ -638,35 +638,35 @@ static void decide_start_workset(const ir_node *block)
                qsort(delayed, ARR_LEN(delayed), sizeof(delayed[0]), loc_compare);
 
                for (i = 0; i < ARR_LEN(delayed) && free_slots > 0; ++i) {
-                       //int    p, arity;
+                       int    p, arity;
                        loc_t *loc = & delayed[i];
 
-#if 0
-                       /* don't use values which are dead in a known predecessors
-                        * to not induce unnecessary reloads */
-                       arity = get_irn_arity(block);
-                       for (p = 0; p < arity; ++p) {
-                               ir_node      *pred_block = get_Block_cfgpred_block(block, p);
-                               block_info_t *pred_info  = get_block_info(pred_block);
-
-                               if (pred_info == NULL)
-                                       continue;
-
-                               if (!workset_contains(pred_info->end_workset, loc->node)) {
-                                       DB((dbg, DBG_START,
-                                               "    delayed %+F not live at pred %+F\n", loc->node,
-                                               pred_block));
-                                       goto skip_delayed;
+                       if (!is_Phi(loc->node)) {
+                               /* don't use values which are dead in a known predecessors
+                                * to not induce unnecessary reloads */
+                               arity = get_irn_arity(block);
+                               for (p = 0; p < arity; ++p) {
+                                       ir_node      *pred_block = get_Block_cfgpred_block(block, p);
+                                       block_info_t *pred_info  = get_block_info(pred_block);
+
+                                       if (pred_info == NULL)
+                                               continue;
+
+                                       if (!workset_contains(pred_info->end_workset, loc->node)) {
+                                               DB((dbg, DBG_START,
+                                                       "    delayed %+F not live at pred %+F\n", loc->node,
+                                                       pred_block));
+                                               goto skip_delayed;
+                                       }
                                }
                        }
-#endif
 
                        DB((dbg, DBG_START, "    delayed %+F taken\n", loc->node));
                        ARR_APP1(loc_t, starters, *loc);
                        loc->node = NULL;
                        --free_slots;
-//             skip_delayed:
-//                     ;
+               skip_delayed:
+                       ;
                }
        }