-static void resolve_call(ir_node *call, ir_node *l_res, ir_node *h_res, ir_graph *irg, ir_node *block) {
- ir_node *res, *in[2];
-
- in[0] = l_res;
- in[1] = h_res;
- res = new_r_Tuple(irg, block, h_res == NULL ? 1 : 2, in);
-
- turn_into_tuple(call, pn_Call_max);
- set_Tuple_pred(call, pn_Call_M_regular, get_irg_no_mem(irg));
- set_Tuple_pred(call, pn_Call_X_regular, new_r_Jmp(irg, block));
- set_Tuple_pred(call, pn_Call_X_except, get_irg_bad(irg));
- set_Tuple_pred(call, pn_Call_T_result, res);
- set_Tuple_pred(call, pn_Call_M_except, get_irg_no_mem(irg));
- set_Tuple_pred(call, pn_Call_P_value_res_base, get_irg_bad(irg));
+static void resolve_call(ir_node *call, ir_node *l_res, ir_node *h_res, ir_graph *irg, ir_node *block)
+{
+ ir_node *jmp, *res, *in[2];
+ ir_node *bad = get_irg_bad(irg);
+ ir_node *nomem = get_irg_no_mem(irg);
+ int old_cse;
+
+ if (edges_activated(irg)) {
+ /* use rerouting to prevent some warning in the backend */
+ const ir_edge_t *edge, *next;
+
+ foreach_out_edge_safe(call, edge, next) {
+ ir_node *proj = get_edge_src_irn(edge);
+ pn_Call pn = (pn_Call)get_Proj_proj(proj);
+
+ switch (pn) {
+ case pn_Call_X_regular:
+ /* Beware:
+ * We do not check here if this call really has exception and regular Proj's.
+ * new_r_Jmp might than be CSEd with the real exit jmp and then bad things happen
+ * (in movgen.c from 186.crafty for example).
+ * So be sure the newly created Jmp cannot CSE.
+ */
+ old_cse = get_opt_cse();
+ set_opt_cse(0);
+ jmp = new_r_Jmp(block);
+ set_opt_cse(old_cse);
+ edges_reroute(proj, jmp, irg);
+ break;
+
+ case pn_Call_X_except:
+ case pn_Call_P_value_res_base:
+ /* should not happen here */
+ edges_reroute(proj, bad, irg);
+ break;
+ case pn_Call_M:
+ /* should not happen here */
+ edges_reroute(proj, nomem, irg);
+ break;
+ case pn_Call_T_result:
+ reroute_result(proj, l_res, h_res, irg);
+ break;
+ default:
+ panic("Wrong Proj from Call");
+ }
+ kill_node(proj);
+ }
+ kill_node(call);
+ } else {
+ /* no edges, build Tuple */
+ if (h_res == NULL)
+ res = l_res;
+ else {
+ in[0] = l_res;
+ in[1] = h_res;
+ res = new_r_Tuple(block, 2, in);
+ }
+
+ turn_into_tuple(call, pn_Call_max);
+ /*
+ * Beware:
+ * We do not check here if this call really has exception and regular Proj's.
+ * new_r_Jmp might than be CSEd with the real exit jmp and then bad things happen
+ * (in movgen.c from 186.crafty for example).
+ * So be sure the newly created Jmp cannot CSE.
+ */
+ old_cse = get_opt_cse();
+ set_opt_cse(0);
+ jmp = new_r_Jmp(block);
+ set_opt_cse(old_cse);
+
+ set_Tuple_pred(call, pn_Call_M, nomem);
+ set_Tuple_pred(call, pn_Call_X_regular, jmp);
+ set_Tuple_pred(call, pn_Call_X_except, bad);
+ set_Tuple_pred(call, pn_Call_T_result, res);
+ set_Tuple_pred(call, pn_Call_P_value_res_base, bad);
+ }