From 491f54f1fd700204db0a19efde0cc2627641d711 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Sat, 17 Oct 2009 09:20:14 +0000 Subject: [PATCH] Distinquish stack slots from other stack objects. They (and fixed objects) get FixedStack PseudoSourceValues. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84326 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/MachineFrameInfo.h | 22 ++++++++++++++++++---- lib/CodeGen/PreAllocSplitting.cpp | 2 +- lib/CodeGen/PrologEpilogInserter.cpp | 2 +- lib/CodeGen/RegAllocLocal.cpp | 2 +- lib/CodeGen/VirtRegMap.cpp | 4 ++-- lib/Target/ARM/ARMBaseInstrInfo.cpp | 10 ++++++++-- lib/Target/X86/X86InstrBuilder.h | 5 ++++- 7 files changed, 35 insertions(+), 12 deletions(-) diff --git a/include/llvm/CodeGen/MachineFrameInfo.h b/include/llvm/CodeGen/MachineFrameInfo.h index 99a4c3d07d9..a04189c4364 100644 --- a/include/llvm/CodeGen/MachineFrameInfo.h +++ b/include/llvm/CodeGen/MachineFrameInfo.h @@ -102,8 +102,14 @@ class MachineFrameInfo { // default, fixed objects are immutable unless marked otherwise. bool isImmutable; - StackObject(uint64_t Sz, unsigned Al, int64_t SP = 0, bool IM = false) - : SPOffset(SP), Size(Sz), Alignment(Al), isImmutable(IM) {} + // isSpillSlot - If true, the stack object is used as spill slot. It + // cannot alias any other memory objects. + bool isSpillSlot; + + StackObject(uint64_t Sz, unsigned Al, int64_t SP = 0, bool IM = false, + bool isSS = false) + : SPOffset(SP), Size(Sz), Alignment(Al), isImmutable(IM), + isSpillSlot(isSS) {} }; /// Objects - The list of stack objects allocated... @@ -352,6 +358,14 @@ public: return Objects[ObjectIdx+NumFixedObjects].isImmutable; } + /// isSpillSlotObjectIndex - Returns true if the specified index corresponds + /// to a spill slot.. + bool isSpillSlotObjectIndex(int ObjectIdx) const { + assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() && + "Invalid Object Idx!"); + return Objects[ObjectIdx+NumFixedObjects].isSpillSlot;; + } + /// isDeadObjectIndex - Returns true if the specified index corresponds to /// a dead object. bool isDeadObjectIndex(int ObjectIdx) const { @@ -363,9 +377,9 @@ public: /// CreateStackObject - Create a new statically sized stack object, returning /// a nonnegative identifier to represent it. /// - int CreateStackObject(uint64_t Size, unsigned Alignment) { + int CreateStackObject(uint64_t Size, unsigned Alignment, bool isSS = false) { assert(Size != 0 && "Cannot allocate zero size stack objects!"); - Objects.push_back(StackObject(Size, Alignment)); + Objects.push_back(StackObject(Size, Alignment, 0, false, isSS)); return (int)Objects.size()-NumFixedObjects-1; } diff --git a/lib/CodeGen/PreAllocSplitting.cpp b/lib/CodeGen/PreAllocSplitting.cpp index 8fa07d4d9af..726869a3fb6 100644 --- a/lib/CodeGen/PreAllocSplitting.cpp +++ b/lib/CodeGen/PreAllocSplitting.cpp @@ -952,7 +952,7 @@ MachineInstr* PreAllocSplitting::FoldSpill(unsigned vreg, if (I != IntervalSSMap.end()) { SS = I->second; } else { - SS = MFI->CreateStackObject(RC->getSize(), RC->getAlignment()); + SS = MFI->CreateStackObject(RC->getSize(), RC->getAlignment()); } MachineInstr* FMI = TII->foldMemoryOperand(*MBB->getParent(), diff --git a/lib/CodeGen/PrologEpilogInserter.cpp b/lib/CodeGen/PrologEpilogInserter.cpp index 7af0bba1973..8a0b003e92c 100644 --- a/lib/CodeGen/PrologEpilogInserter.cpp +++ b/lib/CodeGen/PrologEpilogInserter.cpp @@ -259,7 +259,7 @@ void PEI::calculateCalleeSavedRegisters(MachineFunction &Fn) { // the TargetRegisterClass if the stack alignment is smaller. Use the // min. Align = std::min(Align, StackAlign); - FrameIdx = FFI->CreateStackObject(RC->getSize(), Align); + FrameIdx = FFI->CreateStackObject(RC->getSize(), Align, true); if ((unsigned)FrameIdx < MinCSFrameIndex) MinCSFrameIndex = FrameIdx; if ((unsigned)FrameIdx > MaxCSFrameIndex) MaxCSFrameIndex = FrameIdx; } else { diff --git a/lib/CodeGen/RegAllocLocal.cpp b/lib/CodeGen/RegAllocLocal.cpp index 6caa2d3b824..28ede5526b8 100644 --- a/lib/CodeGen/RegAllocLocal.cpp +++ b/lib/CodeGen/RegAllocLocal.cpp @@ -263,7 +263,7 @@ int RALocal::getStackSpaceFor(unsigned VirtReg, const TargetRegisterClass *RC) { // Allocate a new stack object for this spill location... int FrameIdx = MF->getFrameInfo()->CreateStackObject(RC->getSize(), - RC->getAlignment()); + RC->getAlignment(),true); // Assign the slot... StackSlotForVirtReg[VirtReg] = FrameIdx; diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp index c78f35bdb13..cac098bacea 100644 --- a/lib/CodeGen/VirtRegMap.cpp +++ b/lib/CodeGen/VirtRegMap.cpp @@ -118,7 +118,7 @@ int VirtRegMap::assignVirt2StackSlot(unsigned virtReg) { "attempt to assign stack slot to already spilled register"); const TargetRegisterClass* RC = MF->getRegInfo().getRegClass(virtReg); int SS = MF->getFrameInfo()->CreateStackObject(RC->getSize(), - RC->getAlignment()); + RC->getAlignment(), /*isSS*/true); if (LowSpillSlot == NO_STACK_SLOT) LowSpillSlot = SS; if (HighSpillSlot == NO_STACK_SLOT || SS > HighSpillSlot) @@ -162,7 +162,7 @@ int VirtRegMap::getEmergencySpillSlot(const TargetRegisterClass *RC) { if (I != EmergencySpillSlots.end()) return I->second; int SS = MF->getFrameInfo()->CreateStackObject(RC->getSize(), - RC->getAlignment()); + RC->getAlignment(), /*isSS*/true); if (LowSpillSlot == NO_STACK_SLOT) LowSpillSlot = SS; if (HighSpillSlot == NO_STACK_SLOT || SS > HighSpillSlot) diff --git a/lib/Target/ARM/ARMBaseInstrInfo.cpp b/lib/Target/ARM/ARMBaseInstrInfo.cpp index ecdf5a0be64..271e0a92c0e 100644 --- a/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ b/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -670,8 +670,11 @@ storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, MachineFunction &MF = *MBB.getParent(); MachineFrameInfo &MFI = *MF.getFrameInfo(); + const Value *SV = (MFI.isFixedObjectIndex(FI) || + MFI.isSpillSlotObjectIndex(FI)) + ? PseudoSourceValue::getFixedStack(FI) : PseudoSourceValue::getStack(); MachineMemOperand *MMO = - MF.getMachineMemOperand(PseudoSourceValue::getFixedStack(FI), + MF.getMachineMemOperand(SV, MachineMemOperand::MOStore, 0, MFI.getObjectSize(FI), MFI.getObjectAlignment(FI)); @@ -708,8 +711,11 @@ loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, MachineFunction &MF = *MBB.getParent(); MachineFrameInfo &MFI = *MF.getFrameInfo(); + const Value *SV = (MFI.isFixedObjectIndex(FI) || + MFI.isSpillSlotObjectIndex(FI)) + ? PseudoSourceValue::getFixedStack(FI) : PseudoSourceValue::getStack(); MachineMemOperand *MMO = - MF.getMachineMemOperand(PseudoSourceValue::getFixedStack(FI), + MF.getMachineMemOperand(SV, MachineMemOperand::MOLoad, 0, MFI.getObjectSize(FI), MFI.getObjectAlignment(FI)); diff --git a/lib/Target/X86/X86InstrBuilder.h b/lib/Target/X86/X86InstrBuilder.h index c475b56d12f..8cbdfec87dd 100644 --- a/lib/Target/X86/X86InstrBuilder.h +++ b/lib/Target/X86/X86InstrBuilder.h @@ -143,8 +143,11 @@ addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset = 0) { Flags |= MachineMemOperand::MOLoad; if (TID.mayStore()) Flags |= MachineMemOperand::MOStore; + const Value *SV = (MFI.isFixedObjectIndex(FI) || + MFI.isSpillSlotObjectIndex(FI)) + ? PseudoSourceValue::getFixedStack(FI) : PseudoSourceValue::getStack(); MachineMemOperand *MMO = - MF.getMachineMemOperand(PseudoSourceValue::getFixedStack(FI), + MF.getMachineMemOperand(SV, Flags, Offset, MFI.getObjectSize(FI), MFI.getObjectAlignment(FI)); -- 2.34.1