#include "cgana.h"
#include "debug.h"
-#include "beirg_t.h"
+#include "beirg.h"
#include "betranshlp.h"
+#include "belive.h"
typedef struct be_transform_env_t {
ir_graph *irg; /**< The irg, the node should be created in */
mark_irn_visited(old_node);
}
-int be_is_transformed(const ir_node *node) {
+int be_is_transformed(const ir_node *node)
+{
return irn_visited(node);
}
-static inline ir_node *be_get_transformed_node(ir_node *old_node) {
+static inline ir_node *be_get_transformed_node(ir_node *old_node)
+{
if (irn_visited(old_node)) {
ir_node *new_node = get_irn_link(old_node);
assert(new_node != NULL);
return NULL;
}
-void be_duplicate_deps(ir_node *old_node, ir_node *new_node) {
+void be_duplicate_deps(ir_node *old_node, ir_node *new_node)
+{
int i;
int deps = get_irn_deps(old_node);
add_irn_dep(node, get_irg_frame(irg));
}
-ir_node *be_duplicate_node(ir_node *node) {
+ir_node *be_duplicate_node(ir_node *node)
+{
ir_node *block = be_transform_node(get_nodes_block(node));
ir_graph *irg = env.irg;
dbg_info *dbgi = get_irn_dbg_info(node);
copy_node_attr(node, new_node);
be_duplicate_deps(node, new_node);
-#ifdef DEBUG_libfirm
new_node->node_nr = node->node_nr;
-#endif
-
return new_node;
}
/**
* Calls transformation function for given node and marks it visited.
*/
-ir_node *be_transform_node(ir_node *node) {
+ir_node *be_transform_node(ir_node *node)
+{
ir_op *op;
ir_node *new_node = be_get_transformed_node(node);
/**
* enqueue all inputs into the transform queue.
*/
-void be_enqueue_preds(ir_node *node) {
+void be_enqueue_preds(ir_node *node)
+{
int i, arity;
/* put the preds in the worklist */
/**
* Rewire nodes which are potential loops (like Phis) to avoid endless loops.
*/
-static void fix_loops(ir_node *node) {
+static void fix_loops(ir_node *node)
+{
int i, arity;
int changed;
}
}
-ir_node *be_pre_transform_node(ir_node *place) {
+ir_node *be_pre_transform_node(ir_node *place)
+{
if (place == NULL)
return NULL;
}
}
+static ir_node *new_be_Anchor(ir_graph *irg)
+{
+ struct obstack *obst = be_get_birg_obst(irg);
+ backend_info_t *info;
+ ir_node *new_anchor;
+
+ /* Hack: some places in the code ask the Anchor for its register
+ requirements */
+ new_anchor = new_Anchor(irg);
+ info = be_get_info(new_anchor);
+ info->out_infos = NEW_ARR_D(reg_out_info_t, obst, 1);
+ memset(info->out_infos, 0, 1 * sizeof(info->out_infos[0]));
+ info->out_infos[0].req = arch_no_register_req;
+
+ return new_anchor;
+}
+
/**
* Transforms all nodes. Deletes the old obstack and creates a new one.
*/
waitq_put(env.worklist, anchor);
}
- new_anchor = new_Anchor(irg);
+ new_anchor = new_be_Anchor(irg);
irg->anchor = new_anchor;
/* pre transform some anchors (so they are available in the other transform
/**
* Transform helper for blocks.
*/
-static ir_node *gen_Block(ir_node *node) {
+static ir_node *gen_Block(ir_node *node)
+{
ir_graph *irg = current_ir_graph;
dbg_info *dbgi = get_irn_dbg_info(node);
- ir_node *old_start_block = get_irn_n(env.old_anchor, anchor_start_block);
ir_node *macroblock = get_Block_MacroBlock(node);
ir_node *block;
- /*
- * We replace the ProjX from the start node with a jump,
- * so the startblock has no preds anymore now
- */
- if (node == old_start_block) {
- return new_rd_Block(dbgi, irg, 0, NULL);
- }
-
- /* we use the old blocks for now, because jumps allow cycles in the graph
- * we have to fix this later */
block = new_ir_node(dbgi, irg, NULL, get_irn_op(node), get_irn_mode(node),
get_irn_arity(node), get_irn_in(node) + 1);
copy_node_attr(node, block);
-#ifdef DEBUG_libfirm
block->node_nr = node->node_nr;
-#endif
+
if (node == macroblock) {
/* this node is a macroblock header */
set_Block_MacroBlock(block, block);
return block;
}
-static ir_node *gen_End(ir_node *node) {
+static ir_node *gen_End(ir_node *node)
+{
/* end has to be duplicated manually because we need a dynamic in array */
ir_graph *irg = current_ir_graph;
dbg_info *dbgi = get_irn_dbg_info(node);