-static void belady(ir_node *block, void *data) {
- belady_env_t *env = data;
- workset_t *new_vals;
- ir_node *irn;
- int iter;
- block_info_t *block_info;
-
- /* make sure we have blockinfo (with startset) */
- block_info = get_block_info(block);
- if (block_info == NULL)
- block_info = compute_block_start_info(env, block);
-
- /* Don't do a block twice */
- if(block_info->processed)
- return;
-
- /* get the starting workset for this block */
- DBG((dbg, DBG_DECIDE, "\n"));
- DBG((dbg, DBG_DECIDE, "Decide for %+F\n", block));
-
- workset_copy(env, env->ws, block_info->ws_start);
- DBG((dbg, DBG_WSETS, "Start workset for %+F:\n", block));
- workset_foreach(env->ws, irn, iter)
- DBG((dbg, DBG_WSETS, " %+F (%u)\n", irn, workset_get_time(env->ws, iter)));
+static void process_block(ir_node *block)
+{
+ workset_t *new_vals;
+ ir_node *irn;
+ int iter;
+ block_info_t *block_info;
+ int arity;
+
+ /* no need to process a block twice */
+ assert(get_block_info(block) == NULL);
+
+ /* construct start workset */
+ arity = get_Block_n_cfgpreds(block);
+ if (arity == 0) {
+ /* no predecessor -> empty set */
+ workset_clear(ws);
+ } else if (arity == 1) {
+ /* one predecessor, copy it's end workset */
+ ir_node *pred_block = get_Block_cfgpred_block(block, 0);
+ block_info_t *pred_info = get_block_info(pred_block);
+
+ assert(pred_info != NULL);
+ workset_copy(ws, pred_info->end_workset);
+ } else {
+ /* multiple predecessors, do more advanced magic :) */
+ decide_start_workset(block);
+ }
+
+ DB((dbg, DBG_DECIDE, "\n"));
+ DB((dbg, DBG_DECIDE, "Decide for %+F\n", block));
+
+ block_info = new_block_info();
+ set_block_info(block, block_info);
+
+ DB((dbg, DBG_WSETS, "Start workset for %+F:\n", block));
+ workset_foreach(ws, irn, iter) {
+ DB((dbg, DBG_WSETS, " %+F (%u)\n", irn,
+ workset_get_time(ws, iter)));
+ }
+
+ block_info->start_workset = workset_clone(ws);