2 * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
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.
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.
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
22 * @brief Copy node statistics.
23 * @author Daniel Grund
35 #include "iredges_t.h"
36 #include "irnodeset.h"
38 #include "bechordal_t.h"
41 #include "becopyopt_t.h"
42 #include "becopystat.h"
45 #include "beintlive_t.h"
47 #define DEBUG_LVL SET_LEVEL_1
48 DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
51 #define MAX_CLS_SIZE 20
52 #define MAX_CLS_PHIS 20
55 * For an explanation of these values see the code of copystat_dump_pretty
58 /* FROM HERE: PROBLEM CHARACTERIZATION */
64 I_PHI_CNT, /* number of phi nodes */
65 I_PHI_ARG_CNT, /* number of arguments of phis */
66 I_PHI_ARG_SELF, /* number of arguments of phis being the phi itself */
67 I_PHI_ARG_CONST, /* number of arguments of phis being consts */
68 I_PHI_ARG_PRED, /* ... being defined in a cf-pred */
69 I_PHI_ARG_GLOB, /* ... being defined elsewhere */
71 I_PHI_ARITY_E = I_PHI_ARITY_S+MAX_ARITY,
74 I_CPY_CNT, /* number of copynodes */
77 I_CLS_CNT, /* number of phi classes */
78 I_CLS_IF_FREE, /* number of pc having no interference */
79 I_CLS_IF_MAX, /* number of possible interferences in all classes */
80 I_CLS_IF_CNT, /* number of actual interferences in all classes */
82 I_CLS_SIZE_E = I_CLS_SIZE_S+MAX_CLS_SIZE,
84 I_CLS_PHIS_E = I_CLS_PHIS_S+MAX_CLS_PHIS,
86 /* FROM HERE: RESULT VLAUES */
87 /* all of them are external set */
90 I_HEUR_TIME, /* solving time in milli seconds */
91 I_ILP_TIME, /* solving time in milli seconds */
94 I_ILP_ITER, /* number of simplex iterations */
96 /* copy instructions */
97 I_COPIES_MAX, /* max possible costs of copies*/
98 I_COPIES_INIT, /* number of copies in initial allocation */
99 I_COPIES_HEUR, /* number of copies after heuristic */
100 I_COPIES_5SEC, /* number of copies after ilp with max n sec */
101 I_COPIES_30SEC, /* number of copies after ilp with max n sec */
102 I_COPIES_OPT, /* number of copies after ilp */
103 I_COPIES_IF, /* number of copies inevitable due to root-arg-interf */
109 * Holds current values. Values are added till next copystat_reset
111 int curr_vals[ASIZE];
113 static ir_nodeset_t *all_phi_nodes;
114 static ir_nodeset_t *all_copy_nodes;
116 void be_init_copystat(void) {
117 FIRM_DBG_REGISTER(dbg, "firm.be.copystat");
119 all_phi_nodes = ir_nodeset_new(64);
120 all_copy_nodes = ir_nodeset_new(64);
121 memset(curr_vals, 0, sizeof(curr_vals));
123 BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copystat);
125 void be_quit_copystat(void) {
126 ir_nodeset_del(all_phi_nodes);
127 ir_nodeset_del(all_copy_nodes);
129 BE_REGISTER_MODULE_DESTRUCTOR(be_quit_copystat);
132 * @return 1 if the block at pos @p pos removed a critical edge
135 static inline int was_edge_critical(const ir_node *bl, int pos) {
136 const ir_edge_t *edge;
137 const ir_node *bl_at_pos, *bl_before;
138 assert(is_Block(bl));
140 /* Does bl have several predecessors ?*/
141 if (get_irn_arity(bl) <= 1)
144 /* Does the pred have exactly one predecessor */
145 bl_at_pos = get_irn_n(bl, pos);
146 if (get_irn_arity(bl_at_pos) != 1)
149 /* Does the pred of the pred have several successors */
150 bl_before = get_irn_n(bl_at_pos, 0);
151 edge = get_block_succ_first(bl_before);
152 return get_block_succ_next(bl_before, edge) ? 1 : 0;
155 void copystat_add_max_costs(int costs) {
156 curr_vals[I_COPIES_MAX] += costs;
158 void copystat_add_inevit_costs(int costs) {
159 curr_vals[I_COPIES_IF] += costs;
161 void copystat_add_init_costs(int costs) {
162 curr_vals[I_COPIES_INIT] += costs;
164 void copystat_add_heur_costs(int costs) {
165 curr_vals[I_COPIES_HEUR] += costs;
167 void copystat_add_ilp_5_sec_costs(int costs) {
168 curr_vals[I_COPIES_5SEC] += costs;
170 void copystat_add_ilp_30_sec_costs(int costs) {
171 curr_vals[I_COPIES_30SEC] += costs;
173 void copystat_add_opt_costs(int costs) {
174 curr_vals[I_COPIES_OPT] += costs;
176 void copystat_add_heur_time(int time) {
177 curr_vals[I_HEUR_TIME] += time;
182 void copystat_add_ilp_time(int time) {
183 curr_vals[I_ILP_TIME] += time;
185 void copystat_add_ilp_vars(int vars) {
186 curr_vals[I_ILP_VARS] += vars;
188 void copystat_add_ilp_csts(int csts) {
189 curr_vals[I_ILP_CSTR] += csts;
191 void copystat_add_ilp_iter(int iters) {
192 curr_vals[I_ILP_ITER] += iters;
195 #endif /* WITH_ILP */
197 void copystat_dump(ir_graph *irg) {
202 snprintf(buf, sizeof(buf), "%s__%s", get_irp_name(), get_entity_name(get_irg_entity(irg)));
203 buf[sizeof(buf) - 1] = '\0';
204 out = be_ffopen(buf, "stat", "wt");
206 fprintf(out, "%d\n", ASIZE);
207 for (i = 0; i < ASIZE; i++) {
209 if (i >= I_PHI_ARITY_S && i <= I_PHI_ARITY_E)
210 fprintf(out, "%i %i\n", curr_vals[i], curr_vals[I_PHI_CNT]);
211 else if (i >= I_CLS_SIZE_S && i <= I_CLS_SIZE_E)
212 fprintf(out, "%i %i\n", curr_vals[i], curr_vals[I_CLS_CNT]);
215 fprintf(out, "%i\n", curr_vals[i]);
221 void copystat_dump_pretty(ir_graph *irg) {
226 snprintf(buf, sizeof(buf), "%s__%s", get_irp_name(), get_entity_name(get_irg_entity(irg)));
227 buf[sizeof(buf) - 1] = '\0';
228 out = be_ffopen(buf, "pstat", "wt");
230 fprintf(out, "Nodes %4d\n", curr_vals[I_ALL_NODES]);
231 fprintf(out, "Blocks %4d\n", curr_vals[I_BLOCKS]);
232 fprintf(out, "CopyIrn %4d\n", curr_vals[I_CPY_CNT]);
234 fprintf(out, "\nPhis %4d\n", curr_vals[I_PHI_CNT]);
235 fprintf(out, "... argument types\n");
236 fprintf(out, " Total %4d\n", curr_vals[I_PHI_ARG_CNT]);
237 fprintf(out, " Self %4d\n", curr_vals[I_PHI_ARG_SELF]);
238 fprintf(out, " Constants %4d\n", curr_vals[I_PHI_ARG_CONST]);
239 fprintf(out, " CF-Pred %4d\n", curr_vals[I_PHI_ARG_PRED]);
240 fprintf(out, " Others %4d\n", curr_vals[I_PHI_ARG_GLOB]);
241 fprintf(out, "... arities\n");
242 for (i = I_PHI_ARITY_S; i<=I_PHI_ARITY_E; i++)
243 fprintf(out, " %2i %4d\n", i-I_PHI_ARITY_S, curr_vals[i]);
245 fprintf(out, "\nPhi classes %4d\n", curr_vals[I_CLS_CNT]);
246 fprintf(out, " compl. free %4d\n", curr_vals[I_CLS_IF_FREE]);
247 fprintf(out, " inner intf. %4d / %4d\n", curr_vals[I_CLS_IF_CNT], curr_vals[I_CLS_IF_MAX]);
248 fprintf(out, "... sizes\n");
249 for (i = I_CLS_SIZE_S; i<=I_CLS_SIZE_E; i++)
250 fprintf(out, " %2i %4d\n", i-I_CLS_SIZE_S, curr_vals[i]);
251 fprintf(out, "... contained phis\n");
252 for (i = I_CLS_PHIS_S; i<=I_CLS_PHIS_E; i++)
253 fprintf(out, " %2i %4d\n", i-I_CLS_PHIS_S, curr_vals[i]);
255 fprintf(out, "\nILP stat\n");
256 fprintf(out, " Time %8d\n", curr_vals[I_ILP_TIME]);
257 fprintf(out, " Iter %8d\n", curr_vals[I_ILP_ITER]);
259 fprintf(out, "\nCopy stat\n");
260 fprintf(out, " Max %4d\n", curr_vals[I_COPIES_MAX]);
261 fprintf(out, " Init %4d\n", curr_vals[I_COPIES_INIT]);
262 fprintf(out, " Heur %4d\n", curr_vals[I_COPIES_HEUR]);
263 fprintf(out, " Opt %4d\n", curr_vals[I_COPIES_OPT]);
264 fprintf(out, " Intf %4d\n", curr_vals[I_COPIES_IF]);