ivopts: Zero register pressure cost when registers are abundant
Loop invariant optimization pass now reports zero register pressure cost if ample registers exist, avoiding unnecessary spilling.
The ivopts_estimate_reg_pressure function within GCC’s loop invariant optimization pass now correctly returns zero when sufficient registers are available. This prevents the pass from incorrectly estimating high register pressure and potentially causing unnecessary register spilling, which occurs when the compiler believes it doesn’t have enough registers to hold all temporary values.
In Details
In ivopts_estimate_reg_pressure, the function previously calculated a non-zero register pressure cost even when ample registers were available, potentially leading to suboptimal optimization decisions or unnecessary spilling. This change introduces a check to return zero cost if the available registers are sufficient to hold new loop invariants and induction variables being introduced by the optimization, thus avoiding heuristic-driven spilling.
- ivopts
- GCC's optimization pass for Loop Invariant Optimizations, which aims to move calculations that do not change within a loop outside of it.
- register pressure
- A measure of how many registers are needed by a piece of code. High register pressure can lead to 'spilling', where values are temporarily stored in memory.
- spilling
- The process of temporarily storing a value from a CPU register into memory when the compiler runs out of available registers.
- loop invariant
- A value or expression within a loop that does not change its value from one iteration of the loop to the next.
- induction variable
- A variable used in a loop that is updated incrementally (e.g., incremented or decremented) in each iteration, often used for loop control or array indexing.