Include limits.h for LONG_{MAX,MIN}.
[libfirm] / ir / ir / iropt_t.h
index c80f808..93267ae 100644 (file)
@@ -1,41 +1,52 @@
 /*
- * Project:     libFIRM
- * File name:   ir/ir/iropt_t.h
- * Purpose:     iropt --- optimizations intertwined with IR construction -- private header.
- * Author:      Martin Trapp, Christian Schaefer
- * Modified by: Goetz Lindenmaier, Michael Beck
- * Created:
- * CVS-ID:      $Id$
- * Copyright:   (c) 1998-2003 Universität Karlsruhe
- * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
- */
-
-/**
- * @file iropt_t.h
+ * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
  *
- * Declarations for optimizations intertwined with IR construction.
+ * This file is part of libFirm.
  *
- * @author Martin Trapp, Christian Schaefer
+ * 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.
  */
 
-#ifndef _IROPT_T_H_
-#define _IROPT_T_H_
+/**
+ * @file
+ * @brief    iropt --- optimizations intertwined with IR construction -- private header.
+ * @author   Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Michael Beck
+ * @version  $Id$
+ */
+#ifndef FIRM_IR_IROPT_T_H
+#define FIRM_IR_IROPT_T_H
 
+#include "irop_t.h"
 #include "iropt.h"
 #include "irnode_t.h"
 #include "pset.h"
 #include "tv.h"
 
-ir_node *equivalent_node(ir_node *n);
-
 /**
  * Calculate a hash value of a node.
- * The hash value is calculated from the nodes predecessors.
- * Special handling for Const and SymConst nodes (these don't have predecessors).
  *
  * @param node  The IR-node
  */
-unsigned ir_node_hash(ir_node *node);
+unsigned ir_node_hash(const ir_node *node);
+
+/**
+ * equivalent_node() returns a node equivalent to input n. It skips all nodes that
+ * perform no actual computation, as, e.g., the Id nodes.  It does not create
+ * new nodes.  It is therefore safe to free n if the node returned is not n.
+ * If a node returns a Tuple we can not just skip it.  If the size of the
+ * in array fits, we transform n into a tuple (e.g., Div).
+ */
+ir_node *equivalent_node(ir_node *n);
 
 /**
  * Creates a new value table used for storing CSE identities.
@@ -49,12 +60,12 @@ pset *new_identities(void);
  *
  * @param value_table  the identity set
  */
-void  del_identities(pset *value_table);
+void del_identities(pset *value_table);
 
 /**
  * Add a node to the identities value table.
  */
-void  add_identities(pset *value_table, ir_node *node);
+void add_identities(pset *value_table, ir_node *node);
 
 /**
  * Compare function for two nodes in the hash table. Gets two
@@ -77,14 +88,28 @@ ir_node *optimize_node(ir_node *n);
 ir_node *optimize_in_place_2(ir_node *n);
 
 /**
- * Returns the tarval of a Const node or tarval_bad for all other nodes.
+ * The value_of operation.
+ * This operation returns for every IR node an associated tarval if existing,
+ * returning tarval_bad otherwise.
+ * No calculations are done here, just a lookup.
+ */
+typedef tarval *(*value_of_func)(const ir_node *self);
+
+extern value_of_func value_of_ptr;
+
+/**
+ * Set a new value_of function.
+ *
+ * @param func  the function, NULL restores the default behavior
+ */
+void set_value_of_func(value_of_func func);
+
+/**
+ * Returns the associated tarval of a node.
  */
 static INLINE tarval *
-value_of(ir_node *n) {
-  if ((n != NULL) && (get_irn_op(n) == op_Const))
-    return get_Const_tarval(n); /* might return tarval_bad */
-  else
-    return tarval_bad;
+value_of(const ir_node *n) {
+       return value_of_ptr(n);
 }
 
 /**
@@ -98,4 +123,4 @@ value_of(ir_node *n) {
  */
 ir_op_ops *firm_set_default_operations(ir_opcode code, ir_op_ops *ops);
 
-#endif /* _IROPT_T_H_ */
+#endif