+ constr_info *info = phase_get_irn_data(env->phase, node);
+
+ return info && info->is_use;
+}
+
+/**
+ * Introduces a definition at the corresponding block.
+ */
+static void introduce_definition(be_ssa_construction_env_t *env, ir_node *def)
+{
+ ir_node *block = get_nodes_block(def);
+ ir_phase *phase = env->phase;
+ constr_info *def_info = phase_get_or_set_irn_data(phase, def);
+ ir_node *skip = skip_Proj(def);
+ constr_info *skip_info = phase_get_or_set_irn_data(phase, skip);
+ constr_info *block_info = phase_get_or_set_irn_data(phase, block);
+
+ DBG((dbg, LEVEL_2, "\tintroducing definition %+F in %+F\n", def, block));
+
+ def_info->is_definition = true;
+
+ skip_info->is_definition = true;
+ skip_info->definition = def;
+
+ // Set the last definition if we only introduce one definition for the block
+ if (has_definition(env, block)) {
+ assert(!block_info->already_processed);
+ block_info->last_definition = NULL;
+ }
+ else {
+ mark_irn_visited(block);
+ block_info->last_definition = def;
+ }
+}
+
+static void introduce_use(be_ssa_construction_env_t *env, ir_node *use)
+{
+ ir_node *block = get_nodes_block(use);
+ ir_phase *phase = env->phase;
+ constr_info *info = phase_get_or_set_irn_data(phase, use);
+ constr_info *block_info = phase_get_or_set_irn_data(phase, block);
+
+ DBG((dbg, LEVEL_2, "\tintroducing use %+F in %+F\n", use, block));
+
+ info->is_use = true;
+ block_info->is_use = true;
+
+ waitq_put(env->worklist, use);