Wilco Dijkstra via Gcc-patches <gcc-patches@gcc.gnu.org> writes: > Hi Richard, > >> I'm not questioning the results, but I think we need to look in more >> detail why rematerialisation requires such low costs. The point of >> comparison should be against a spill and reload, so any constant >> that is as cheap as a load should be rematerialised. If that isn't >> happening then it sounds like changes are needed elsewhere. > > The simple answer is that rematerializable expressions must have a lower cost > than the spill cost (potentially of something else), otherwise it will never > happen. > The previous costs were set way too high (eg. 12 for ADRP+LDR vs 4 for a > reload). > This patch basically ensures that is indeed the case. In principle a zero cost > works fine for anything that can be rematerialized. However it may use more > instructions than a spill (of something else), so a small non-zero cost avoids > bloating codesize. > > There isn't really a better way of doing this within the existing costing > code.
Yeah, I was wondering whether we could change something there. ADRP+LDR is logically more expensive than a single LDR, especially when optimising for size, so I think it's reasonable for the rtx_costs to say so. But that doesn't/shouldn't mean that spilling is better (for either size or speed). So it feels like there's something missing in the way the costs are being applied. Thanks, Richard > We could try doubling or quadrupling the spill costs but that would create a > lot of fallout since it affects everything.