X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firopt_t.h;h=196454ca001ee6bd00488d897fc4f5a22b1db6f1;hb=7c36344d22a7c306a4e216f135c974bdb9f6b943;hp=2bb29b0a20805883edf24e4ce3b168f3571f267b;hpb=328ae18da3e796f4f9fda2aba629cc34e2849ed7;p=libfirm diff --git a/ir/ir/iropt_t.h b/ir/ir/iropt_t.h index 2bb29b0a2..196454ca0 100644 --- a/ir/ir/iropt_t.h +++ b/ir/ir/iropt_t.h @@ -1,22 +1,167 @@ -/* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe -** All rights reserved. -** -** Authors: Martin Trapp, Christian Schaefer -** -** Declarations for optimizations intertwined with IR construction. -*/ +/* + * Copyright (C) 1995-2008 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. + */ -/* $Id$ */ +/** + * @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 +#include "irop_t.h" +#include "iropt.h" +#include "irnode_t.h" +#include "pset.h" +#include "tv.h" -# include "pset.h" -# include "iropt.h" +/** + * Calculate a hash value of a node. + * + * @param node The IR-node + */ +unsigned ir_node_hash(const ir_node *node); -pset *new_identities (void); -void del_identities (pset *value_table); -void add_identity (pset *value_table, ir_node *node); -ir_node *optimize_in_place_2 (ir_node *n); +/** + * 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); -# endif /* _IROPT_T_H_ */ +/** + * Creates a new value table used for storing CSE identities. + * The value table is used to identify common expressions. + * + */ +pset *new_identities(void); + +/** + * Deletes a identities value table. + * + * @param value_table the identity set + */ +void del_identities(pset *value_table); + +/** + * Add a node to the identities value table. + */ +void add_identities(pset *value_table, ir_node *node); + +/** + * Compare function for two nodes in the hash table. Gets two + * nodes as parameters. Returns 0 if the nodes are a cse. + */ +int identities_cmp(const void *elt, const void *key); + +/** + * Return the canonical node computing the same value as n. + * Looks up the node in a hash table, enters it in the table + * if it isn't there yet. + */ +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); + +/** + * 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(const ir_node *n) +{ + return value_of_ptr(n); +} + +/** + * Sets the default operations for an ir_op_ops. + * + * @param code the opcode for the default operation + * @param ops the operations initialized + * + * @return + * The operations. + */ +ir_op_ops *firm_set_default_operations(ir_opcode code, ir_op_ops *ops); + +/** + * Returns true if a == -b + */ +bool is_negated_value(ir_node *a, ir_node *b); + + + +/** NOTE: Survive DCE is considered a bad hack - don't use */ +typedef struct _survive_dce_t survive_dce_t; + +/** + * Make a new Survive DCE environment. + * NOTE: Survive DCE is considered a bad hack - don't use + */ +survive_dce_t *new_survive_dce(void); + +/** + * Free a Survive DCE environment. + * NOTE: Survive DCE is considered a bad hack - don't use + */ +void free_survive_dce(survive_dce_t *sd); + +/** + * Register a node pointer to be patched upon DCE. + * When DCE occurs, the node pointer specified by @p place will be + * patched to the new address of the node it is pointing to. + * + * @param sd The Survive DCE environment. + * @param place The address of the node pointer. + */ +void survive_dce_register_irn(survive_dce_t *sd, ir_node **place); + +#endif