X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fcombo.c;h=4975e3d8bc80e951e1475d7be7ecb63a5467cf59;hb=30b992a490bfdcccb934dbe90710b663898c001f;hp=93a74cf8321cea6ae186bd62d69963e145eb6a16;hpb=e41f887b6ed60098916f3b66004c237de33d5241;p=libfirm diff --git a/ir/opt/combo.c b/ir/opt/combo.c index 93a74cf83..4975e3d8b 100644 --- a/ir/opt/combo.c +++ b/ir/opt/combo.c @@ -83,6 +83,7 @@ #include "irpass.h" #include "tv_t.h" #include "irtools.h" +#include "firmstat_t.h" #include "irprintf.h" #include "irdump.h" @@ -439,10 +440,13 @@ static void dump_all_partitions(const environment_t *env) static void dump_split_list(const partition_t *list) { const partition_t *p; + char split = ' '; DB((dbg, LEVEL_2, "Split by %s produced = {\n", what_reason)); - for (p = list; p != NULL; p = p->split_next) - DB((dbg, LEVEL_2, "part%u, ", p->nr)); + for (p = list; p != NULL; p = p->split_next) { + DB((dbg, LEVEL_2, "%c part%u", split, p->nr)); + split = ','; + } DB((dbg, LEVEL_2, "\n}\n")); } /* dump_split_list */ @@ -1912,7 +1916,8 @@ static void compute_Block(node_t *node) int i; ir_node *block = node->node; - if (block == get_irg_start_block(current_ir_graph) || get_Block_entity(block) != NULL) { + ir_graph *const irg = get_Block_irg(block); + if (block == get_irg_start_block(irg) || get_Block_entity(block) != NULL) { /* start block and labelled blocks are always reachable */ node->type.tv = tarval_reachable; return; @@ -2848,6 +2853,17 @@ static void propagate(environment_t *env) /* x will make the follower -> leader transition */ follower_to_leader(x); + + /* In case of a follower -> leader transition of a Phi node + * we have to ensure that the current partition will be split + * by lambda n.(n[i].partition). + * + * This split may already happened before when some predecessors + * of the Phi's Block are unreachable. Thus, we have to put the + * current partition in the worklist to repeat the check. + */ + if (is_Phi(x->node) && ! x->part->on_worklist) + add_to_worklist(x->part, env); } /* compute a new type for x */ @@ -3027,7 +3043,8 @@ static void apply_cf(ir_node *block, void *ctx) } } - if (block == get_irg_end_block(current_ir_graph)) { + ir_graph *const irg = get_Block_irg(block); + if (block == get_irg_end_block(irg)) { /* Analysis found out that the end block is unreachable, * hence we remove all its control flow predecessors. */ set_irn_in(block, 0, NULL);