X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbelistsched.c;h=c8cf497ac010473b2d263b744f51ea359f96e7ca;hb=d300330b1e6df8c8914b8fb70cf38ee1c8ca2634;hp=22553360fc5dc793a272507144d67157f120293d;hpb=1eea702a194424852ded345128fc21866e234a5c;p=libfirm diff --git a/ir/be/belistsched.c b/ir/be/belistsched.c index 22553360f..c8cf497ac 100644 --- a/ir/be/belistsched.c +++ b/ir/be/belistsched.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -61,8 +61,8 @@ #include "bestat.h" #include "beirg_t.h" -#include -#include +#include "lc_opts.h" +#include "lc_opts_enum.h" DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL); @@ -452,14 +452,29 @@ static void list_sched_block(ir_node *block, void *env_ptr) /* Then one can add all nodes are ready to the set. */ foreach_out_edge(block, edge) { - ir_node *irn = get_edge_src_irn(edge); + ir_node *irn = get_edge_src_irn(edge); + ir_opcode code = get_irn_opcode(irn); + int users; - /* Skip the end node because of keepalive edges. */ - if (get_irn_opcode(irn) == iro_End) + if (code == iro_End) { + /* Skip the end node because of keep-alive edges. */ continue; + } else if (code == iro_Block) { + /* A Block-Block edge. This should be the MacroBlock + * edge, ignore it. */ + assert(get_Block_MacroBlock(irn) == block && "Block-Block edge found"); + continue; + } - if (get_irn_n_edges(irn) == 0) + users = get_irn_n_edges(irn); + if (users == 0) continue; + else if (users == 1) { /* ignore nodes that are only hold by the anchor */ + const ir_edge_t *edge = get_irn_out_edge_first_kind(irn, EDGE_KIND_NORMAL); + ir_node *user = get_edge_src_irn(edge); + if (is_Anchor(user)) + continue; + } if (is_Phi(irn)) { /* @@ -477,7 +492,7 @@ static void list_sched_block(ir_node *block, void *env_ptr) } else { /* Other nodes must have all operands in other blocks to be made - * ready */ + * ready */ int ready = 1; /* Check, if the operands of a node are not local to this block */