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 Register Pressure Statistics.
23 * @author Adam M. Szalkowski
29 #include "bepressurestat.h"
60 #define MAXPRESSURE 128
62 typedef struct _regpressure_ana_t {
63 const arch_register_class_t *cls;
66 DEBUG_ONLY(firm_dbg_module_t *dbg);
69 static inline int has_reg_class(const regpressure_ana_t *ra, const ir_node *irn)
71 return arch_irn_consider_in_reg_alloc(ra->cls, irn);
74 static inline int regpressure(pset *live)
76 int pressure = pset_count(live);
77 return MIN(pressure, MAXPRESSURE);
80 static void regpressureanawalker(ir_node *bb, void *data)
82 regpressure_ana_t *ra = data;
83 pset *live = pset_new_ptr_default();
85 unsigned int *stat = ra->stat;
87 const be_lv_t *lv = ra->lv;
89 be_lv_foreach(lv, bb, be_lv_state_end, i) {
90 ir_node *value = be_lv_get_irn(lv, bb, i);
91 if (has_reg_class(ra, value)) {
92 pset_insert_ptr(live, value);
95 stat[regpressure(live)]++;
97 sched_foreach_reverse(bb, irn) {
99 if (is_Phi(irn)) break;
101 if (has_reg_class(ra, irn)) {
102 pset_remove_ptr(live, irn);
105 for (i = get_irn_arity(irn) - 1; i >= 0; --i) {
106 ir_node *arg = get_irn_n(irn, i);
108 if (has_reg_class(ra, arg)) {
109 pset_insert_ptr(live, arg);
114 stat[regpressure(live)]++;
118 void be_analyze_regpressure(be_irg_t *birg, const arch_register_class_t *cls, const char *suffix)
120 regpressure_ana_t ra;
121 unsigned int stat[MAXPRESSURE+1];
125 ir_graph *irg = be_get_birg_irg(birg);
127 ir_snprintf(fname, sizeof(fname), "%F_%s%s_pressure.stat", irg, cls->name, suffix);
128 f = fopen(fname, "w");
131 be_liveness_assure_sets(be_assure_liveness(birg));
133 FIRM_DBG_REGISTER(ra.dbg, "firm.be.regpressureana");
135 ra.lv = be_get_birg_liveness(birg);
139 memset(stat, 0, sizeof(stat));
141 irg_block_walk_graph(irg, regpressureanawalker, NULL, &ra);
143 for (i = 0; i <= MAXPRESSURE; ++i) {
144 fprintf(f, "%u\n", stat[i]);