/**
* Contains some useful function for the backend.
- * @author Sebastian Hack
- * @cvsid $Id$
+ * @author Sebastian Hack
+ * @version $Id$
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#include "irgopt.h"
#include "irtools.h"
#include "irprintf.h"
+#include "iredges.h"
#include "beutil.h"
#include "besched_t.h"
-#include "bearch.h"
+#include "bearch_t.h"
/* Get an always empty set. */
pset *be_empty_set(void)
}
}
-static void localize_const_walker(ir_node *irn, void *data)
-{
- if(!is_Block(irn)) {
- int i, n;
-
- for(i = 0, n = get_irn_arity(irn); i < n; ++i) {
- ir_node *op = get_irn_n(irn, i);
- if(get_irn_opcode(op) == iro_Const) {
- ir_node *tgt_block, *cnst;
-
- /* Special treatment for phi nodes, because phi-usage is different */
- tgt_block = get_nodes_block(irn);
- if(is_Phi(irn))
- tgt_block = get_nodes_block(get_irn_n(tgt_block, i));
-
- /*
- * We have to create the const node by ourselves, since the
- * firmcons implementation always places it in the start block.
- */
- cnst = new_ir_node(NULL, get_irn_irg(irn),
- tgt_block, op_Const, get_irn_mode(op), 0, NULL);
- cnst->attr.con.tv = get_Const_tarval(op);
- set_irn_n(irn, i, cnst);
- }
- }
- }
-}
-
-void localize_consts(ir_graph *irg)
-{
- irg_walk_graph(irg, localize_const_walker, NULL, NULL);
- dead_node_elimination(irg);
-}
-
/**
* Edge hook to dump the schedule edges.
*/
if (irg != last_irg) {
last_irg = irg;
- nr = 0;
+ nr = strcmp(suffix, "-abi") ? 0 : 1;
}
snprintf(buf, sizeof(buf), "-%02d%s", nr++, suffix);
return num;
}
+/**
+ * Sets all node inputs to BAD node.
+ */
+void be_kill_node(ir_node *irn) {
+ ir_graph *irg = get_irn_irg(irn);
+
+ assert(!is_Bad(irn));
+
+#ifdef DEBUG_libfirm
+ {
+ int i, first;
+ first = 0 - ! is_Block(irn);
+
+ for (i = get_irn_arity(irn) - 1; i >= first; --i) {
+ set_irn_n(irn, i, get_irg_bad(irg));
+ }
+ }
+#endif
+
+ edges_node_deleted(irn, irg);
+}
+
/* FIXME: not used. can be deleted? */
ir_node *dom_up_search(pset *accept, ir_node *start_point_exclusive) {
ir_node *irn, *idom;
else
return NULL; /* this was the start block and we did not find an acceptable irn */
}
+
+/**
+ * Gets the Proj with number pn from irn.
+ */
+ir_node *be_get_Proj_for_pn(const ir_node *irn, long pn) {
+ const ir_edge_t *edge;
+ ir_node *proj;
+ assert(get_irn_mode(irn) == mode_T && "need mode_T");
+
+ foreach_out_edge(irn, edge) {
+ proj = get_edge_src_irn(edge);
+
+ if (get_Proj_proj(proj) == pn)
+ return proj;
+ }
+
+ return NULL;
+}