X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firopt_t.h;h=0345b738d1d80a4d96d14887da1ef4997baccb02;hb=69d11aa49aa17358468bbb2f5506ef5f009514e9;hp=cd2ea2f5b305069fd7f1b2948d53b2daf96251c0;hpb=eb08138c6b80c169945568e4414f491a9bc20388;p=libfirm diff --git a/ir/ir/iropt_t.h b/ir/ir/iropt_t.h index cd2ea2f5b..0345b738d 100644 --- a/ir/ir/iropt_t.h +++ b/ir/ir/iropt_t.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -17,43 +17,36 @@ * PURPOSE. */ -/* - * 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 - */ - /** - * @file iropt_t.h - * - * Declarations for optimizations intertwined with IR construction. - * - * @author Martin Trapp, Christian Schaefer + * @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 -#ifndef _IROPT_T_H_ -#define _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. @@ -67,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 @@ -90,19 +83,41 @@ ir_node *identify_remember(pset *value_table, ir_node *n); /** Visit each node in the value table of a graph. */ void visit_all_identities(ir_graph *irg, irg_walk_func visit, void *env); +/** + * Normalize a node by putting constants (and operands with larger + * node index) on the right (operator side). + * + * @param n The node to normalize + */ +void ir_normalize_node(ir_node *n); + 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; +static inline tarval * +value_of(const ir_node *n) { + return value_of_ptr(n); } /** @@ -116,4 +131,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