becopyheur2: Cache the admissible registers eagerly.
[libfirm] / ir / ir / instrument.c
index c64e3a6..9c569ee 100644 (file)
@@ -1,20 +1,6 @@
 /*
- * 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.
+ * Copyright (C) 2012 University of Karlsruhe.
  */
 
 /**
@@ -22,7 +8,6 @@
  * @brief   Instrumentation of graphs.
  * @date    14.4.2008
  * @author  Michael Beck
- * @version $Id$
  */
 #include "config.h"
 
 #include "ircons.h"
 #include "instrument.h"
 
-/**
- * Adds a Call at the beginning of the given irg.
- */
 void instrument_initcall(ir_graph *irg, ir_entity *ent)
 {
-       const ir_edge_t *edge;
-       ir_node         *initial_exec;
-       ir_node         *initial_mem;
-       ir_node         *start_block;
-       ir_node         *adr, *call, *new_mem;
-       ir_node         *first_block = NULL;
+       ir_node        *initial_exec;
+       ir_node        *first_block = NULL;
        int             i, idx, need_new_block;
        symconst_symbol sym;
 
-       edges_assure(irg);
+       assure_edges(irg);
 
        /* find the first block */
        initial_exec = get_irg_initial_exec(irg);
-       start_block  = get_irg_start_block(irg);
 
        foreach_out_edge(initial_exec, edge) {
                ir_node *succ = get_edge_src_irn(edge);
 
-               if (succ != start_block && is_Block(succ)) {
+               if (is_Block(succ)) {
                        /* found the first block */
                        first_block = succ;
                        break;
@@ -87,14 +64,12 @@ void instrument_initcall(ir_graph *irg, ir_entity *ent)
 
        /* place the call */
        sym.entity_p = ent;
-       adr = new_r_SymConst(irg, mode_P_code, sym, symconst_addr_ent);
-
-       call    = new_r_Call(first_block, get_irg_no_mem(irg), adr, 0, NULL, get_entity_type(ent));
-       new_mem = new_r_Proj(call, mode_M, pn_Call_M);
+       ir_node *const adr         = new_r_SymConst(irg, mode_P_code, sym, symconst_addr_ent);
+       ir_node *const initial_mem = get_irg_initial_mem(irg);
+       ir_node *const call        = new_r_Call(first_block, initial_mem, adr, 0, NULL, get_entity_type(ent));
+       ir_node *const new_mem     = new_r_Proj(call, mode_M, pn_Call_M);
 
-       initial_mem = get_irg_initial_mem(irg);
-       edges_reroute(initial_mem, new_mem, irg);
+       edges_reroute_except(initial_mem, new_mem, call);
        /* beware: reroute routes anchor edges also, revert this */
        set_irg_initial_mem(irg, initial_mem);
-       set_Call_mem(call, initial_mem);
 }