X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fjumpthreading.c;h=39de745f4dfad750b0b98f6d122a327ab193af37;hb=5ea61f3166daab45e560f0d7955fd4c72d8c7167;hp=8e6f9fa92c3a484feb3fd82fdd6f941bcc2f3166;hpb=d304e6e0053ecf1de3f541121ee70d7542bf9f84;p=libfirm diff --git a/ir/opt/jumpthreading.c b/ir/opt/jumpthreading.c index 8e6f9fa92..39de745f4 100644 --- a/ir/opt/jumpthreading.c +++ b/ir/opt/jumpthreading.c @@ -60,7 +60,7 @@ static void add_pred(ir_node* node, ir_node* x) int n; int i; - assert(is_Block(node) || is_Phi(node)); + assert(is_Block(node)); n = get_irn_arity(node); NEW_ARR_A(ir_node*, ins, n + 1); @@ -194,6 +194,16 @@ static void construct_ssa(ir_node *orig_block, ir_node *orig_val, } } +/** + * jumpthreading produces critical edges, e.g. B-C: + * A A + * \ / \ | + * B => B | + * / \ / \| + * C C + * + * By splitting this critical edge more threadings might be possible. + */ static void split_critical_edge(ir_node *block, int pos) { ir_graph *irg = get_irn_irg(block); @@ -634,6 +644,7 @@ static void thread_jumps(ir_node* block, void* data) ir_node *badX; int cnst_pos; + /* we do not deal with Phis, so restrict this to exactly one cfgpred */ if (get_Block_n_cfgpreds(block) != 1) return; @@ -716,6 +727,10 @@ static void thread_jumps(ir_node* block, void* data) if (copy_block == NULL) return; + /* We might thread the condition block of an infinite loop, + * such that there is no path to End anymore. */ + keep_alive(block); + /* we have to remove the edge towards the pred as the pred now * jumps into the true_block. We also have to shorten Phis * in our block because of this */