+/*
+ * 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.
+ */
+
/**
- * Project: libFIRM
- * File name: ir/opt/opt_osr.c
- * Purpose: Operator Strength Reduction, based on
- * Keith D. Cooper, L. Taylor Simpson, Christopher A. Vick
- * Author: Michael Beck
- * Modified by:
- * Created: 12.5.2006
- * CVS-ID: $Id$
- * Copyright: (c) 2006 Universität Karlsruhe
- * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
+ * @file
+ * @brief Operator Strength Reduction.
+ * @date 12.5.2006
+ * @author Michael Beck
+ * @version $Id$
+ * @summary
+ * Implementation of the Operator Strength Reduction algorithm
+ * by Keith D. Cooper, L. Taylor Simpson, Christopher A. Vick.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#ifdef HAVE_MALLOC_H
-#include <malloc.h>
-#endif
-#ifdef HAVE_ALLOCA_H
-#include <alloca.h>
-#endif
-
-#include "opt_osr.h"
+#include "iroptimize.h"
#include "irgraph.h"
#include "ircons.h"
#include "irop_t.h"
#include "irloop_t.h"
#include "array.h"
#include "firmstat.h"
+#include "xmalloc.h"
/** The debug handle. */
DEBUG_ONLY(static firm_dbg_module_t *dbg;)
* An entry in the (op, node, node) -> node map.
*/
typedef struct quadruple_t {
- opcode code; /**< the opcode of the reduced operation */
- ir_node *op1; /**< the first operand the reduced operation */
- ir_node *op2; /**< the second operand of the reduced operation */
+ ir_opcode code; /**< the opcode of the reduced operation */
+ ir_node *op1; /**< the first operand the reduced operation */
+ ir_node *op2; /**< the second operand of the reduced operation */
- ir_node *res; /**< the reduced operation */
+ ir_node *res; /**< the reduced operation */
} quadruple_t;
/**
* A LFTR edge.
*/
typedef struct LFTR_edge {
- ir_node *src; /**< the source node */
- ir_node *dst; /**< the destination node */
- opcode code; /**< the opcode that must be applied */
- ir_node *rc; /**< the region const that must be applied */
+ ir_node *src; /**< the source node */
+ ir_node *dst; /**< the destination node */
+ ir_opcode code; /**< the opcode that must be applied */
+ ir_node *rc; /**< the region const that must be applied */
} LFTR_edge;
/* forward */
static int LFTR_cmp(const void *e1, const void *e2, size_t size) {
const LFTR_edge *l1 = e1;
const LFTR_edge *l2 = e2;
+ (void) size;
return l1->src != l2->src;
}
/**
* Add a LFTR edge.
*/
-static void LFTR_add(ir_node *src, ir_node *dst, opcode code, ir_node *rc, iv_env *env) {
+static void LFTR_add(ir_node *src, ir_node *dst, ir_opcode code, ir_node *rc, iv_env *env) {
LFTR_edge key;
key.src = src;
static int quad_cmp(const void *e1, const void *e2, size_t size) {
const quadruple_t *c1 = e1;
const quadruple_t *c2 = e2;
+ (void) size;
return c1->code != c2->code || c1->op1 != c2->op1 || c1->op2 != c2->op2;
}
*
* @return the already reduced node or NULL if this operation is not yet reduced
*/
-static ir_node *search(opcode code, ir_node *op1, ir_node *op2, iv_env *env) {
+static ir_node *search(ir_opcode code, ir_node *op1, ir_node *op2, iv_env *env) {
quadruple_t key, *entry;
key.code = code;
* @param result the result of the reduced operation
* @param env the environment
*/
-static void add(opcode code, ir_node *op1, ir_node *op2, ir_node *result, iv_env *env) {
+static void add(ir_opcode code, ir_node *op1, ir_node *op2, ir_node *result, iv_env *env) {
quadruple_t key;
key.code = code;
*
* @return the newly created node
*/
-static ir_node *do_apply(opcode code, dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode) {
+static ir_node *do_apply(ir_opcode code, dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode) {
ir_graph *irg = current_ir_graph;
ir_node *result;
ir_node *block = find_location(get_nodes_block(op1), get_nodes_block(op2));
* @return the newly created node
*/
static ir_node *apply(ir_node *orig, ir_node *op1, ir_node *op2, iv_env *env) {
- opcode code = get_irn_opcode(orig);
+ ir_opcode code = get_irn_opcode(orig);
ir_node *result = search(code, op1, op2, env);
if (! result) {
* @return the reduced node
*/
static ir_node *reduce(ir_node *orig, ir_node *iv, ir_node *rc, iv_env *env) {
- opcode code = get_irn_opcode(orig);
+ ir_opcode code = get_irn_opcode(orig);
ir_node *result = search(code, iv, rc, env);
if (! result) {
* @return non-zero if irn should be Replace'd
*/
static int check_replace(ir_node *irn, iv_env *env) {
- ir_node *left, *right, *iv, *rc;
- ir_op *op = get_irn_op(irn);
- opcode code = get_op_code(op);
- ir_node *liv, *riv;
+ ir_node *left, *right, *iv, *rc;
+ ir_op *op = get_irn_op(irn);
+ ir_opcode code = get_op_code(op);
+ ir_node *liv, *riv;
switch (code) {
case iro_Mul:
*/
static void clear_and_fix(ir_node *irn, void *env)
{
+ (void) env;
set_irn_link(irn, NULL);
if (is_Proj(irn)) {