+/**
+ * Fix to remove dead nodes (especially don't spill nodes) from workset.
+ */
+static void fix_dead_values(workset_t *ws, ir_node *irn) {
+ int idx;
+ ir_node *node;
+ ir_node *block = get_nodes_block(irn);
+
+ DBG((dbg, DBG_DECIDE, "fixing dead values at %+F:\n", irn));
+
+ workset_foreach(ws, node, idx) {
+ const ir_edge_t *edge;
+ int fixme = 1;
+
+ /* skip already fixed nodes */
+ if (workset_get_time(ws, idx) == INT_MAX)
+ continue;
+
+ /* check all users */
+ foreach_out_edge(node, edge) {
+ ir_node *user = get_edge_src_irn(edge);
+
+ if ((get_nodes_block(user) != block) || /* user is in a different block */
+ (sched_is_scheduled(user) && sched_comes_after(irn, user)) || /* user is scheduled after irn */
+ user == irn) /* irn is the user */
+ { /* => don't fix distance */
+ fixme = 0;
+ break;
+ }
+ }
+
+ /* all users scheduled prior to current irn in in same block as irn -> fix */
+ if (fixme) {
+ workset_set_time(ws, idx, INT_MAX);
+ DBG((dbg, DBG_DECIDE, "\tfixing time for %+F to INT_MAX\n", node));
+ }
+ }
+
+}
+