X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Freturn.c;h=4d7e7292af8efedf96c6df5b0952be1973d37b35;hb=45ecc187cee7107c83c1f9618a1e1e586df73644;hp=052ecefbb3de29a121b26ea5081b11455fabb834;hpb=0fa81d8ef4c92ab0654fcf653a16e4f38465ba3c;p=libfirm diff --git a/ir/opt/return.c b/ir/opt/return.c index 052ecefbb..4d7e7292a 100644 --- a/ir/opt/return.c +++ b/ir/opt/return.c @@ -32,7 +32,6 @@ #include "ircons_t.h" #include "irnode_t.h" #include "irgmod.h" -#include "xmalloc.h" #define set_bit(n) (returns[(n) >> 3] |= 1 << ((n) & 7)) #define get_bit(n) (returns[(n) >> 3] & (1 << ((n) & 7))) @@ -172,7 +171,7 @@ void normalize_one_return(ir_graph *irg) { * block of the Return block as well. * * All predecessors of the Return block must be Jmp's of course, or we - * cannot move it up, so we check this either. + * cannot move it up, so we add blocks if needed. */ static int can_move_ret(ir_node *ret) { ir_node *retbl = get_nodes_block(ret); @@ -190,12 +189,21 @@ static int can_move_ret(ir_node *ret) { /* check, that predecessors are Jmps */ n = get_Block_n_cfgpreds(retbl); - for (i = 0; i < n; ++i) - if (! is_Jmp(get_Block_cfgpred(retbl, i))) - return 0; - - /* if we have 0 control flow predecessors, we cannot move :-) */ - return n > 0; + if (n <= 1) + return 0; + for (i = 0; i < n; ++i) { + ir_node *pred = get_Block_cfgpred(retbl, i); + + pred = skip_Tuple(pred); + if (! is_Jmp(pred) && !is_Bad(pred)) { + /* simply place a new block here */ + ir_graph *irg = get_irn_irg(retbl); + ir_node *block = new_r_Block(irg, 1, &pred); + ir_node *jmp = new_r_Jmp(irg, block); + set_Block_cfgpred(retbl, i, jmp); + } + } + return 1; } /* @@ -276,8 +284,9 @@ void normalize_n_returns(ir_graph *irg) { ir_node *jmp = get_Block_cfgpred(block, i); ir_node *new_bl, *new_ret; - if (! is_Jmp(jmp)) + if (is_Bad(jmp)) continue; + assert(is_Jmp(jmp)); new_bl = get_nodes_block(jmp);