Undo r16291.
[libfirm] / ir / opt / opt_osr.c
index 9b48729..27d34e9 100644 (file)
@@ -1,27 +1,37 @@
+/*
+ * 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"
@@ -40,6 +50,7 @@
 #include "irloop_t.h"
 #include "array.h"
 #include "firmstat.h"
+#include "xmalloc.h"
 
 /** The debug handle. */
 DEBUG_ONLY(static firm_dbg_module_t *dbg;)
@@ -79,22 +90,22 @@ typedef struct iv_env {
 /**
  * An entry in the (op, node, node) -> node map.
  */
-typedef struct quad_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 */
+typedef struct quadruple_t {
+       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 */
-} quad_t;
+       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 */
@@ -106,10 +117,12 @@ static ir_node *reduce(ir_node *orig, ir_node *iv, ir_node *rc, iv_env *env);
 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;
 }
 
+#if 0
 /**
  * Find a LFTR edge.
  */
@@ -120,11 +133,12 @@ static LFTR_edge *LFTR_find(ir_node *src, iv_env *env) {
 
        return set_find(env->lftr_edges, &key, sizeof(key), HASH_PTR(src));
 }
+#endif
 
 /**
  * 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;
@@ -183,8 +197,9 @@ static int is_rc(ir_node *irn, ir_node *header_block) {
  * Set compare function for the quad set.
  */
 static int quad_cmp(const void *e1, const void *e2, size_t size) {
-       const quad_t *c1 = e1;
-       const quad_t *c2 = e2;
+       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;
 }
@@ -199,8 +214,8 @@ static int quad_cmp(const void *e1, const void *e2, size_t size) {
  *
  * @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) {
-       quad_t key, *entry;
+static ir_node *search(ir_opcode code, ir_node *op1, ir_node *op2, iv_env *env) {
+       quadruple_t key, *entry;
 
        key.code = code;
        key.op1 = op1;
@@ -222,8 +237,8 @@ static ir_node *search(opcode code, ir_node *op1, ir_node *op2, iv_env *env) {
  * @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) {
-       quad_t key;
+static void add(ir_opcode code, ir_node *op1, ir_node *op2, ir_node *result, iv_env *env) {
+       quadruple_t key;
 
        key.code = code;
        key.op1  = op1;
@@ -263,7 +278,7 @@ static ir_node *find_location(ir_node *block1, ir_node *block2) {
  *
  * @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));
@@ -297,7 +312,7 @@ static ir_node *do_apply(opcode code, dbg_info *db, ir_node *op1, ir_node *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) {
@@ -330,7 +345,7 @@ static ir_node *apply(ir_node *orig, ir_node *op1, ir_node *op2, iv_env *env) {
  * @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) {
@@ -340,8 +355,8 @@ static ir_node *reduce(ir_node *orig, ir_node *iv, ir_node *rc, iv_env *env) {
 
                result = exact_copy(iv);
 
-               /* Beware: we must always create a new nduction variable with the same mode
-                  as the node we are replacing. Espicially this means the mode might be changed
+               /* Beware: we must always create a new induction variable with the same mode
+                  as the node we are replacing. Especially this means the mode might be changed
                   from P to I and back. This is always possible, because we have only Phi, Add
                   and Sub nodes. */
                set_irn_mode(result, mode);
@@ -420,10 +435,10 @@ static int replace(ir_node *irn, ir_node *iv, ir_node *rc, iv_env *env) {
  * @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:
@@ -822,6 +837,7 @@ static void assign_po(ir_node *block, void *ctx) {
        e->POnum = env->POnum++;
 }
 
+#if 0
 /**
  * Follows the LFTR edges and return the last node in the chain.
  *
@@ -993,6 +1009,7 @@ static void do_lftr(ir_node *cmp, void *ctx) {
 static void lftr(ir_graph *irg, iv_env *env) {
        irg_walk_graph(irg, NULL, do_lftr, env);
 }
+#endif
 
 /**
  * Pre-walker: set all node links to NULL and fix the
@@ -1000,11 +1017,12 @@ static void lftr(ir_graph *irg, iv_env *env) {
  */
 static void clear_and_fix(ir_node *irn, void *env)
 {
+       (void) env;
        set_irn_link(irn, NULL);
 
        if (is_Proj(irn)) {
                ir_node *pred = get_Proj_pred(irn);
-               set_irn_n(irn, -1, get_irn_n(pred, -1));
+               set_nodes_block(irn, get_nodes_block(pred));
        }
 }
 
@@ -1111,6 +1129,7 @@ void remove_phi_cycles(ir_graph *irg) {
 
        if (env.replaced) {
                set_irg_outs_inconsistent(irg);
+                DB((dbg, LEVEL_1, "remove_phi_cycles: %u Cycles removed\n\n", env.replaced));
        }
 
        DEL_ARR_F(env.stack);