20 DEBUG_ONLY(static firm_dbg_module_t *dbg);
25 static void cond_eval(ir_node* block, void* env)
27 int n_block = get_Block_n_cfgpreds(block);
30 for (i = 0; i < n_block; i++) {
44 pred = get_Block_cfgpred(block, i);
45 if (!is_Proj(pred)) continue;
48 pred = get_Proj_pred(projx);
49 if (!is_Cond(pred)) continue;
52 pred = get_Cond_selector(cond);
53 assert(is_Proj(pred));
54 // TODO handle switches
55 if (get_irn_mode(pred) != mode_b) continue;
56 pnc = get_Proj_proj(pred);
58 cmp = get_Proj_pred(pred);
61 left = get_Cmp_left(cmp);
62 right = get_Cmp_right(cmp);
64 // TODO handle Const-Const and Phi-Phi
66 if (!is_Const(right)) continue;
69 } else if (is_Phi(right)) {
70 if (!is_Const(left)) continue;
73 pnc = get_inversed_pnc(pnc);
78 cond_block = get_nodes_block(cond);
79 if (get_nodes_block(phi) != cond_block) continue;
81 if (get_Proj_proj(projx) == 0) pnc = get_negated_pnc(pnc, get_irn_mode(cnst));
83 n_phi = get_Phi_n_preds(phi);
84 for (j = 0; j < n_phi; j++) {
91 pred = get_Phi_pred(phi, j);
92 // TODO handle Phi cascades
93 if (!is_Const(pred)) continue;
95 tv_phi = get_Const_tarval(pred);
96 tv_cnst = get_Const_tarval(cnst);
98 cmp_val = tarval_cmp(tv_phi, tv_cnst);
99 if (cmp_val == pn_Cmp_False)
101 if ((cmp_val & pnc) != cmp_val)
106 "> Found condition evaluation candidate %+F->%+F predecessor %d\n",
110 #if 0 // TODO repair data flow and dominance
111 NEW_ARR_A(ir_node*, ins, n_block + 1);
112 for (k = 0; k < n_block; k++) ins[k] = get_Block_cfgpred(block, k);
113 ins[k] = get_Block_cfgpred(cond_block, j);
114 set_irn_in(block, n_block + 1, ins);
116 set_Block_cfgpred(cond_block, j, new_Bad());
117 set_Phi_pred(phi, j, new_Bad());
124 void opt_cond_eval(ir_graph* irg)
126 FIRM_DBG_REGISTER(dbg, "firm.opt.condeval");
127 firm_dbg_set_mask(dbg, SET_LEVEL_5);
129 DB((dbg, LEVEL_1, "===> Performing condition evaluation on %+F\n", irg));
131 irg_block_walk_graph(irg, NULL, cond_eval, NULL);