10 DEBUG_ONLY(static firm_dbg_module_t *dbg);
12 static void cond_eval(ir_node* block, void* env)
14 int n_block = get_Block_n_cfgpreds(block);
17 for (i = 0; i < n_block; i++) {
31 pred = get_Block_cfgpred(block, i);
32 if (!is_Proj(pred)) continue;
35 pred = get_Proj_pred(projx);
36 if (!is_Cond(pred)) continue;
39 pred = get_Cond_selector(cond);
40 assert(is_Proj(pred));
41 // TODO handle switches
42 if (get_irn_mode(pred) != mode_b) continue;
43 pnc = get_Proj_proj(pred);
45 cmp = get_Proj_pred(pred);
48 left = get_Cmp_left(cmp);
49 right = get_Cmp_right(cmp);
51 // TODO handle Const-Const and Phi-Phi
53 if (!is_Const(right)) continue;
56 } else if (is_Phi(right)) {
57 if (!is_Const(left)) continue;
60 pnc = get_inversed_pnc(pnc);
65 cond_block = get_nodes_block(cond);
66 if (get_nodes_block(phi) != cond_block) continue;
68 if (get_Proj_proj(projx) == 0) pnc = get_negated_pnc(pnc, get_irn_mode(cnst));
70 n_phi = get_Phi_n_preds(phi);
71 for (j = 0; j < n_phi; j++) {
77 pred = get_Phi_pred(phi, j);
78 // TODO handle Phi cascades
79 if (!is_Const(pred)) continue;
81 tv_phi = get_Const_tarval(pred);
82 tv_cnst = get_Const_tarval(cnst);
84 switch (tarval_cmp(tv_phi, tv_cnst)) {
86 if (pnc != pn_Cmp_Lt &&
94 if (pnc != pn_Cmp_Le &&
102 if (pnc != pn_Cmp_Gt &&
114 "> Found condition evaluation candidate %+F->%+F predecessor %d\n",
118 #if 0 // TODO repair data flow and dominance
119 NEW_ARR_A(ir_node*, ins, n_block + 1);
120 for (k = 0; k < n_block; k++) ins[k] = get_Block_cfgpred(block, k);
121 ins[k] = get_Block_cfgpred(cond_block, j);
122 set_irn_in(block, n_block + 1, ins);
124 set_Block_cfgpred(cond_block, j, new_Bad());
125 set_Phi_pred(phi, j, new_Bad());
132 void opt_cond_eval(ir_graph* irg)
134 FIRM_DBG_REGISTER(dbg, "firm.opt.condeval");
136 DB((dbg, LEVEL_1, "===> Performing condition evaluation on %+F\n", irg));
138 irg_block_walk_graph(irg, NULL, cond_eval, NULL);