> On 11/06/09 05:53, Dave Hudson wrote: > > the most > > critical thing was to ensure that REGNO_REG_CLASS was returning a > > minimal class correctly. > I believe that's been documented as the right thing to do for about 15 > years :-) So, yes, you definitely want REGNO_REG_CLASS to return the > smallest class to which a register belongs. > > Jeff
So I should definitely change my function then! If something isn't BOTTOM_REGS and it is in C_REGS then the smallest class it's in is actually TOP_CREGS. 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?