diff options
Diffstat (limited to 'llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp | 95 |
1 files changed, 52 insertions, 43 deletions
diff --git a/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp b/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp index 52e6d05c3155..3579635f83b5 100644 --- a/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp +++ b/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp @@ -220,10 +220,25 @@ getReservedRegs(const MachineFunction &MF) const { } bool ARMBaseRegisterInfo:: -isAsmClobberable(const MachineFunction &MF, unsigned PhysReg) const { +isAsmClobberable(const MachineFunction &MF, MCRegister PhysReg) const { return !getReservedRegs(MF).test(PhysReg); } +bool ARMBaseRegisterInfo::isInlineAsmReadOnlyReg(const MachineFunction &MF, + unsigned PhysReg) const { + const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>(); + const ARMFrameLowering *TFI = getFrameLowering(MF); + + BitVector Reserved(getNumRegs()); + markSuperRegs(Reserved, ARM::PC); + if (TFI->hasFP(MF)) + markSuperRegs(Reserved, getFramePointerReg(STI)); + if (hasBasePointer(MF)) + markSuperRegs(Reserved, BasePtr); + assert(checkAllSuperRegsMarked(Reserved)); + return Reserved.test(PhysReg); +} + const TargetRegisterClass * ARMBaseRegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC, const MachineFunction &MF) const { @@ -289,7 +304,8 @@ ARMBaseRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC, } // Get the other register in a GPRPair. -static unsigned getPairedGPR(unsigned Reg, bool Odd, const MCRegisterInfo *RI) { +static MCPhysReg getPairedGPR(MCPhysReg Reg, bool Odd, + const MCRegisterInfo *RI) { for (MCSuperRegIterator Supers(Reg, RI); Supers.isValid(); ++Supers) if (ARM::GPRPairRegClass.contains(*Supers)) return RI->getSubReg(*Supers, Odd ? ARM::gsub_1 : ARM::gsub_0); @@ -297,15 +313,12 @@ static unsigned getPairedGPR(unsigned Reg, bool Odd, const MCRegisterInfo *RI) { } // Resolve the RegPairEven / RegPairOdd register allocator hints. -bool -ARMBaseRegisterInfo::getRegAllocationHints(unsigned VirtReg, - ArrayRef<MCPhysReg> Order, - SmallVectorImpl<MCPhysReg> &Hints, - const MachineFunction &MF, - const VirtRegMap *VRM, - const LiveRegMatrix *Matrix) const { +bool ARMBaseRegisterInfo::getRegAllocationHints( + Register VirtReg, ArrayRef<MCPhysReg> Order, + SmallVectorImpl<MCPhysReg> &Hints, const MachineFunction &MF, + const VirtRegMap *VRM, const LiveRegMatrix *Matrix) const { const MachineRegisterInfo &MRI = MF.getRegInfo(); - std::pair<unsigned, unsigned> Hint = MRI.getRegAllocationHint(VirtReg); + std::pair<Register, Register> Hint = MRI.getRegAllocationHint(VirtReg); unsigned Odd; switch (Hint.first) { @@ -323,12 +336,12 @@ ARMBaseRegisterInfo::getRegAllocationHints(unsigned VirtReg, // This register should preferably be even (Odd == 0) or odd (Odd == 1). // Check if the other part of the pair has already been assigned, and provide // the paired register as the first hint. - unsigned Paired = Hint.second; - if (Paired == 0) + Register Paired = Hint.second; + if (!Paired) return false; - unsigned PairedPhys = 0; - if (Register::isPhysicalRegister(Paired)) { + Register PairedPhys; + if (Paired.isPhysical()) { PairedPhys = Paired; } else if (VRM && VRM->hasPhys(Paired)) { PairedPhys = getPairedGPR(VRM->getPhys(Paired), Odd, this); @@ -339,11 +352,11 @@ ARMBaseRegisterInfo::getRegAllocationHints(unsigned VirtReg, Hints.push_back(PairedPhys); // Then prefer even or odd registers. - for (unsigned Reg : Order) { + for (MCPhysReg Reg : Order) { if (Reg == PairedPhys || (getEncodingValue(Reg) & 1) != Odd) continue; // Don't provide hints that are paired to a reserved register. - unsigned Paired = getPairedGPR(Reg, !Odd, this); + MCPhysReg Paired = getPairedGPR(Reg, !Odd, this); if (!Paired || MRI.isReserved(Paired)) continue; Hints.push_back(Reg); @@ -351,27 +364,27 @@ ARMBaseRegisterInfo::getRegAllocationHints(unsigned VirtReg, return false; } -void -ARMBaseRegisterInfo::updateRegAllocHint(unsigned Reg, unsigned NewReg, - MachineFunction &MF) const { +void ARMBaseRegisterInfo::updateRegAllocHint(Register Reg, Register NewReg, + MachineFunction &MF) const { MachineRegisterInfo *MRI = &MF.getRegInfo(); - std::pair<unsigned, unsigned> Hint = MRI->getRegAllocationHint(Reg); - if ((Hint.first == (unsigned)ARMRI::RegPairOdd || - Hint.first == (unsigned)ARMRI::RegPairEven) && - Register::isVirtualRegister(Hint.second)) { + std::pair<Register, Register> Hint = MRI->getRegAllocationHint(Reg); + if ((Hint.first == ARMRI::RegPairOdd || Hint.first == ARMRI::RegPairEven) && + Hint.second.isVirtual()) { // If 'Reg' is one of the even / odd register pair and it's now changed // (e.g. coalesced) into a different register. The other register of the // pair allocation hint must be updated to reflect the relationship // change. - unsigned OtherReg = Hint.second; + Register OtherReg = Hint.second; Hint = MRI->getRegAllocationHint(OtherReg); // Make sure the pair has not already divorced. if (Hint.second == Reg) { MRI->setRegAllocationHint(OtherReg, Hint.first, NewReg); if (Register::isVirtualRegister(NewReg)) MRI->setRegAllocationHint(NewReg, - Hint.first == (unsigned)ARMRI::RegPairOdd ? ARMRI::RegPairEven - : ARMRI::RegPairOdd, OtherReg); + Hint.first == ARMRI::RegPairOdd + ? ARMRI::RegPairEven + : ARMRI::RegPairOdd, + OtherReg); } } } @@ -457,14 +470,14 @@ ARMBaseRegisterInfo::getFrameRegister(const MachineFunction &MF) const { /// specified immediate. void ARMBaseRegisterInfo::emitLoadConstPool( MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, - const DebugLoc &dl, unsigned DestReg, unsigned SubIdx, int Val, - ARMCC::CondCodes Pred, unsigned PredReg, unsigned MIFlags) const { + const DebugLoc &dl, Register DestReg, unsigned SubIdx, int Val, + ARMCC::CondCodes Pred, Register PredReg, unsigned MIFlags) const { MachineFunction &MF = *MBB.getParent(); const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo(); MachineConstantPool *ConstantPool = MF.getConstantPool(); const Constant *C = ConstantInt::get(Type::getInt32Ty(MF.getFunction().getContext()), Val); - unsigned Idx = ConstantPool->getConstantPoolIndex(C, 4); + unsigned Idx = ConstantPool->getConstantPoolIndex(C, Align(4)); BuildMI(MBB, MBBI, dl, TII.get(ARM::LDRcp)) .addReg(DestReg, getDefRegState(true), SubIdx) @@ -480,11 +493,6 @@ requiresRegisterScavenging(const MachineFunction &MF) const { } bool ARMBaseRegisterInfo:: -trackLivenessAfterRegAlloc(const MachineFunction &MF) const { - return true; -} - -bool ARMBaseRegisterInfo:: requiresFrameIndexScavenging(const MachineFunction &MF) const { return true; } @@ -606,9 +614,9 @@ needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const { // The FP is only available if there is no dynamic realignment. We // don't know for sure yet whether we'll need that, so we guess based // on whether there are any local variables that would trigger it. - unsigned StackAlign = TFI->getStackAlignment(); if (TFI->hasFP(MF) && - !((MFI.getLocalFrameMaxAlign() > StackAlign) && canRealignStack(MF))) { + !((MFI.getLocalFrameMaxAlign() > TFI->getStackAlign()) && + canRealignStack(MF))) { if (isFrameOffsetLegal(MI, getFrameRegister(MF), FPOffset)) return false; } @@ -626,10 +634,10 @@ needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const { /// materializeFrameBaseRegister - Insert defining instruction(s) for BaseReg to /// be a pointer to FrameIdx at the beginning of the basic block. -void ARMBaseRegisterInfo:: -materializeFrameBaseRegister(MachineBasicBlock *MBB, - unsigned BaseReg, int FrameIdx, - int64_t Offset) const { +void ARMBaseRegisterInfo::materializeFrameBaseRegister(MachineBasicBlock *MBB, + Register BaseReg, + int FrameIdx, + int64_t Offset) const { ARMFunctionInfo *AFI = MBB->getParent()->getInfo<ARMFunctionInfo>(); unsigned ADDriOpc = !AFI->isThumbFunction() ? ARM::ADDri : (AFI->isThumb1OnlyFunction() ? ARM::tADDframe : ARM::t2ADDri); @@ -652,7 +660,7 @@ materializeFrameBaseRegister(MachineBasicBlock *MBB, MIB.add(predOps(ARMCC::AL)).add(condCodeOp()); } -void ARMBaseRegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg, +void ARMBaseRegisterInfo::resolveFrameIndex(MachineInstr &MI, Register BaseReg, int64_t Offset) const { MachineBasicBlock &MBB = *MI.getParent(); MachineFunction &MF = *MBB.getParent(); @@ -680,7 +688,8 @@ void ARMBaseRegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg, (void)Done; } -bool ARMBaseRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI, unsigned BaseReg, +bool ARMBaseRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI, + Register BaseReg, int64_t Offset) const { const MCInstrDesc &Desc = MI->getDesc(); unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask); @@ -759,7 +768,7 @@ ARMBaseRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, assert(!AFI->isThumb1OnlyFunction() && "This eliminateFrameIndex does not support Thumb1!"); int FrameIndex = MI.getOperand(FIOperandNum).getIndex(); - unsigned FrameReg; + Register FrameReg; int Offset = TFI->ResolveFrameIndexReference(MF, FrameIndex, FrameReg, SPAdj); |
