- cnst = new_r_Const_long(irg, start_block, mode_Iu, get_mode_size_bytes(mode_Iu) * id);
- offset = new_r_Add(irg, bb, address, cnst, mode_P);
- load = new_r_Load(irg, bb, new_NoMem(), offset, mode_Iu);
- projm = new_r_Proj(irg, bb, load, mode_M, pn_Load_M);
- proji = new_r_Proj(irg, bb, load, mode_Iu, pn_Load_res);
- cnst = new_r_Const_long(irg, start_block, mode_Iu, 1);
- add = new_r_Add(irg, bb, proji, cnst, mode_Iu);
- store = new_r_Store(irg, bb, projm, offset, add);
- projm = new_r_Proj(irg, bb, store, mode_M, pn_Store_M);
- keep_alive(projm);
+ unknown = new_r_Unknown(irg, mode_M);
+ cnst = new_r_Const_long(irg, start_block, mode_Iu, get_mode_size_bytes(mode_Iu) * id);
+ offset = new_r_Add(irg, bb, address, cnst, mode_P);
+ load = new_r_Load(irg, bb, unknown, offset, mode_Iu);
+ projm = new_r_Proj(irg, bb, load, mode_M, pn_Load_M);
+ proji = new_r_Proj(irg, bb, load, mode_Iu, pn_Load_res);
+ cnst = new_r_Const_long(irg, start_block, mode_Iu, 1);
+ add = new_r_Add(irg, bb, proji, cnst, mode_Iu);
+ store = new_r_Store(irg, bb, projm, offset, add);
+ projm = new_r_Proj(irg, bb, store, mode_M, pn_Store_M);
+ set_irn_link(bb, projm);
+ set_irn_link(projm, load);
+}
+
+typedef struct fix_env {
+ ir_node *start_block;
+ ir_node *end_block;
+} fix_env;
+
+/**
+ * SSA Construction for instrumentation code memory
+ */
+static void
+fix_ssa(ir_node * bb, void * data)
+{
+ fix_env *env = data;
+ ir_node *mem;
+ int arity = get_Block_n_cfgpreds(bb);
+
+ /* start and end block are not instrumented, skip! */
+ if (bb == env->start_block || bb == env->end_block)
+ return;
+
+ if (arity == 1) {
+ mem = get_irn_link(get_Block_cfgpred_block(bb, 0));
+ } else {
+ int n;
+ ir_node **ins;
+ ir_graph *irg = current_ir_graph;
+
+ NEW_ARR_A(ir_node*, ins, arity);
+ for (n = arity - 1; n >= 0; --n) {
+ ins[n] = get_irn_link(get_Block_cfgpred_block(bb, n));
+ }
+ mem = new_r_Phi(irg, bb, arity, ins, mode_M);
+ }
+ set_Load_mem(get_irn_link(get_irn_link(bb)), mem);