cosmetic change
[libfirm] / ir / ir / irgraph.c
index f9454a1..ef4526b 100644 (file)
@@ -1,15 +1,28 @@
 /*
- * Project:     libFIRM
- * File name:   ir/ir/irgraph.c
- * Purpose:     Entry point to the representation of procedure code.
- * Author:      Martin Trapp, Christian Schaefer
- * Modified by: Goetz Lindenmaier
- * Created:
- * CVS-ID:      $Id$
- * Copyright:   (c) 1998-2003 Universität Karlsruhe
- * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
+ * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
+ *
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
+ *
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
  */
 
+/**
+ * @file
+ * @brief    Entry point to the representation of procedure code.
+ * @author   Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Michael Beck
+ * @version  $Id$
+ */
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
@@ -17,8 +30,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"
 #include "irflag_t.h"
 #include "array.h"
 #include "irgmod.h"
-#include "mangle.h"
 #include "irouts.h"
 #include "irhooks.h"
 #include "irtools.h"
 #include "irgwalk.h"
 #include "iredges_t.h"
 #include "type_t.h"
+#include "irmemory.h"
+
+#define INITIAL_IDX_IRN_MAP_SIZE 1024
 
 /**
  * Indicates, whether additional data can be registered to graphs.
@@ -127,7 +143,7 @@ void free_Phi_in_stack(Phi_in_stack *s);
    and optimization.
 */
 ir_graph *
-new_r_ir_graph (entity *ent, int n_loc)
+new_r_ir_graph (ir_entity *ent, int n_loc)
 {
   ir_graph *res;
   ir_node  *first_block;
@@ -136,7 +152,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);
@@ -192,9 +213,12 @@ new_r_ir_graph (entity *ent, int n_loc)
   set_irp_typeinfo_inconsistent();           /* there is a new graph with typeinfo_none. */
   res->callee_info_state   = irg_callee_info_none;
   res->loopinfo_state      = loopinfo_none;
-  res->execfreq_state      = exec_freq_none;
   res->class_cast_state    = ir_class_casts_transitive;
   res->extblk_state        = ir_extblk_info_none;
+  res->execfreq_state      = exec_freq_none;
+  res->fp_model            = fp_model_precise;
+  res->adr_taken_state     = ir_address_taken_not_computed;
+  res->mem_disambig_opt    = aa_opt_inherited;
 
   /*-- Type information for the procedure of the graph --*/
   res->ent = ent;
@@ -218,11 +242,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);
@@ -238,13 +264,13 @@ 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->method_execution_frequency = -1.0;
   res->estimated_node_count       = 0;
 
   return res;
@@ -252,14 +278,14 @@ new_r_ir_graph (entity *ent, int n_loc)
 
 
 ir_graph *
-new_ir_graph (entity *ent, int n_loc)
+new_ir_graph(ir_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;
@@ -267,6 +293,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);
 
@@ -287,6 +317,7 @@ ir_graph *new_const_code_irg(void) {
   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
@@ -350,7 +381,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);
@@ -468,6 +499,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);
@@ -488,6 +529,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);
@@ -528,13 +579,13 @@ void
   _set_irg_current_block(irg, node);
 }
 
-entity *
+ir_entity *
 (get_irg_entity)(const ir_graph *irg) {
   return _get_irg_entity(irg);
 }
 
 void
-(set_irg_entity)(ir_graph *irg, entity *ent) {
+(set_irg_entity)(ir_graph *irg, ir_entity *ent) {
   _set_irg_entity(irg, ent);
 }
 
@@ -786,6 +837,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
@@ -796,6 +856,7 @@ void
  */
 static void normalize_proj_walker(ir_node *n, void *env)
 {
+  (void) env;
   if (is_Proj(n)) {
     ir_node *pred  = get_Proj_pred(n);
     ir_node *block = get_nodes_block(pred);
@@ -805,15 +866,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)
@@ -823,12 +882,57 @@ 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;
 }
 
+#ifndef NDEBUG
+void set_using_block_visited(ir_graph *irg) {
+       assert(irg->using_block_visited == 0);
+       irg->using_block_visited = 1;
+}
+
+void clear_using_block_visited(ir_graph *irg) {
+       assert(irg->using_block_visited == 1);
+       irg->using_block_visited = 0;
+}
+
+int using_block_visited(const ir_graph *irg) {
+       return irg->using_block_visited;
+}
+
+
+void set_using_visited(ir_graph *irg) {
+       assert(irg->using_visited == 0);
+       irg->using_visited = 1;
+}
+
+void clear_using_visited(ir_graph *irg) {
+       assert(irg->using_visited == 1);
+       irg->using_visited = 0;
+}
+
+int using_visited(const ir_graph *irg) {
+       return irg->using_visited;
+}
+
+
+void set_using_irn_link(ir_graph *irg) {
+       assert(irg->using_irn_link == 0);
+       irg->using_irn_link = 1;
+}
+
+void clear_using_irn_link(ir_graph *irg) {
+       assert(irg->using_irn_link == 1);
+       irg->using_irn_link = 0;
+}
+
+int using_irn_link(const ir_graph *irg) {
+       return irg->using_irn_link;
+}
+#endif
+
 /* Returns a estimated node count of the irg. */
 unsigned (get_irg_estimated_node_cnt)(const ir_graph *irg) {
   return _get_irg_estimated_node_cnt(irg);