X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fia32%2Fia32_emitter.c;h=d377143b0af700954862016768d01af9254fa5f0;hb=1872920c09708b361d06c0dc9f4c1fd0a03544f5;hp=9b5b759a999daccefc8e613aaa8328033b30945a;hpb=47885bf993d39dbfc9ae964178c52013a1fbba55;p=libfirm diff --git a/ir/be/ia32/ia32_emitter.c b/ir/be/ia32/ia32_emitter.c index 9b5b759a9..d377143b0 100644 --- a/ir/be/ia32/ia32_emitter.c +++ b/ir/be/ia32/ia32_emitter.c @@ -634,40 +634,40 @@ static const struct cmp2conditon_t cmp2condition_u[] = { */ static ir_node *find_original_value(ir_node *node) { - inc_irg_visited(current_ir_graph); - while(1) { - mark_irn_visited(node); - if (be_is_Copy(node)) { - node = be_get_Copy_op(node); - } else if (be_is_CopyKeep(node)) { - node = be_get_CopyKeep_op(node); - } else if (is_Proj(node)) { - ir_node *pred = get_Proj_pred(node); - if (be_is_Perm(pred)) { - node = get_irn_n(pred, get_Proj_proj(node)); - } else if (be_is_MemPerm(pred)) { - node = get_irn_n(pred, get_Proj_proj(node) + 1); - } else if (is_ia32_Load(pred)) { - node = get_irn_n(pred, n_ia32_Load_mem); - } else { - return node; - } - } else if (is_ia32_Store(node)) { - node = get_irn_n(node, n_ia32_Store_val); - } else if (is_Phi(node)) { - int i, arity; - arity = get_irn_arity(node); - for(i = 0; i < arity; ++i) { - ir_node *in = get_irn_n(node, i); - if (irn_visited(in)) - continue; - node = in; - break; - } - assert(i < arity); + if (irn_visited(node)) + return NULL; + + mark_irn_visited(node); + if (be_is_Copy(node)) { + return find_original_value(be_get_Copy_op(node)); + } else if (be_is_CopyKeep(node)) { + return find_original_value(be_get_CopyKeep_op(node)); + } else if (is_Proj(node)) { + ir_node *pred = get_Proj_pred(node); + if (be_is_Perm(pred)) { + return find_original_value(get_irn_n(pred, get_Proj_proj(node))); + } else if (be_is_MemPerm(pred)) { + return find_original_value(get_irn_n(pred, get_Proj_proj(node) + 1)); + } else if (is_ia32_Load(pred)) { + return find_original_value(get_irn_n(pred, n_ia32_Load_mem)); } else { return node; } + } else if (is_ia32_Store(node)) { + return find_original_value(get_irn_n(node, n_ia32_Store_val)); + } else if (is_Phi(node)) { + int i, arity; + arity = get_irn_arity(node); + for (i = 0; i < arity; ++i) { + ir_node *in = get_irn_n(node, i); + ir_node *res = find_original_value(in); + + if (res != NULL) + return res; + } + return NULL; + } else { + return node; } } @@ -682,7 +682,9 @@ static int determine_final_pnc(const ir_node *node, int flags_pos, ir_node *cmp = get_irn_n(flags, n_ia32_Sahf_val); if (!(is_ia32_FucomFnstsw(cmp) || is_ia32_FucompFnstsw(cmp) || is_ia32_FucomppFnstsw(cmp) || is_ia32_FtstFnstsw(cmp))) { + inc_irg_visited(current_ir_graph); cmp = find_original_value(cmp); + assert(cmp != NULL); assert(is_ia32_FucomFnstsw(cmp) || is_ia32_FucompFnstsw(cmp) || is_ia32_FucomppFnstsw(cmp) || is_ia32_FtstFnstsw(cmp)); } @@ -1837,13 +1839,8 @@ static void emit_be_Return(const ir_node *node) be_emit_cstring("\tret"); pop = be_Return_get_pop(node); - if (pop > 0) { + if (pop > 0 || be_Return_get_emit_pop(node)) { be_emit_irprintf(" $%d", pop); - } else if (be_Return_get_emit_pop(node)) { - ir_node *block = get_nodes_block(node); - if (block_needs_label(block)) { - be_emit_cstring(" $0"); - } } be_emit_finish_line_gas(node); }