** by Goetz Lindenmaier
*/
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+# include "irgraph_t.h"
+# include "irnode_t.h"
+# include "irmode_t.h"
# include "ircons.h"
# include "common.h"
# include "irvrfy.h"
# include "array.h"
/* memset belongs to string.h */
# include "string.h"
-# include "irnode_t.h"
#if USE_EXPICIT_PHI_IN_STACK
/* A stack needed for the automatic Phi node construction in constructor
- Phi_in. */
+ Phi_in. Redefinition in irgraph.c!! */
struct Phi_in_stack {
ir_node **stack;
int pos;
};
+typedef struct Phi_in_stack Phi_in_stack;
#endif
-/*********************************************** */
+/*** ******************************************** */
/** privat interfaces, for professional use only */
/* Constructs a Block with a fixed number of predecessors.
- Does not set current_block. */
-
+ Does not set current_block. Can not be used with automatic
+ Phi node construction. */
inline ir_node *
new_r_Block (ir_graph *irg, int arity, ir_node **in)
{
res = new_ir_node (irg, NULL, op_Block, mode_R, arity, in);
set_Block_matured(res, 1);
+ set_Block_block_visited(res, 0);
irn_vrfy (res);
return res;
return current_ir_graph->bad;
}
-/***********************/
+/** ********************/
/** public interfaces */
/** construction tools */
+/****f* ircons/new_Start
+ *
+ * NAME
+ * new_Start -- create a new Start node in the current block
+ *
+ * SYNOPSIS
+ * s = new_Start(void);
+ * ir_node* new_Start(void);
+ *
+ * RESULT
+ * s - pointer to the created Start node
+ *
+ ****
+ */
ir_node *
new_Start (void)
{
return res;
}
+/* Constructs a Block with a fixed number of predecessors.
+ Does set current_block. Can be used with automatic Phi
+ node construction. */
ir_node *
-new_Block (void)
+new_Block (int arity, ir_node **in)
{
ir_node *res;
- res = new_ir_node (current_ir_graph, NULL, op_Block, mode_R, -1, NULL);
+ res = new_r_Block (current_ir_graph, arity, in);
current_ir_graph->current_block = res;
- res->attr.block.matured = 0;
- set_Block_block_visited(res, 0);
-
- /* forget this optimization. use this only if mature !!!!
- res = optimize (res); */
- irn_vrfy (res);
- /** create a new dynamic array, which stores all parameters in irnodes */
- /** using the same obstack as the whole irgraph */
+ /* Create and initialize array for Phi-node construction. */
res->attr.block.graph_arr = NEW_ARR_D (ir_node *, current_ir_graph->obst,
- current_ir_graph->params);
+ current_ir_graph->n_loc);
+ memset(res->attr.block.graph_arr, 0, sizeof(ir_node *)*current_ir_graph->n_loc);
- /** initialize the parameter array */
- memset(res->attr.block.graph_arr, 0, sizeof(ir_node *)*current_ir_graph->params);
+ res = optimize (res);
+ irn_vrfy (res);
return res;
}
-/*************************************************************************/
+/* ***********************************************************************/
/* Methods necessary for automatic Phi node creation */
/*
ir_node *phi_merge (ir_node *block, int pos, ir_mode *mode, ir_node **nin, int ins)
\|/ \|/
new_r_Phi0 new_r_Phi_in
-*****************************************************************************/
+* *************************************************************************** */
/* Creates a Phi node with 0 predecessors */
inline ir_node *
#endif /* USE_FAST_PHI_CONSTRUCTION */
-/****************************************************************************/
+/* ************************************************************************** */
/** Finalize a Block node, when all control flows are known. */
/** Acceptable parameters are only Block nodes. */
/* turn the dynamic in-array into a static one. */
ins = ARR_LEN (block->in)-1;
NEW_ARR_A (ir_node *, nin, ins);
+ /* @@@ something is strange here... why isn't the array copied? */
/* Traverse a chain of Phi nodes attached to this block and mature
these, too. **/
return current_ir_graph->bad;
}
-/*************************************************************************/
+/* ********************************************************************* */
/* Comfortable interface with automatic Phi node construction. */
/* (Uses also constructors of ?? interface, except new_Block. */
-/* add an adge to a jmp node */
+/* ********************************************************************* */
+
+/** Block construction **/
+/* immature Block without predecessors */
+ir_node *new_immBlock (void) {
+ ir_node *res;
+
+ /* creates a new dynamic in-array as length of in is -1 */
+ res = new_ir_node (current_ir_graph, NULL, op_Block, mode_R, -1, NULL);
+ current_ir_graph->current_block = res;
+ res->attr.block.matured = 0;
+ set_Block_block_visited(res, 0);
+
+ /* Create and initialize array for Phi-node construction. */
+ res->attr.block.graph_arr = NEW_ARR_D (ir_node *, current_ir_graph->obst,
+ current_ir_graph->n_loc);
+ memset(res->attr.block.graph_arr, 0, sizeof(ir_node *)*current_ir_graph->n_loc);
+
+ /* Immature block may not be optimized! */
+ irn_vrfy (res);
+
+ return res;
+}
+
+/* add an adge to a jmp/control flow node */
void
add_in_edge (ir_node *block, ir_node *jmp)
{
current_ir_graph->current_block = target;
}
-/****************************/
+/* ************************ */
/* parameter administration */
/* get a value from the parameter array from the current block by its index */
current_ir_graph->current_block->attr.block.graph_arr[0] = store;
}
-/*************************************************************************/
+/* ********************************************************************* */
/* initialize */
/* call once for each run of the library */