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 BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copystat);
117 void be_init_copystat(void)
119 FIRM_DBG_REGISTER(dbg, "firm.be.copystat");
121 all_phi_nodes = ir_nodeset_new(64);
122 all_copy_nodes = ir_nodeset_new(64);
123 memset(curr_vals, 0, sizeof(curr_vals));
126 BE_REGISTER_MODULE_DESTRUCTOR(be_quit_copystat);
127 void be_quit_copystat(void)
129 if (all_phi_nodes != NULL) {
130 ir_nodeset_del(all_phi_nodes);
131 all_phi_nodes = NULL;
133 if (all_copy_nodes != NULL) {
134 ir_nodeset_del(all_copy_nodes);
135 all_copy_nodes = NULL;
140 * @return 1 if the block at pos @p pos removed a critical edge
143 static inline int was_edge_critical(const ir_node *bl, int pos)
145 const ir_edge_t *edge;
146 const ir_node *bl_at_pos, *bl_before;
147 assert(is_Block(bl));
149 /* Does bl have several predecessors ?*/
150 if (get_irn_arity(bl) <= 1)
153 /* Does the pred have exactly one predecessor */
154 bl_at_pos = get_irn_n(bl, pos);
155 if (get_irn_arity(bl_at_pos) != 1)
158 /* Does the pred of the pred have several successors */
159 bl_before = get_irn_n(bl_at_pos, 0);
160 edge = get_block_succ_first(bl_before);
161 return get_block_succ_next(bl_before, edge) ? 1 : 0;
164 void copystat_add_max_costs(int costs)
166 curr_vals[I_COPIES_MAX] += costs;
168 void copystat_add_inevit_costs(int costs)
170 curr_vals[I_COPIES_IF] += costs;
172 void copystat_add_init_costs(int costs)
174 curr_vals[I_COPIES_INIT] += costs;
176 void copystat_add_heur_costs(int costs)
178 curr_vals[I_COPIES_HEUR] += costs;
180 void copystat_add_opt_costs(int costs)
182 curr_vals[I_COPIES_OPT] += costs;
184 void copystat_add_heur_time(int time)
186 curr_vals[I_HEUR_TIME] += time;
191 void copystat_add_ilp_5_sec_costs(int costs)
193 curr_vals[I_COPIES_5SEC] += costs;
195 void copystat_add_ilp_30_sec_costs(int costs)
197 curr_vals[I_COPIES_30SEC] += costs;
199 void copystat_add_ilp_time(int time)
201 curr_vals[I_ILP_TIME] += time;
203 void copystat_add_ilp_vars(int vars)
205 curr_vals[I_ILP_VARS] += vars;
207 void copystat_add_ilp_csts(int csts)
209 curr_vals[I_ILP_CSTR] += csts;
211 void copystat_add_ilp_iter(int iters)
213 curr_vals[I_ILP_ITER] += iters;
216 #endif /* WITH_ILP */
219 * Opens a file named base.ext with the mode mode.
221 static FILE *be_ffopen(const char *base, const char *ext, const char *mode)
226 snprintf(buf, sizeof(buf), "%s.%s", base, ext);
227 buf[sizeof(buf) - 1] = '\0';
228 if (! (out = fopen(buf, mode))) {
229 fprintf(stderr, "Cannot open file %s in mode %s\n", buf, mode);
235 void copystat_dump(ir_graph *irg)
241 snprintf(buf, sizeof(buf), "%s__%s", get_irp_name(), get_entity_name(get_irg_entity(irg)));
242 buf[sizeof(buf) - 1] = '\0';
243 out = be_ffopen(buf, "stat", "wt");
245 fprintf(out, "%d\n", ASIZE);
246 for (i = 0; i < ASIZE; i++) {
248 if (i >= I_PHI_ARITY_S && i <= I_PHI_ARITY_E)
249 fprintf(out, "%i %i\n", curr_vals[i], curr_vals[I_PHI_CNT]);
250 else if (i >= I_CLS_SIZE_S && i <= I_CLS_SIZE_E)
251 fprintf(out, "%i %i\n", curr_vals[i], curr_vals[I_CLS_CNT]);
254 fprintf(out, "%i\n", curr_vals[i]);
260 void copystat_dump_pretty(ir_graph *irg)
266 snprintf(buf, sizeof(buf), "%s__%s", get_irp_name(), get_entity_name(get_irg_entity(irg)));
267 buf[sizeof(buf) - 1] = '\0';
268 out = be_ffopen(buf, "pstat", "wt");
270 fprintf(out, "Nodes %4d\n", curr_vals[I_ALL_NODES]);
271 fprintf(out, "Blocks %4d\n", curr_vals[I_BLOCKS]);
272 fprintf(out, "CopyIrn %4d\n", curr_vals[I_CPY_CNT]);
274 fprintf(out, "\nPhis %4d\n", curr_vals[I_PHI_CNT]);
275 fprintf(out, "... argument types\n");
276 fprintf(out, " Total %4d\n", curr_vals[I_PHI_ARG_CNT]);
277 fprintf(out, " Self %4d\n", curr_vals[I_PHI_ARG_SELF]);
278 fprintf(out, " Constants %4d\n", curr_vals[I_PHI_ARG_CONST]);
279 fprintf(out, " CF-Pred %4d\n", curr_vals[I_PHI_ARG_PRED]);
280 fprintf(out, " Others %4d\n", curr_vals[I_PHI_ARG_GLOB]);
281 fprintf(out, "... arities\n");
282 for (i = I_PHI_ARITY_S; i<=I_PHI_ARITY_E; i++)
283 fprintf(out, " %2i %4d\n", i-I_PHI_ARITY_S, curr_vals[i]);
285 fprintf(out, "\nPhi classes %4d\n", curr_vals[I_CLS_CNT]);
286 fprintf(out, " compl. free %4d\n", curr_vals[I_CLS_IF_FREE]);
287 fprintf(out, " inner intf. %4d / %4d\n", curr_vals[I_CLS_IF_CNT], curr_vals[I_CLS_IF_MAX]);
288 fprintf(out, "... sizes\n");
289 for (i = I_CLS_SIZE_S; i<=I_CLS_SIZE_E; i++)
290 fprintf(out, " %2i %4d\n", i-I_CLS_SIZE_S, curr_vals[i]);
291 fprintf(out, "... contained phis\n");
292 for (i = I_CLS_PHIS_S; i<=I_CLS_PHIS_E; i++)
293 fprintf(out, " %2i %4d\n", i-I_CLS_PHIS_S, curr_vals[i]);
295 fprintf(out, "\nILP stat\n");
296 fprintf(out, " Time %8d\n", curr_vals[I_ILP_TIME]);
297 fprintf(out, " Iter %8d\n", curr_vals[I_ILP_ITER]);
299 fprintf(out, "\nCopy stat\n");
300 fprintf(out, " Max %4d\n", curr_vals[I_COPIES_MAX]);
301 fprintf(out, " Init %4d\n", curr_vals[I_COPIES_INIT]);
302 fprintf(out, " Heur %4d\n", curr_vals[I_COPIES_HEUR]);
303 fprintf(out, " Opt %4d\n", curr_vals[I_COPIES_OPT]);
304 fprintf(out, " Intf %4d\n", curr_vals[I_COPIES_IF]);