BTW, today I have achieved some good results with existing IRA by doing
the following:
1) Changed the REG_ALLOC_ORDER so that TOP_CREGS are given out before
BOTTOM_REGS. My previous hacked version worked by increasing the
priority of those that wanted BOTTOM_REGS, so they got first pick; this
new version makes them wait their turn, but ensures those with higher
priority take TOP_CREGS before BOTTOM_REGS.
The analogy, I think, is of giving out meals on an airplane. Most
people will eat meat or vegetarian meals, whereas vegetarians only
want vegetarian meals. My hacked version was effectively allowing
the vegetarians to push to the front of the queue and get their meals;
this new version works by encouraging the meat eaters to eat the meaty
meals first, leaving more suitable meals for the vegetarians further
down the plane.
2) I have forced propagation of allocnos to parent regions with the
following hack in find_allocno_class_costs():
{
/* Propagate costs to upper levels in the region
tree. */
parent_a_num = ALLOCNO_NUM (parent_a);
for (k = 0; k < cost_classes_num; k++)
COSTS_OF_ALLOCNO (total_costs, parent_a_num)->cost[k]
+= COSTS_OF_ALLOCNO (total_costs, a_num)->cost[k];
COSTS_OF_ALLOCNO (total_costs, parent_a_num)->mem_cost
+= COSTS_OF_ALLOCNO (total_costs, a_num)->mem_cost;
/* BEGIN IGB-IRA CHANGE 2 */
/* Force total_costs to propagate upwards, by setting
allocno_costs to be total_costs */
for (k = 0; k < cost_classes_num; k++)
COSTS_OF_ALLOCNO (allocno_costs, parent_a_num)->cost[k]
= COSTS_OF_ALLOCNO (total_costs, parent_a_num)->cost[k];
COSTS_OF_ALLOCNO (allocno_costs, parent_a_num)->mem_cost
= COSTS_OF_ALLOCNO (total_costs, parent_a_num)->mem_cost;
/* END IGB-IRA CHANGE 2 */
}
I don't know why propagation isn't happening normally, but
this total_costs hack achieves the same thing for me at the
moment. Is there any information I could provide to help
someone tell me why propagation isn't happening?