+typedef enum block_flags_t {
+ BF_HAS_OPERATIONS = 1 << 0,
+ BF_HAS_PHIS = 1 << 1,
+ BF_IS_UNKNOWN_JUMP_TARGET = 1 << 2,
+} block_flags_t;
+
+static bool get_block_flag(const ir_nodehashmap_t *infos, const ir_node *block,
+ int flag)
+{
+ return PTR_TO_INT(ir_nodehashmap_get(void, infos, block)) & flag;
+}
+
+static void set_block_flag(ir_nodehashmap_t *infos, ir_node *block,
+ block_flags_t flag)
+{
+ int data = PTR_TO_INT(ir_nodehashmap_get(void, infos, block));
+ data |= flag;
+ ir_nodehashmap_insert(infos, block, INT_TO_PTR(data));
+}
+
+static void clear_block_flag(ir_nodehashmap_t *infos, const ir_node *block)
+{
+ ir_nodehashmap_remove(infos, block);
+}
+
+static bool has_operations(ir_nodehashmap_t *infos, const ir_node *block)
+{
+ return get_block_flag(infos, block, BF_HAS_OPERATIONS);
+}
+
+static void set_has_operations(ir_nodehashmap_t *infos, ir_node *block)
+{
+ set_block_flag(infos, block, BF_HAS_OPERATIONS);
+}
+
+static bool has_phis(ir_nodehashmap_t *infos, const ir_node *block)
+{
+ return get_block_flag(infos, block, BF_HAS_PHIS);
+}
+
+static void set_has_phis(ir_nodehashmap_t *infos, ir_node *block)
+{
+ set_block_flag(infos, block, BF_HAS_PHIS);
+}
+
+static bool is_unknown_jump_target(ir_nodehashmap_t *infos, const ir_node *block)
+{
+ return get_block_flag(infos, block, BF_IS_UNKNOWN_JUMP_TARGET);
+}
+
+static void set_is_unknown_jump_target(ir_nodehashmap_t *infos, ir_node *block)
+{
+ set_block_flag(infos, block, BF_IS_UNKNOWN_JUMP_TARGET);
+}
+
+/**
+ * Pre-Walker: fill block info information.
+ */
+static void compute_block_info(ir_node *n, void *x)
+{
+ ir_nodehashmap_t *infos = (ir_nodehashmap_t*)x;
+
+ if (is_Block(n)) {
+ int i, max = get_Block_n_cfgpreds(n);
+ for (i=0; i<max; i++) {
+ ir_node *pred = get_Block_cfgpred(n,i);
+ if (is_unknown_jump(pred)) {
+ set_is_unknown_jump_target(infos, n);
+ }
+ }
+ } else if (is_Phi(n)) {
+ ir_node *block = get_nodes_block(n);
+ set_has_phis(infos, block);
+ } else if (is_Jmp(n) || is_Cond(n) || is_Proj(n)) {
+ /* ignore */
+ } else {
+ ir_node *block = get_nodes_block(n);
+ set_has_operations(infos, block);