+static void create_abstract_join2 (ir_graph *irg, proc_t *proc, eff_t *eff)
+{
+ ir_node *unknown = NULL;
+ ir_node *cond = NULL;
+ ir_node *phi = NULL;
+
+ ir_node *ins [2];
+ ir_node *block [2];
+ ir_node *projX [2];
+ ir_node *jmp [2];
+
+ eff_t *in_eff = NULL;
+ int n_ins = -1;
+
+ VERBOSE_PRINT((stdout, "create join2 in %s\n",
+ get_id_str(proc -> proc_ident)));
+
+ assert (eff_join == eff->kind);
+
+ n_ins = eff->effect.join.n_ins;
+ assert (2 == n_ins);
+
+ in_eff = find_valueid_in_proc_effects (eff->effect.join.ins [0], proc);
+ ins [0] = in_eff->firmnode;
+ in_eff = find_valueid_in_proc_effects (eff->effect.join.ins [1], proc);
+ ins [1] = in_eff->firmnode;
+
+ unknown = new_Unknown (mode_Iu);
+ cond = new_Cond (unknown);
+
+ projX [0] = new_Proj (cond, mode_X, 0);
+ projX [1] = new_Proj (cond, mode_X, 1);
+
+ mature_immBlock (get_cur_block ());
+
+ block [0] = new_immBlock ();
+ add_immBlock_pred (block [0], projX [0]);
+ jmp [0] = new_Jmp ();
+ mature_immBlock (block [0]);
+
+ block [1] = new_immBlock ();
+ add_immBlock_pred (block [1], projX [1]);
+ jmp [1] = new_Jmp ();
+ mature_immBlock (block [1]);
+
+ new_Block (2, jmp);
+
+ phi = new_Phi (2, ins, get_irn_mode (ins [0]));
+ VERBOSE_PRINT ((stdout, "%s: phi.nr = %li\n", __FUNCTION__, get_irn_node_nr (phi)));
+
+ eff->firmnode = phi;
+
+ add_value_to_proc (proc, eff);
+}
+
+static void create_abstract_join (ir_graph *irg, proc_t *proc, eff_t *eff)
+{
+ ir_node **ins = NULL;
+ ir_node *unknown = NULL;
+ ir_node *cond = NULL;
+ ir_node *block = NULL;
+ ir_node *phi = NULL;
+ ir_mode *join_md = mode_ANY;
+ int n_ins = -1;
+ int i;
+
+ VERBOSE_PRINT((stdout, "create join in %s\n",
+ get_id_str(proc -> proc_ident)));
+
+ assert (eff_join == eff->kind);
+
+ n_ins = eff->effect.join.n_ins;
+ /* hmm ... special-case n_ins==2? */
+ assert (2 == n_ins);
+
+ if (2 == n_ins) {
+ create_abstract_join2 (irg, proc, eff);
+ return;
+ }
+
+ unknown = new_Unknown (mode_Iu);
+ cond = new_Cond (unknown);
+ block = new_immBlock ();
+
+ ins = (ir_node**) malloc (n_ins * sizeof (ir_node*));
+ for (i = 0; i < n_ins; i ++) {
+ ir_node *s_block = new_immBlock ();
+ ir_node *projX = new_Proj (cond, mode_X, (long) i);
+ ir_node *jmp = NULL;
+ eff_t *in_eff;
+
+ add_immBlock_pred (s_block, projX);
+ mature_immBlock (s_block);
+
+ in_eff = find_valueid_in_proc_effects (eff->effect.join.ins [i], proc);
+
+ ins [i] = in_eff->firmnode;
+ if (mode_ANY != get_irn_mode (ins [i])) {
+ join_md = get_irn_mode (ins [i]);
+ }
+
+ jmp = new_Jmp ();
+ add_immBlock_pred (block, jmp);
+ }
+
+ mature_immBlock (block);
+ set_cur_block (block);
+ phi = new_Phi (n_ins, ins, join_md);
+ memset (ins, 0x00, n_ins * sizeof (ir_node*));
+ free (ins);
+
+ eff->firmnode = phi;
+
+ add_value_to_proc (proc, eff);
+}
+