forked from OSchip/llvm-project
e7084ceab3
Sometimes we generate code that writes to a subregister, then spills / restores a super-register to the stack, for example: $eax = MOV32ri 0 MOV64mr $rsp, 1, $noreg, 16, $noreg, $rax $rcx = MOV64rm $rsp, 1, $noreg, 8, $noreg This patch takes a different approach: it adds another index to MLocTracker that identifies a size/offset within a stack slot. A location on the stack is then a pari of {FrameIndex, SlotNum}. Spilling and restoring now involves pairing up the src/dest register numbers, and the dest/src stack position to be transferred to/from. Location coverage improves as a result, compile-time performance decreases, alas. One limitation is that if a PHI occurs inside a stack slot: DBG_PHI %stack.0, 1 We don't know how large the resulting value is, and so might have difficulty picking which value to use. DBG_PHI might need to be augmented in the future with such a size. Unit tests added ensure that spills and restores correctly transfer to positions in the Location => Value map, and that different register classes written to the stack will correctly clobber all other positions in the stack slot. Differential Revision: https://reviews.llvm.org/D112133 |
||
---|---|---|
.. | ||
GlobalISel | ||
AArch64SelectionDAGTest.cpp | ||
AllocationOrderTest.cpp | ||
AsmPrinterDwarfTest.cpp | ||
CMakeLists.txt | ||
DIEHashTest.cpp | ||
DIETest.cpp | ||
InstrRefLDVTest.cpp | ||
LexicalScopesTest.cpp | ||
LowLevelTypeTest.cpp | ||
MFCommon.inc | ||
MachineInstrBundleIteratorTest.cpp | ||
MachineInstrTest.cpp | ||
MachineOperandTest.cpp | ||
PassManagerTest.cpp | ||
ScalableVectorMVTsTest.cpp | ||
SelectionDAGAddressAnalysisTest.cpp | ||
TargetOptionsTest.cpp | ||
TestAsmPrinter.cpp | ||
TestAsmPrinter.h | ||
TypeTraitsTest.cpp |