/*
- * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved.
- *
* This file is part of libFirm.
- *
- * This file may be distributed and/or modified under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation and appearing in the file LICENSE.GPL included in the
- * packaging of this file.
- *
- * Licensees holding valid libFirm Professional Edition licenses may use
- * this file in accordance with the libFirm Commercial License.
- * Agreement provided with the Software.
- *
- * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE.
+ * Copyright (C) 2012 University of Karlsruhe.
*/
/**
first = 0;
}
DB((dbg, LEVEL_2, "\n }\n"));
-} /* dump_partition */
+}
/**
* Dumps a list.
first = 0;
}
DB((dbg, LEVEL_3, "\n }\n"));
-} /* do_dump_list */
+}
#else
#define dump_partition(msg, part)
#define dump_list(msg, block)
(void) size;
return e1->id != e2->id;
-} /* listmap_cmp_ptr */
+}
/**
* Initializes a listmap.
{
map->map = new_set(listmap_cmp_ptr, 16);
map->values = NULL;
-} /* listmap_init */
+}
/**
* Terminates a listmap.
static void listmap_term(listmap_t *map)
{
del_set(map->map);
-} /* listmap_term */
+}
/**
* Return the associated listmap entry for a given id.
map->values = entry;
}
return entry;
-} /* listmap_find */
+}
/**
* Calculate the hash value for an opcode map entry.
{
/* assume long >= int */
return (unsigned)(PTR_TO_INT(entry->mode) * 9 + entry->code + entry->u.proj * 3 + hash_ptr(entry->u.addr) + entry->arity);
-} /* opcode_hash */
+}
/**
* Compare two entries in the opcode map.
return o1->code != o2->code || o1->mode != o2->mode ||
o1->arity != o2->arity ||
o1->u.proj != o2->u.proj || o1->u.addr != o2->u.addr;
-} /* cmp_opcode */
+}
/**
* Creates a new empty partition and put in on the
DEBUG_ONLY(part->nr = part_nr++;)
list_add_tail(&part->part_list, &env->partitions);
return part;
-} /* create_partition */
+}
/**
* Allocate a new block in the given partition.
env->all_blocks = bl;
return bl;
-} /* create_block */
+}
/**
* Allocate a new node and add it to a blocks wait queue.
list_add_tail(&node->node_list, &block->nodes);
return node;
-} /* create_node */
+}
/**
* Add an input pair to a block.
pair->ins = NULL;
block->input_pairs = pair;
-} /* add_pair */
+}
/**
* Add a Phi to a block.
node->ins = NULL;
block->phis = node;
-} /** add_phi */
+}
/**
* Creates an opcode from a node.
entry = set_insert(opcode_key_t, env->opcode2id_map, &key, sizeof(key), opcode_hash(&key));
return entry;
-} /* opcode */
+}
/**
* Split a partition by a local list.
dump_partition("Now ", Z);
dump_partition("Created new ", Z_prime);
return Z_prime;
-} /* split */
+}
/**
* Return non-zero if pred should be tread as a input node.
if (! is_Call(irn))
return 1;
return 0;
-} /* is_input_node */
+}
/**
* Propagate nodes on all wait queues of the given partition.
split(part, S, env);
}
listmap_term(&map);
-} /* propagate_blocks */
+}
/**
* Propagate nodes on all wait queues.
} else
propagate_blocks(part, env);
}
-} /* propagate */
+}
/**
* Map a block to the phi[block->input] live-trough.
if (get_nodes_block(input) == bl->block)
return NULL;
return input;
-} /* live_throughs */
+}
/**
* Split partition by live-outs and live-troughs.
}
listmap_term(&map);
}
-} /* propagate_blocks_live_troughs */
+}
/**
* Propagate live-troughs on all partitions on the partition list.
list_for_each_entry_safe(partition_t, part, next, &env->partitions, part_list) {
propagate_blocks_live_troughs(part, env);
}
-} /* propagate_live_troughs */
+}
/**
* Apply analysis results by replacing all blocks of a partition
/* fix inputs of the meet block */
set_irn_in(meet_block, j, ins);
DEL_ARR_F(ins);
-} /* apply */
+}
/**
* Create a partition for a the end block.
}
dump_partition("Created", part);
-} /* partition_for_end_block */
+}
#ifdef GENERAL_SHAPE
/**
}
dump_partition("Created", part);
-} /* partition_for_block */
+}
/**
* Walker: clear the links of all block phi lists and normal
set_Block_phis(irn, NULL);
set_irn_link(irn, NULL);
}
-} /* clear_phi_links */
+}
/**
* Walker, detect live-out nodes.
live_outs[idx] = pred_block;
}
}
-} /* find_liveouts */
+}
/**
* Check if the current block is the meet block of its predecessors.
if (k > 1)
partition_for_block(block, preds, k, env);
-} /* check_for_cf_meet */
+}
/**
* Compare two nodes for root ordering.
idx_b = get_irn_idx(irn_b);
return (idx_a > idx_b) - (idx_a < idx_b);
-} /* cmp_nodes */
+}
/**
* Add the roots to all blocks.
for (bl = env->all_blocks; bl != NULL; bl = bl->all_next) {
size_t i, n = ARR_LEN(bl->roots);
-#if 1
/* TODO: is this really needed? The roots are already in
idx-order by construction, which might be good enough. */
qsort(bl->roots, n, sizeof(bl->roots[0]), cmp_nodes);
-#endif
DB((dbg, LEVEL_2, " Adding Roots for block %+F\n ", bl->block));
/* ok, add them sorted */
DEL_ARR_F(bl->roots);
bl->roots = NULL;
}
-} /* add_roots */
+}
#endif /* GENERAL_SHAPE */
/* Combines congruent end blocks into one. */
env.opcode2id_map = new_set(cmp_opcode, iro_Last * 4);
n = get_irg_last_idx(irg);
- env.live_outs = NEW_ARR_F(ir_node *, n);
- memset(env.live_outs, 0, sizeof(*env.live_outs) * n);
+ env.live_outs = NEW_ARR_FZ(ir_node*, n);
env.all_blocks = NULL;
DEL_ARR_F(env.live_outs);
del_set(env.opcode2id_map);
obstack_free(&env.obst, NULL);
-} /* shape_blocks */
+}
ir_graph_pass_t *shape_blocks_pass(const char *name)
{
return def_graph_pass(name ? name : "shape_blocks", shape_blocks);
-} /* shape_blocks_pass */
+}