Make warning about registers assigned to Phi inputs more clear.
[libfirm] / ir / be / bespillbelady.c
index 137786f..203edf2 100644 (file)
@@ -377,6 +377,8 @@ static void displace(workset_t *new_vals, int is_usage)
 #ifdef PLACE_SPILLS
                        if (!USES_IS_INFINITE(ws->vals[i].time) && !ws->vals[i].spilled) {
                                ir_node *after_pos = sched_prev(instr);
+                               DB((dbg, DBG_DECIDE, "Spill %+F after node %+F\n", val,
+                                   after_pos));
                                be_add_spill(senv, val, after_pos);
                        }
 #endif
@@ -497,9 +499,6 @@ static loc_t to_take_or_not_to_take(ir_node* first, ir_node *node,
                assert(is_Phi(node));
                loc.time = USES_INFINITY;
                DB((dbg, DBG_START, "    %+F not taken (dead)\n", node));
-               if (is_Phi(node)) {
-                       be_spill_phi(senv, node);
-               }
                return loc;
        }
 
@@ -577,6 +576,8 @@ static void decide_start_workset(const ir_node *block)
 
                if (! is_Phi(node))
                        break;
+               if (!arch_irn_consider_in_reg_alloc(arch_env, cls, node))
+                       continue;
 
                if (all_preds_known) {
                        available = available_in_all_preds(pred_worksets, arity, node, true);
@@ -591,6 +592,8 @@ static void decide_start_workset(const ir_node *block)
                                ARR_APP1(loc_t, delayed, loc);
                        else
                                ARR_APP1(loc_t, starters, loc);
+               } else {
+                       be_spill_phi(senv, node);
                }
        }
 
@@ -624,10 +627,12 @@ static void decide_start_workset(const ir_node *block)
        /* so far we only put nodes into the starters list that are used inside
         * the loop. If register pressure in the loop is low then we can take some
         * values and let them live through the loop */
+       DB((dbg, DBG_START, "Loop pressure %d, taking %d delayed vals\n",
+           pressure, free_slots));
        if (free_slots > 0) {
                qsort(delayed, ARR_LEN(delayed), sizeof(delayed[0]), loc_compare);
 
-               for (i = 0; i < ARR_LEN(delayed) && i < free_slots; ++i) {
+               for (i = 0; i < ARR_LEN(delayed) && free_slots > 0; ++i) {
                        int    p, arity;
                        loc_t *loc = & delayed[i];
 
@@ -652,6 +657,7 @@ static void decide_start_workset(const ir_node *block)
                        DB((dbg, DBG_START, "    delayed %+F taken\n", loc->node));
                        ARR_APP1(loc_t, starters, *loc);
                        loc->node = NULL;
+                       --free_slots;
                skip_delayed:
                        ;
                }