* @brief Register pressure node selector.
* @author Sebastian Hack
* @date 29.08.2006
- * @version $Id$
*/
#include "config.h"
#include "iredges_t.h"
#include "irgwalk.h"
#include "irtools.h"
+#include "util.h"
#include "besched.h"
#include "belistsched.h"
} reg_pressure_selector_env_t;
-#if 0
-/*
-* Ugly global variable for the compare function
-* since qsort(3) does not pass an extra pointer.
-*/
-static ir_node *curr_bl = NULL;
-
-static int cmp_usage(const void *a, const void *b)
-{
- struct trivial_sched_env *env;
- const ir_node *p = a;
- const ir_node *q = b;
- int res = 0;
-
- res = is_live_end(env->curr_bl, a) - is_live_end(env->curr_bl, b);
-
- /*
- * One of them is live at the end of the block.
- * Then, that one shall be scheduled at after the other
- */
- if (res != 0)
- return res;
-
-
- return res;
-}
-#endif
-
static inline usage_stats_t *get_or_set_usage_stats(reg_pressure_selector_env_t *env, ir_node *irn)
{
usage_stats_t *us = (usage_stats_t*)get_irn_link(irn);
ir_graph *irg = get_irn_irg(bl);
int res = 0;
- const ir_edge_t *edge;
-
foreach_out_edge(irn, edge) {
ir_node *user = get_edge_src_irn(edge);
unsigned visited_nr = get_irg_visited(irg) + 1;
static void *reg_pressure_block_init(void *graph_env, ir_node *bl)
{
- ir_node *irn;
reg_pressure_selector_env_t *env = XMALLOC(reg_pressure_selector_env_t);
(void) graph_env;
* Collect usage statistics.
*/
sched_foreach(bl, irn) {
- int i, n;
- if (is_Proj(irn)
- || (arch_get_irn_flags(irn) & arch_irn_flags_not_scheduled))
- continue;
-
- for (i = 0, n = get_irn_arity(irn); i < n; ++i) {
+ for (int i = 0, n = get_irn_arity(irn); i < n; ++i) {
usage_stats_t *us = get_or_set_usage_stats(env, irn);
-#if 0 /* Liveness is not computed here! */
- if (is_live_end(bl, op))
- us->uses_in_block = 99999;
- else
-#endif
- us->uses_in_block++;
+ us->uses_in_block++;
}
}
{
int res = 0;
if (get_irn_mode(irn) == mode_T) {
- const ir_edge_t *edge;
-
foreach_out_edge(irn, edge)
res += get_result_hops_sum(env, get_edge_src_irn(edge));
}
static ir_node *reg_pressure_select(void *block_env, ir_nodeset_t *ready_set)
{
- ir_nodeset_iterator_t iter;
reg_pressure_selector_env_t *env = (reg_pressure_selector_env_t*)block_env;
- ir_node *irn, *res = NULL;
- int curr_cost = INT_MAX;
+ ir_node *res = NULL;
+ int curr_cost = INT_MAX;
assert(ir_nodeset_size(ready_set) > 0);
- ir_nodeset_iterator_init(&iter, ready_set);
- while ( (irn = ir_nodeset_iterator_next(&iter)) != NULL) {
+ foreach_ir_nodeset(ready_set, irn, iter) {
/*
Ignore branch instructions for the time being.
They should only be scheduled if there is nothing else.
*/
if (!res) {
- ir_nodeset_iterator_init(&iter, ready_set);
- res = ir_nodeset_iterator_next(&iter);
-
+ res = ir_nodeset_first(ready_set);
assert(res && "There must be a node scheduled.");
}