*
* This phase find congruent blocks.
* Two block are congruent, if they contains only equal calculations.
*
* This phase find congruent blocks.
* Two block are congruent, if they contains only equal calculations.
/* define this for general block shaping: congruent blocks
are found not only before the end block but anywhere in the graph */
/* define this for general block shaping: congruent blocks
are found not only before the end block but anywhere in the graph */
DB((dbg, LEVEL_2, " %s part%u (%u blocks) {\n ", msg, part->nr, part->n_blocks));
list_for_each_entry(block_t, block, &part->blocks, block_list) {
DB((dbg, LEVEL_2, " %s part%u (%u blocks) {\n ", msg, part->nr, part->n_blocks));
list_for_each_entry(block_t, block, &part->blocks, block_list) {
- entry = (listmap_entry_t*)set_insert(map->map, &key, sizeof(key), HASH_PTR(id));
+ entry = set_insert(listmap_entry_t, map->map, &key, sizeof(key), hash_ptr(id));
if (entry->list == NULL) {
/* a new entry, put into the list */
if (entry->list == NULL) {
/* a new entry, put into the list */
- entry = (opcode_key_t*)set_insert(env->opcode2id_map, &key, sizeof(key), opcode_hash(&key));
+ entry = set_insert(opcode_key_t, env->opcode2id_map, &key, sizeof(key), opcode_hash(&key));
list_for_each_entry_safe(partition_t, part, next, &env->partitions, part_list) {
if (part->n_blocks < 2) {
/* zero or one block left, kill this partition */
list_for_each_entry_safe(partition_t, part, next, &env->partitions, part_list) {
if (part->n_blocks < 2) {
/* zero or one block left, kill this partition */
static void propagate_blocks_live_troughs(partition_t *part, environment_t *env)
{
const ir_node *meet_block = part->meet_block;
static void propagate_blocks_live_troughs(partition_t *part, environment_t *env)
{
const ir_node *meet_block = part->meet_block;
list_for_each_entry_safe(partition_t, part, next, &env->partitions, part_list) {
propagate_blocks_live_troughs(part, env);
}
list_for_each_entry_safe(partition_t, part, next, &env->partitions, part_list) {
propagate_blocks_live_troughs(part, env);
}
static void apply(ir_graph *irg, partition_t *part)
{
block_t *repr = list_entry(part->blocks.next, block_t, block_list);
static void apply(ir_graph *irg, partition_t *part)
{
block_t *repr = list_entry(part->blocks.next, block_t, block_list);
ir_node *block, *end, *meet_block, *p, *next;
ir_node **ins, **phi_ins;
phi_t *repr_phi, *phi;
pair_t *repr_pair, *pair;
ir_node *block, *end, *meet_block, *p, *next;
ir_node **ins, **phi_ins;
phi_t *repr_phi, *phi;
pair_t *repr_pair, *pair;
- int i, j, k, n, block_nr, n_phis;
+ int i, j, k, n, n_phis;
list_for_each_entry(block_t, bl, &part->blocks, block_list) {
block = bl->block;
list_for_each_entry(block_t, bl, &part->blocks, block_list) {
block = bl->block;
DB((dbg, LEVEL_1, "%+F, ", block));
DB((dbg, LEVEL_1, "%+F, ", block));
k = 0;
for (i = n - 1; i >= 0; --i) {
ir_node *pred = get_Block_cfgpred(block, i);
k = 0;
for (i = n - 1; i >= 0; --i) {
ir_node *pred = get_Block_cfgpred(block, i);
block_t *bl;
int res, n;
/* register a debug mask */
FIRM_DBG_REGISTER(dbg, "firm.opt.blocks");
block_t *bl;
int res, n;
/* register a debug mask */
FIRM_DBG_REGISTER(dbg, "firm.opt.blocks");
DB((dbg, LEVEL_1, "Shaping blocks for %+F\n", irg));
/* works better, when returns are placed at the end of the blocks */
DB((dbg, LEVEL_1, "Shaping blocks for %+F\n", irg));
/* works better, when returns are placed at the end of the blocks */
- set_irg_extblk_inconsistent(irg);
- set_irg_doms_inconsistent(irg);
-
- /* Calls might be removed. */
- set_trouts_inconsistent();
+ clear_irg_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_DOMINANCE);
DEL_ARR_F(env.live_outs);
del_set(env.opcode2id_map);
obstack_free(&env.obst, NULL);
DEL_ARR_F(env.live_outs);
del_set(env.opcode2id_map);
obstack_free(&env.obst, NULL);