Use is_Bad() where appropriate
[libfirm] / ir / ir / irgraph.c
index 7d40491..76a0925 100644 (file)
@@ -17,8 +17,9 @@
 #ifdef HAVE_STRING_H
 # include <string.h>
 #endif
-
-#include <stddef.h>
+#ifdef HAVE_STDDEF_H
+# include <stddef.h>
+#endif
 
 #include "xmalloc.h"
 #include "ircons.h"
@@ -37,6 +38,8 @@
 #include "iredges_t.h"
 #include "type_t.h"
 
+#define INITIAL_IDX_IRN_MAP_SIZE 1024
+
 /**
  * Indicates, whether additional data can be registered to graphs.
  * If set to 1, this is not possible anymore.
@@ -136,7 +139,12 @@ new_r_ir_graph (entity *ent, int n_loc)
   res = alloc_graph();
   res->kind = k_ir_graph;
 
-  edges_init_graph(res);
+  //edges_init_graph_kind(res, EDGE_KIND_NORMAL);
+  //edges_init_graph_kind(res, EDGE_KIND_BLOCK);
+
+  /* initialize the idx->node map. */
+  res->idx_irn_map = NEW_ARR_F(ir_node *, INITIAL_IDX_IRN_MAP_SIZE);
+  memset(res->idx_irn_map, 0, INITIAL_IDX_IRN_MAP_SIZE * sizeof(res->idx_irn_map[0]));
 
   /* inform statistics here, as blocks will be already build on this graph */
   hook_new_graph(res, ent);
@@ -173,6 +181,8 @@ new_r_ir_graph (entity *ent, int n_loc)
   obstack_init(res->obst);
   res->extbb_obst = NULL;
 
+  res->last_node_idx = 0;
+
   res->value_table = new_identities (); /* value table for global value
                        numbering for optimizing use in
                        iropt.c */
@@ -193,6 +203,7 @@ new_r_ir_graph (entity *ent, int n_loc)
   res->execfreq_state      = exec_freq_none;
   res->class_cast_state    = ir_class_casts_transitive;
   res->extblk_state        = ir_extblk_info_none;
+  res->fp_model            = fp_model_precise;
 
   /*-- Type information for the procedure of the graph --*/
   res->ent = ent;
@@ -216,11 +227,13 @@ new_r_ir_graph (entity *ent, int n_loc)
   set_irg_start      (res, start);
 
   /* Proj results of start node */
-  projX              = new_Proj(start, mode_X, pn_Start_X_initial_exec);
-  set_irg_frame      (res, new_Proj(start, mode_P_data, pn_Start_P_frame_base));
-  set_irg_globals    (res, new_Proj(start, mode_P_data, pn_Start_P_globals));
-  set_irg_args       (res, new_Proj(start, mode_T, pn_Start_T_args));
-  initial_mem        = new_Proj(start, mode_M, pn_Start_M);
+  projX                   = new_Proj(start, mode_X, pn_Start_X_initial_exec);
+  set_irg_frame           (res, new_Proj(start, mode_P_data, pn_Start_P_frame_base));
+  set_irg_globals         (res, new_Proj(start, mode_P_data, pn_Start_P_globals));
+  set_irg_tls             (res, new_Proj(start, mode_P_data, pn_Start_P_tls));
+  set_irg_args            (res, new_Proj(start, mode_T,      pn_Start_T_args));
+  set_irg_value_param_base(res, new_Proj(start, mode_P_data, pn_Start_P_value_arg_base));
+  initial_mem             = new_Proj(start, mode_M, pn_Start_M);
   set_irg_initial_mem(res, initial_mem);
 
   add_immBlock_pred(start_block, projX);
@@ -236,11 +249,11 @@ new_r_ir_graph (entity *ent, int n_loc)
    * Use of this edge is matter of discussion, unresolved. Also possible:
    * add_immBlock_pred(res->start_block, res->start_block), but invalid typed.
    */
-  mature_immBlock (res->current_block);
+  mature_immBlock(res->current_block);
 
   /*-- Make a block to start with --*/
   first_block = new_immBlock();
-  add_immBlock_pred (first_block, projX);
+  add_immBlock_pred(first_block, projX);
 
   res->method_execution_frequency = -1;
   res->estimated_node_count       = 0;
@@ -250,14 +263,14 @@ new_r_ir_graph (entity *ent, int n_loc)
 
 
 ir_graph *
-new_ir_graph (entity *ent, int n_loc)
+new_ir_graph(entity *ent, int n_loc)
 {
-  ir_graph *res = new_r_ir_graph (ent, n_loc);
+  ir_graph *res = new_r_ir_graph(ent, n_loc);
   add_irp_irg(res);          /* remember this graph global. */
   return res;
 }
 
-/* Make a rudimentary ir graph for the constant code.
+/* Make a rudimentary IR graph for the constant code.
    Must look like a correct irg, spare everything else. */
 ir_graph *new_const_code_irg(void) {
   ir_graph *res;
@@ -265,6 +278,10 @@ ir_graph *new_const_code_irg(void) {
 
   res = alloc_graph();
 
+  /* initialize the idx->node map. */
+  res->idx_irn_map = NEW_ARR_F(ir_node *, INITIAL_IDX_IRN_MAP_SIZE);
+  memset(res->idx_irn_map, 0, INITIAL_IDX_IRN_MAP_SIZE * sizeof(res->idx_irn_map[0]));
+
   /* inform statistics here, as blocks will be already build on this graph */
   hook_new_graph(res, NULL);
 
@@ -280,9 +297,12 @@ ir_graph *new_const_code_irg(void) {
   obstack_init (res->obst);
   res->extbb_obst = NULL;
 
+  res->last_node_idx = 0;
+
   res->phase_state      = phase_building;
   res->irg_pinned_state = op_pin_state_pinned;
   res->extblk_state     = ir_extblk_info_none;
+  res->fp_model         = fp_model_precise;
 
   res->value_table = new_identities (); /* value table for global value
                        numbering for optimizing use in
@@ -346,7 +366,7 @@ void free_ir_graph (ir_graph *irg) {
   if (irg->frame_type)  free_type(irg->frame_type);
   if (irg->value_table) del_identities(irg->value_table);
   if (irg->ent) {
-    peculiarity pec = get_entity_peculiarity (irg->ent);
+    ir_peculiarity pec = get_entity_peculiarity (irg->ent);
     set_entity_peculiarity (irg->ent, peculiarity_description);
     set_entity_irg(irg->ent, NULL);  /* not set in const code irg */
     set_entity_peculiarity (irg->ent, pec);
@@ -464,6 +484,16 @@ void
   _set_irg_globals(irg, node);
 }
 
+ir_node *
+(get_irg_tls)(const ir_graph *irg) {
+  return _get_irg_tls(irg);
+}
+
+void
+(set_irg_tls)(ir_graph *irg, ir_node *node) {
+  _set_irg_tls(irg, node);
+}
+
 ir_node *
 (get_irg_initial_mem)(const ir_graph *irg) {
   return _get_irg_initial_mem(irg);
@@ -484,6 +514,16 @@ void
   _set_irg_args(irg, node);
 }
 
+ir_node *
+(get_irg_value_param_base)(const ir_graph *irg) {
+  return _get_irg_value_param_base(irg);
+}
+
+void
+(set_irg_value_param_base)(ir_graph *irg, ir_node *node) {
+  _set_irg_value_param_base(irg, node);
+}
+
 ir_node **
 (get_irg_proj_args) (const ir_graph *irg) {
   return _get_irg_proj_args (irg);
@@ -782,6 +822,15 @@ void
   _inc_irg_block_visited(irg);
 }
 
+/* Return the floating point model of this graph. */
+unsigned (get_irg_fp_model)(const ir_graph *irg) {
+  return _get_irg_fp_model(irg);
+}
+
+/* Sets the floating point model for this graph. */
+void set_irg_fp_model(ir_graph *irg, unsigned model) {
+  irg->fp_model = model;
+}
 
 /**
  * walker Start->End: places Proj nodes into the same block
@@ -790,8 +839,7 @@ void
  * @param n    the node
  * @param env  ignored
  */
-static void normalize_proj_walker(ir_node *n, void *env)
-{
+static void normalize_proj_walker(ir_node *n, void *env){
   if (is_Proj(n)) {
     ir_node *pred  = get_Proj_pred(n);
     ir_node *block = get_nodes_block(pred);
@@ -801,15 +849,13 @@ static void normalize_proj_walker(ir_node *n, void *env)
 }
 
 /* move Proj nodes into the same block as its predecessors */
-void normalize_proj_nodes(ir_graph *irg)
-{
+void normalize_proj_nodes(ir_graph *irg) {
   irg_walk_graph(irg, NULL, normalize_proj_walker, NULL);
   set_irg_outs_inconsistent(irg);
 }
 
 /* set a description for local value n */
-void set_irg_loc_description(ir_graph *irg, int n, void *description)
-{
+void set_irg_loc_description(ir_graph *irg, int n, void *description) {
   assert(0 <= n && n < irg->n_loc);
 
   if (! irg->loc_descriptions)
@@ -819,8 +865,7 @@ void set_irg_loc_description(ir_graph *irg, int n, void *description)
 }
 
 /* get the description for local value n */
-void *get_irg_loc_description(ir_graph *irg, int n)
-{
+void *get_irg_loc_description(ir_graph *irg, int n) {
   assert(0 <= n && n < irg->n_loc);
   return irg->loc_descriptions ? irg->loc_descriptions[n] : NULL;
 }
@@ -830,6 +875,11 @@ unsigned (get_irg_estimated_node_cnt)(const ir_graph *irg) {
   return _get_irg_estimated_node_cnt(irg);
 }
 
+/* Returns the last irn index for this graph. */
+unsigned get_irg_last_idx(const ir_graph *irg) {
+  return irg->last_node_idx;
+}
+
 /* register additional space in an IR graph */
 size_t register_additional_graph_data(size_t size)
 {