d3982c860f0c484123643ace9d3e89fae64e53d4
[libfirm] / ir / ir / irssacons.c
1 /*
2  * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief   restarting SSA construction for values.
23  * @author  Michael Beck
24  * @version $Id$
25  */
26 #include "config.h"
27
28 #include "ircons_t.h"
29 #include "irgraph_t.h"
30 #include "irnode_t.h"
31 #include "irgwalk.h"
32
33 /**
34  * Post-walker: prepare the graph nodes for new SSA construction cycle by
35  * allocation new arrays.
36  */
37 static void prepare_blocks(ir_node *irn, void *env)
38 {
39         (void)env;
40         unsigned        n_loc = current_ir_graph->n_loc;
41         struct obstack *obst  = current_ir_graph->obst;
42         /* reset mature flag */
43         set_Block_matured(irn, 0);
44         irn->attr.block.graph_arr  = NEW_ARR_D(ir_node *, obst, n_loc);
45         memset(irn->attr.block.graph_arr, 0, sizeof(ir_node*) * n_loc);
46         irn->attr.block.phis       = NULL;
47 }
48
49 /*
50  * Restarts SSA construction on the given graph with n_loc
51  * new values.
52  *
53  * @param irg    the graph on which the SSA construction is restarted
54  * @param n_loc  number of new variables
55  *
56  * After this function is complete, the graph is in phase_building
57  * again and set_value()/get_value() and mature_block() can be used
58  * to construct new values.
59  */
60 void ssa_cons_start(ir_graph *irg, int n_loc)
61 {
62         /* for now we support only phase_high graphs */
63         assert(irg->phase_state == phase_high);
64
65         /* reset the phase to phase building: some optimization might depend on it */
66         set_irg_phase_state(irg, phase_building);
67
68         irg_set_nloc(irg, n_loc);
69
70         /*
71          * Note: we could try to reuse existing frag arrays, but it does not
72          * seems worth to do this.  First, we have to check if they really exists and
73          * then clear them.  We do not expect SSA construction is used often.
74          */
75         irg_block_walk_graph(irg, NULL, prepare_blocks, NULL);
76 }
77
78 /**
79  * mature all immature Blocks.
80  */
81 static void finish_block(ir_node *block, void *env)
82 {
83         (void)env;
84
85         if (!get_Block_matured(block))
86                 mature_immBlock(block);
87 }
88
89 /*
90  * Finalize the (restarted) SSA construction. Matures all blocks that are
91  * not matured yet and reset the graph state to phase_high.
92  */
93 void ssa_cons_finish(ir_graph *irg)
94 {
95         irg_block_walk_graph(irg, NULL, finish_block, NULL);
96         irg_finalize_cons(irg);
97 }