- ir_node *block = get_nodes_block(call);
-
- if (reg_jmp == NULL) {
-
- /* Beware: do we need here a protection against CSE? Better we do it. */
- int old_cse = get_opt_cse();
- set_opt_cse(0);
- reg_jmp = new_r_Jmp(block);
- set_opt_cse(old_cse);
- exc_jmp = new_Bad();
+ ir_node *block = get_nodes_block(call);
+ ir_graph *irg = get_irn_irg(block);
+ ir_node *rest = new_r_Tuple(block, 1, &irn);
+
+ if (ir_throws_exception(call)) {
+ turn_into_tuple(call, pn_Call_max+1);
+ if (reg_jmp == NULL) {
+ reg_jmp = new_r_Jmp(block);
+ }
+ if (exc_jmp == NULL) {
+ exc_jmp = new_r_Bad(irg, mode_X);
+ }
+ set_Tuple_pred(call, pn_Call_X_regular, reg_jmp);
+ set_Tuple_pred(call, pn_Call_X_except, exc_jmp);
+ } else {
+ assert(reg_jmp == NULL);
+ assert(exc_jmp == NULL);
+ turn_into_tuple(call, pn_Call_T_result+1);
+ assert(pn_Call_M <= pn_Call_T_result);
+ assert(pn_Call_X_regular > pn_Call_T_result);
+ assert(pn_Call_X_except > pn_Call_T_result);