RegScavenger: Add function to externally reserve a scavenging index
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Wed, 1 Dec 2021 00:34:59 +0000 (19:34 -0500)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Thu, 3 Feb 2022 00:15:52 +0000 (19:15 -0500)
commit5ecbcc207c14a81f3ce006579854307997d26821
treef83019eb71674378e12f0fc92949aba3a84d15fd
parent29f92da522e44eec854ca68e658903aa6d7a6fee
RegScavenger: Add function to externally reserve a scavenging index

AMDGPU separately tracks the frame index we use for the emergency
spill slot. In the case where we need to spill SGPRs to memory, we
manually handle the save and restore. In other cases, the scavenger
handles the spills normally.

In a future change, I will need to add a second scavenging index in
order to free a second register in case we are spilling to a large
offset and also have to avoid clobbering a condition register
(SCC). In the intersection of these two cases, we will end up
recursively calling eliminateFrameIndex. We need to report to the
scavenger that the first scavenging frame index is unavailable, and
that the register is already used to avoid double spilling to the
scavenging slot (and avoid clobbering the previously evicted register,
and getting the same register for both scavenge calls).

This is really ugly but I don't see a better way without requiring
targets to be far more aware of how the scavenger iterator is
advanced.
llvm/include/llvm/CodeGen/RegisterScavenging.h