+void set_Spill_offset(ir_node *irn, unsigned offset)
+{
+ be_spill_attr_t *a = (be_spill_attr_t *) &irn->attr;
+ assert(is_be_kind(irn, node_kind_spill));
+ a->offset = offset;
+}
+
+static ir_node *find_a_spill_walker(ir_node *irn, unsigned visited_nr)
+{
+ if(get_irn_visited(irn) < visited_nr) {
+ set_irn_visited(irn, visited_nr);
+
+ if(is_Phi(irn)) {
+ int i, n;
+ for(i = 0, n = get_irn_arity(irn); i < n; ++i) {
+ ir_node *n = find_a_spill_walker(get_irn_n(irn, i), visited_nr);
+ if(n != NULL)
+ return n;
+ }
+ }
+
+ else if(is_be_kind(irn, node_kind_spill))
+ return irn;
+ }
+
+ return NULL;
+}
+
+ir_node *get_Spill_context(const ir_node *irn) {
+ be_spill_attr_t *a = (be_spill_attr_t *) &irn->attr;
+ assert(is_be_kind(irn, node_kind_spill));
+ return a->spill_ctx;
+}
+
+/**
+ * Finds a spill for a reload.
+ * If the reload is directly using the spill, this is simple,
+ * else we perform DFS from the reload (over all PhiMs) and return
+ * the first spill node we find.
+ */
+static INLINE ir_node *find_a_spill(ir_node *irn)
+{
+ ir_graph *irg = get_irn_irg(irn);
+ unsigned visited_nr = get_irg_visited(irg) + 1;
+
+ assert(is_be_kind(irn, node_kind_reload));
+ set_irg_visited(irg, visited_nr);
+ return find_a_spill_walker(irn, visited_nr);
+}
+
+
+unsigned get_Spill_offset(ir_node *irn)
+{
+ be_node_attr_t *a = (be_node_attr_t *) &irn->attr;
+ assert(is_be_node(irn));
+
+ switch(a->op->kind) {
+ case node_kind_reload:
+ assert(0 && "not yet implemented");
+ return get_Spill_offset(find_a_spill(irn));
+ case node_kind_spill:
+ return ((be_spill_attr_t *) a)->offset;
+ default:
+ assert(0 && "Illegal node kind (spill/reload required)");
+ }
+
+ return 0;
+}
+