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. We could try doubling or quadrupling the spill costs but that would create a lot of fallout since it affects everything. Cheers, Wilco