+#include "set.h"
+#include "list.h"
+#include "hashptr.h"
+
+typedef enum _live_state_t {
+ live_state_in = 1,
+ live_state_end = 2,
+ live_state_out = 4,
+ live_state_block = 8,
+} live_state_t;
+
+typedef struct _irn_live_t {
+ const ir_node *block;
+ const ir_node *irn;
+ unsigned state;
+ struct _irn_live_t *next;
+} irn_live_t;
+
+typedef struct _irg_live_info_t {
+ set *live;
+} irg_live_info_t;
+
+extern size_t live_irg_data_offset;
+
+#define get_irg_live_info(irg) (get_irg_data(irg, irg_live_info_t, live_irg_data_offset))
+
+#define live_is_in(live) (((live)->state & live_state_in) != 0)
+#define live_is_end(live) (((live)->state & live_state_end) != 0)
+#define live_is_out(live) (((live)->state & live_state_out) != 0)
+
+static INLINE irn_live_t *_get_or_set_live(const ir_node *block,
+ const ir_node *irn, int state)
+{
+ irg_live_info_t *live_info = get_irg_live_info(get_irn_irg(block));
+ irn_live_t *live, templ;
+ unsigned hash = HASH_PTR(block) + 37 * HASH_PTR(irn);