/*
- * 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.
*
#include "bestat.h"
#include "beirg_t.h"
-#include <libcore/lc_opts.h>
-#include <libcore/lc_opts_enum.h>
+#include "lc_opts.h"
+#include "lc_opts_enum.h"
DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL);
/* 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)) {
/*
}
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 */