- ef->min_non_zero = 1e50; /* initialize with a reasonable large number. */
- freqs = ef->set = new_set(cmp_freq, 32);
-
- construct_cf_backedges(irg);
-
- wd.idx = 0;
- wd.set = freqs;
-
- irg_block_walk_graph(irg, block_walker, NULL, &wd);
-
- size = set_count(freqs);
- matrix = xmalloc(size*size*sizeof(*matrix));
- memset(matrix, 0, size*size*sizeof(*matrix));
- rhs = xmalloc(size*sizeof(*rhs));
- memset(rhs, 0, size*sizeof(*rhs));
-
- set_foreach(freqs, freq) {
- ir_node *bb = (ir_node *)freq->irn;
- size_t idx = (int)get_irn_link(bb);
-
- matrix[idx * (size + 1)] = -1.0;
-
- if (bb == get_irg_start_block(irg)) {
- rhs[(int)get_irn_link(bb)] = -1.0;
- continue;
- }
-
- for(i = get_Block_n_cfgpreds(bb) - 1; i >= 0; --i) {
- ir_node *pred = get_Block_cfgpred_block(bb, i);
- size_t pred_idx = (int)get_irn_link(pred);
-
-// matrix[pred_idx + idx*size] += 1.0/(double)get_Block_n_cfg_outs(pred);
- matrix[pred_idx + idx * size] += get_cf_probability(bb, i, loop_weight);
- }
- }
-
- x = solve_lgs(matrix, rhs, size);
- if(x == NULL) {
- ef->infeasible = 1;
- return ef;
- }
-
- ef->max = MAX_INT_FREQ;
- set_foreach(freqs, freq) {
- const ir_node *bb = freq->irn;
- size_t idx = PTR_TO_INT(get_irn_link(bb));
-
-#ifdef USE_GSL
- freq->freq = ZERO(gsl_vector_get(x, idx)) ? 0.0 : gsl_vector_get(x, idx);
-#else
- freq->freq = ZERO(x[idx]) ? 0.0 : x[idx];
-#endif
+ ef->min_non_zero = HUGE_VAL; /* initialize with a reasonable large number. */
+ freqs = ef->set = new_set(cmp_freq, dfs_get_n_nodes(dfs));
+
+ /*
+ * Populate the exec freq set.
+ * The DFS cannot be used alone, since the CFG might not be connected
+ * due to unreachable code.
+ */
+ irg_block_walk_graph(irg, collect_blocks, NULL, freqs);
+
+ construct_cf_backedges(irg);
+ /* TODO: edges are corrupt for EDGE_KIND_BLOCK after the local optimize
+ graph phase merges blocks in the x86 backend */
+ edges_deactivate(irg);
+ edges_activate(irg);
+ /* edges_assure(irg); */
+
+ size = dfs_get_n_nodes(dfs);
+ mat = gs_new_matrix(size, size);
+ x = xmalloc(size*sizeof(*x));
+
+ for (idx = dfs_get_n_nodes(dfs) - 1; idx >= 0; --idx) {
+ ir_node *bb = (ir_node *) dfs_get_post_num_node(dfs, size - idx - 1);
+ freq_t *freq;
+ int i;