fix bad proj optimisation, fix loads missing the result proj
[libfirm] / ir / be / beilpsched.c
index 61a9726..f1b372b 100644 (file)
@@ -1,13 +1,33 @@
+/*
+ * 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.
+ */
+
 /**
- * Scheduling algorithms.
+ * @file
+ * @brief       ILP based instruction scheduling.
+ * @author      Christian Wuerdig
+ * @date        22.10.2006
+ * @version     $Id$
+ *
  * An ILP scheduler based on
  * "ILP-based Instruction Scheduling for IA-64"
  * by Daniel Kaestner and Sebastian Winkel
  * extended with register pressure constraints by Christian Wuerdig
- *
- * @date   22.10.2005
- * @author Christian Wuerdig
- * @cvs-id $Id$
  */
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -31,6 +51,7 @@
 #include "debug.h"
 #include "irtools.h"
 #include "irdump.h"
+#include "irprintf.h"
 #include "plist.h"
 #include "irprintf.h"
 
@@ -47,6 +68,8 @@
 #include "beilpsched.h"
 #include "beutil.h"
 #include "bestat.h"
+#include "beirg_t.h"
+#include "benodesets.h"
 
 typedef struct _ilpsched_options_t {
        unsigned regpress;
@@ -121,7 +144,7 @@ typedef struct {
 
 /* The ILP scheduling environment */
 typedef struct {
-       phase_t              ph;            /**< The phase */
+       ir_phase             ph;            /**< The phase */
        ir_graph             *irg;          /**< The current irg */
        heights_t            *height;       /**< The heights object of the irg */
        void                 *irg_env;      /**< An environment for the irg scheduling, provided by the backend */
@@ -258,7 +281,7 @@ static int cmp_ilpsched_irn(const void *a, const void *b) {
 /**
  * In case there is no phase information for irn, initialize it.
  */
-static void *init_ilpsched_irn(phase_t *ph, ir_node *irn, void *old) {
+static void *init_ilpsched_irn(ir_phase *ph, ir_node *irn, void *old) {
        be_ilpsched_irn_t *res = old ? old : phase_alloc(ph, sizeof(res[0]));
 
        if (res == old) {
@@ -1144,7 +1167,7 @@ static void create_assignment_and_precedence_constraints(be_ilpsched_env_t *env,
 
        num_cst_assign = num_cst_prec = num_cst_dead = 0;
        foreach_linked_irns(ba->head_ilp_nodes, irn) {
-               int                  cst, tp_idx, i;
+               int                  cst, tp_idx;
                unsigned             cur_var;
                be_ilpsched_irn_t    *node;
                ilpsched_node_attr_t *na;
@@ -1995,9 +2018,11 @@ static void create_ilp(ir_node *block, void *walk_env) {
  */
 void be_ilp_sched(const be_irg_t *birg, be_options_t *be_opts) {
        be_ilpsched_env_t          env;
-       const char                 *name = "be ilp scheduling";
-       arch_isa_t                 *isa  = birg->main_env->arch_env->isa;
-       const ilp_sched_selector_t *sel  = isa->impl->get_ilp_sched_selector(isa);
+       const char                 *name     = "be ilp scheduling";
+       ir_graph                   *irg      = be_get_birg_irg(birg);
+       const arch_env_t           *arch_env = be_get_birg_arch_env(birg);
+       const arch_isa_t           *isa      = arch_env->isa;
+       const ilp_sched_selector_t *sel      = isa->impl->get_ilp_sched_selector(isa);
 
        FIRM_DBG_REGISTER(env.dbg, "firm.be.sched.ilp");
 
@@ -2010,17 +2035,17 @@ void be_ilp_sched(const be_irg_t *birg, be_options_t *be_opts) {
 
 //     firm_dbg_set_mask(env.dbg, 1);
 
-       env.irg_env    = be_ilp_sched_init_irg_ilp_schedule(sel, birg->irg);
+       env.irg_env    = be_ilp_sched_init_irg_ilp_schedule(sel, irg);
        env.sel        = sel;
-       env.irg        = birg->irg;
-       env.height     = heights_new(birg->irg);
+       env.irg        = irg;
+       env.height     = heights_new(irg);
        env.main_env   = birg->main_env;
-       env.arch_env   = birg->main_env->arch_env;
-       env.cpu        = arch_isa_get_machine(birg->main_env->arch_env->isa);
+       env.arch_env   = arch_env;
+       env.cpu        = arch_isa_get_machine(arch_env->isa);
        env.opts       = &ilp_opts;
        env.birg       = birg;
        env.be_opts    = be_opts;
-       phase_init(&env.ph, name, env.irg, PHASE_DEFAULT_GROWTH, init_ilpsched_irn);
+       phase_init(&env.ph, name, env.irg, PHASE_DEFAULT_GROWTH, init_ilpsched_irn, NULL);
 
        /* assign a unique per block number to all interesting nodes */
        irg_walk_in_or_dep_graph(env.irg, NULL, build_block_idx, &env);