This change reorganizes the majority of frame index resolution into a two strep process.
- Step 1 - Select which base register we're going to use.
- Step 2 - Compute the offset from that base register.
The key point is that this allows us to share the step 2 logic for the SP case. This reduces the code duplication, and (I think) makes the code much easier to follow.
I also went ahead and added assertions into phase 2 to catch errors where we select an illegal base pointer. In general, we can't index from a base register to a stack location if that requires crossing a variable and unknown region. In practice, we have two such cases: dynamic stack realign and var sized objects. Note that crossing the scalable region is fine since while variable, it's a known variability which can be expressed in the offset.
After D125787, I believe this to be fully NFC. Careful review to confirm that is appreciated. :)
A quick grep shows that starting assertion messages with lower-case letters is far less common in the RISCV backend than upper-case ones.