ir_node *insert_Perm_after(ir_graph *irg, const arch_register_class_t *cls,
ir_node *pos)
{
- be_lv_t *lv = be_get_irg_liveness(irg);
- ir_node *bl = is_Block(pos) ? pos : get_nodes_block(pos);
- ir_nodeset_t live;
- ir_nodeset_iterator_t iter;
+ be_lv_t *lv = be_get_irg_liveness(irg);
+ ir_node *bl = is_Block(pos) ? pos : get_nodes_block(pos);
+ ir_nodeset_t live;
- ir_node *irn, *perm, **nodes;
+ ir_node *perm, **nodes;
size_t i, n;
DBG((dbg, LEVEL_1, "Insert Perm after: %+F\n", pos));
foreach_ir_nodehashmap(&cenv->op_set, map_entry, map_iter) {
op_copy_assoc_t *entry = (op_copy_assoc_t*)map_entry.data;
int idx, num_ck;
- ir_node *cp;
struct obstack obst;
- ir_nodeset_iterator_t iter;
ir_node **ck_arr, **melt_arr;
obstack_init(&obst);
op_copy_assoc_t *entry = (op_copy_assoc_t*)map_entry.data;
size_t n = ir_nodeset_size(&entry->copies);
ir_node **nodes = ALLOCAN(ir_node*, n);
- ir_node *cp;
- ir_nodeset_iterator_t iter;
be_ssa_construction_env_t senv;
/* put the node in an array */
/* create pbqp nodes, interference edges and reverse perfect elimination order */
sched_foreach_reverse(block, irn) {
- ir_node *live;
- ir_nodeset_iterator_t iter;
-
if (get_irn_mode(irn) == mode_T) {
foreach_out_edge(irn, edge) {
ir_node *proj = get_edge_src_irn(edge);
float penalty, const unsigned* limited,
ir_node *node)
{
- ir_nodeset_iterator_t iter;
- unsigned r;
- size_t n_allowed;
- allocation_info_t *info = get_allocation_info(node);
- ir_node *neighbor;
+ unsigned r;
+ size_t n_allowed;
+ allocation_info_t *info = get_allocation_info(node);
/* give penalty for all forbidden regs */
for (r = 0; r < n_regs; ++r) {
node_idx = uf_find(congruence_classes, node_idx);
for (i = 0; i < arity; ++i) {
- ir_node *live;
- ir_node *op;
- int op_idx;
- ir_nodeset_iterator_t iter;
- bool interferes = false;
+ ir_node *op;
+ int op_idx;
+ bool interferes = false;
if (!rbitset_is_set(&req->other_same, i))
continue;
arity = get_irn_arity(phi);
for (i = 0; i < arity; ++i) {
- bool interferes = false;
- ir_nodeset_iterator_t iter;
- unsigned r;
- int old_node_idx;
- ir_node *live;
- allocation_info_t *head_info;
- allocation_info_t *other_info;
- ir_node *op = get_Phi_pred(phi, i);
- int op_idx = get_irn_idx(op);
+ bool interferes = false;
+ unsigned r;
+ int old_node_idx;
+ allocation_info_t *head_info;
+ allocation_info_t *other_info;
+ ir_node *op = get_Phi_pred(phi, i);
+ int op_idx = get_irn_idx(op);
op_idx = uf_find(congruence_classes, op_idx);
/* do we interfere with the value */
/* all live-ins must have a register */
#ifdef DEBUG_libfirm
- {
- ir_nodeset_iterator_t iter;
- ir_node *node;
- foreach_ir_nodeset(&live_nodes, node, iter) {
- const arch_register_t *reg = arch_get_irn_register(node);
- assert(reg != NULL);
- }
+ foreach_ir_nodeset(&live_nodes, node, iter) {
+ const arch_register_t *reg = arch_get_irn_register(node);
+ assert(reg != NULL);
}
#endif
*/
static ir_node *random_select(void *block_env, ir_nodeset_t *ready_set)
{
- ir_nodeset_iterator_t iter;
- ir_node *irn = NULL;
int only_branches_left = 1;
(void)block_env;
}
}
+ ir_node *irn;
if (only_branches_left) {
/* at last: schedule branches */
irn = ir_nodeset_first(ready_set);
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);
*/
static ir_node *basic_selection(ir_nodeset_t *ready_set)
{
- ir_node *irn = NULL;
- ir_nodeset_iterator_t iter;
-
/* assure that branches and constants are executed last */
foreach_ir_nodeset(ready_set, irn, iter) {
if (!is_cfop(irn)) {
}
/* at last: schedule branches */
- irn = get_nodeset_node(ready_set);
-
- return irn;
+ return get_nodeset_node(ready_set);
}
/**
{
trace_env_t *env = (trace_env_t*)block_env;
ir_nodeset_t mcands, ecands;
- ir_nodeset_iterator_t iter;
sched_timestep_t max_delay = 0;
- ir_node *irn;
/* calculate the max delay of all candidates */
foreach_ir_nodeset(ready_set, irn, iter) {
}
/* select a node */
+ ir_node *irn;
if (ir_nodeset_size(&mcands) == 1) {
irn = get_nodeset_node(&mcands);
DB((env->dbg, LEVEL_3, "\tirn = %+F, mcand = 1, max_delay = %u\n", irn, max_delay));
static ir_node *heuristic_select(void *block_env, ir_nodeset_t *ns)
{
trace_env_t *trace_env = (trace_env_t*)block_env;
- ir_node *irn, *cand = NULL;
+ ir_node *cand = NULL;
int max_prio = INT_MIN;
int cur_prio = INT_MIN;
int reg_fact;
- ir_nodeset_iterator_t iter;
/* Note: register pressure calculation needs an overhaul, you need correct
* tracking for each register class indidually and weight by each class
int cur_pressure = ir_nodeset_size(lv); */
*/
static ir_node *trivial_select(void *block_env, ir_nodeset_t *ready_set)
{
- ir_node *irn;
- ir_nodeset_iterator_t iter;
(void)block_env;
/* assure that branches and constants are executed last */
*/
static void do_spilling(ir_nodeset_t *live_nodes, ir_node *node)
{
- size_t n_live_nodes = ir_nodeset_size(live_nodes);
- size_t values_defined = 0;
- size_t free_regs_needed = 0;
- spill_candidate_t *candidates;
- ir_nodeset_iterator_t iter;
- int i, arity;
- size_t c;
- int spills_needed;
- size_t cand_idx;
- ir_node *n;
- ir_node *value;
+ size_t n_live_nodes = ir_nodeset_size(live_nodes);
+ size_t values_defined = 0;
+ size_t free_regs_needed = 0;
+ spill_candidate_t *candidates;
+ int i, arity;
+ size_t c;
+ int spills_needed;
+ size_t cand_idx;
+ ir_node *value;
be_foreach_definition(node, cls, value,
assert(req_->width >= 1);
static __attribute__((unused))
void print_nodeset(ir_nodeset_t *nodeset)
{
- ir_nodeset_iterator_t iter;
- ir_node *node;
-
foreach_ir_nodeset(nodeset, node, iter) {
ir_fprintf(stderr, "%+F ", node);
}
*/
static void spill_block(ir_node *block, void *data)
{
- ir_nodeset_t live_nodes;
- ir_nodeset_iterator_t iter;
- int n_phi_values_spilled;
- int regpressure;
- int live_nodes_pressure;
- int phi_spills_needed;
+ ir_nodeset_t live_nodes;
+ int n_phi_values_spilled;
+ int regpressure;
+ int live_nodes_pressure;
+ int phi_spills_needed;
(void) data;
DBG((dbg, LEVEL_1, "spilling block %+F\n", block));
be_liveness_end_of_block(lv, cls, block, &live_nodes);
/* remove already spilled nodes from liveset */
- {
- ir_node *node;
- foreach_ir_nodeset(&live_nodes, node, iter) {
- DBG((dbg, LEVEL_2, "\t%+F is live-end... ", node));
- if (bitset_is_set(spilled_nodes, get_irn_idx(node))) {
- DBG((dbg, LEVEL_2, "but spilled; removing.\n"));
- ir_nodeset_remove_iterator(&live_nodes, &iter);
- } else {
- DBG((dbg, LEVEL_2, "keeping.\n"));
- }
+ foreach_ir_nodeset(&live_nodes, node, iter) {
+ DBG((dbg, LEVEL_2, "\t%+F is live-end... ", node));
+ if (bitset_is_set(spilled_nodes, get_irn_idx(node))) {
+ DBG((dbg, LEVEL_2, "but spilled; removing.\n"));
+ ir_nodeset_remove_iterator(&live_nodes, &iter);
+ } else {
+ DBG((dbg, LEVEL_2, "keeping.\n"));
}
}
}
live_nodes_pressure = 0;
- {
- ir_node *node;
- foreach_ir_nodeset(&live_nodes, node, iter) {
- live_nodes_pressure += get_value_width(node);
- }
+ foreach_ir_nodeset(&live_nodes, node, iter) {
+ live_nodes_pressure += get_value_width(node);
}
/* calculate how many of the phis need to be spilled */
*/
static void print_living_values(FILE *F, const ir_nodeset_t *live_nodes)
{
- ir_nodeset_iterator_t iter;
- ir_node *node;
-
ir_fprintf(F, "\t");
foreach_ir_nodeset(live_nodes, node, iter) {
ir_fprintf(F, "%+F ", node);
}
#define foreach_ir_nodeset(nodeset, irn, iter) \
- for(ir_nodeset_iterator_init(&iter, nodeset), \
- irn = ir_nodeset_iterator_next(&iter); \
- irn != NULL; irn = ir_nodeset_iterator_next(&iter))
+ for (bool irn##__once = true; irn##__once;) \
+ for (ir_nodeset_iterator_t iter; irn##__once;) \
+ for (ir_node *irn; irn##__once; irn##__once = false) \
+ for (ir_nodeset_iterator_init(&iter, nodeset); (irn = ir_nodeset_iterator_next(&iter));)
#endif
n = ir_nodeset_size(&pi.user_mem);
if (n > 0) { /* nothing happened otherwise */
- ir_node *sync;
- ir_node **in = XMALLOCN(ir_node*, n+1);
- ir_node *node;
- ir_nodeset_iterator_t iter;
- size_t i;
+ ir_node *sync;
+ ir_node **in = XMALLOCN(ir_node*, n+1);
+ size_t i;
i = 0;
in[i++] = proj;