https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109009
--- Comment #8 from Surya Kumari Jangala <jskumari at gcc dot gnu.org> --- (In reply to Surya Kumari Jangala from comment #7) > There are a couple of issues in IRA: > > 1. In improve_allocation() routine, we are not considering save/restore cost > of using a callee save register (r31 in the failing case). Due to this, r31 > is being chosen instead of r3 for allocno r118. > I made changes in the improve_allocation() routine to consider the save/restore cost, but this still results in r31 being chosen for allocno r118. Save/restore cost is computed by using the costs in the "ira_memory_move_cost" array. But the memory move costs are quite small, it is 4. So even adding this to r31 does not make the cost of r31 large enough for it to be not chosen. However, while computing the save/restore cost, we are considering only the memory move cost but not the BB frequency. I think it is important to consider the frequency too. We factor in the frequency when we compute the savings on removed copies in allocno_copy_cost_saving(). In this routine, we multiply the frequency with ira_register_move_cost. So why not factor in the frequency for memory move cost? For the testcase we are considering: BB2: set r123, r4 set r122, r3 set r120, compare(r123, 0) set r118, r122 if r120 jump BB4 else jump BB3 BB3: call bar() BB4: set r3, r118+1 return r3 In improve_allocation(), we compute the cost improvement of each hard register for allocno r118. And for each hard register we compute the allocno_copy_cost_saving() if that hard reg is assigned to r118. In allocno_copy_cost_saving(), we check if there are copies involving r118. And we have one copy: set r118, r122 Since r122 is a copy of r3, so the copy cost saving if r3 is assigned to r118 is: (freq of the copy insn) * ira_register_move_cost Here, freq of the copy insn is taken as 1000 and ira_register_move_cost is 2. So the copy cost saving is 2000. Note that BB2 in which the copy insn occurs is the first BB. The save insn for r31 will be placed in the prolog, so the freq of prolog needs to be taken into consideration.