mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	Enable thumb1 register scavenging by default.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83494 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -37,11 +37,6 @@
 | 
				
			|||||||
#include "llvm/Support/raw_ostream.h"
 | 
					#include "llvm/Support/raw_ostream.h"
 | 
				
			||||||
using namespace llvm;
 | 
					using namespace llvm;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// FIXME: This cmd line option conditionalizes the new register scavenging
 | 
					 | 
				
			||||||
// implemenation in PEI. Remove the option when scavenging works well enough
 | 
					 | 
				
			||||||
// to be the default.
 | 
					 | 
				
			||||||
extern cl::opt<bool> FrameIndexVirtualScavenging;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Thumb1RegisterInfo::Thumb1RegisterInfo(const ARMBaseInstrInfo &tii,
 | 
					Thumb1RegisterInfo::Thumb1RegisterInfo(const ARMBaseInstrInfo &tii,
 | 
				
			||||||
                                       const ARMSubtarget &sti)
 | 
					                                       const ARMSubtarget &sti)
 | 
				
			||||||
  : ARMBaseRegisterInfo(tii, sti) {
 | 
					  : ARMBaseRegisterInfo(tii, sti) {
 | 
				
			||||||
@@ -84,7 +79,13 @@ Thumb1RegisterInfo::getPhysicalRegisterRegClass(unsigned Reg, EVT VT) const {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
bool
 | 
					bool
 | 
				
			||||||
Thumb1RegisterInfo::requiresRegisterScavenging(const MachineFunction &MF) const {
 | 
					Thumb1RegisterInfo::requiresRegisterScavenging(const MachineFunction &MF) const {
 | 
				
			||||||
  return FrameIndexVirtualScavenging;
 | 
					  return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					Thumb1RegisterInfo::requiresFrameIndexScavenging(const MachineFunction &MF)
 | 
				
			||||||
 | 
					  const {
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Thumb1RegisterInfo::hasReservedCallFrame(MachineFunction &MF) const {
 | 
					bool Thumb1RegisterInfo::hasReservedCallFrame(MachineFunction &MF) const {
 | 
				
			||||||
@@ -128,13 +129,7 @@ void emitThumbRegPlusImmInReg(MachineBasicBlock &MBB,
 | 
				
			|||||||
    unsigned LdReg = DestReg;
 | 
					    unsigned LdReg = DestReg;
 | 
				
			||||||
    if (DestReg == ARM::SP) {
 | 
					    if (DestReg == ARM::SP) {
 | 
				
			||||||
      assert(BaseReg == ARM::SP && "Unexpected!");
 | 
					      assert(BaseReg == ARM::SP && "Unexpected!");
 | 
				
			||||||
      if (FrameIndexVirtualScavenging) {
 | 
					      LdReg = MF.getRegInfo().createVirtualRegister(ARM::tGPRRegisterClass);
 | 
				
			||||||
        LdReg = MF.getRegInfo().createVirtualRegister(ARM::tGPRRegisterClass);
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        LdReg = ARM::R3;
 | 
					 | 
				
			||||||
        BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVtgpr2gpr), ARM::R12)
 | 
					 | 
				
			||||||
          .addReg(ARM::R3, RegState::Kill);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (NumBytes <= 255 && NumBytes >= 0)
 | 
					    if (NumBytes <= 255 && NumBytes >= 0)
 | 
				
			||||||
@@ -159,10 +154,6 @@ void emitThumbRegPlusImmInReg(MachineBasicBlock &MBB,
 | 
				
			|||||||
    else
 | 
					    else
 | 
				
			||||||
      MIB.addReg(LdReg).addReg(BaseReg, RegState::Kill);
 | 
					      MIB.addReg(LdReg).addReg(BaseReg, RegState::Kill);
 | 
				
			||||||
    AddDefaultPred(MIB);
 | 
					    AddDefaultPred(MIB);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!FrameIndexVirtualScavenging && DestReg == ARM::SP)
 | 
					 | 
				
			||||||
      BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVgpr2tgpr), ARM::R3)
 | 
					 | 
				
			||||||
        .addReg(ARM::R12, RegState::Kill);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// calcNumMI - Returns the number of instructions required to materialize
 | 
					/// calcNumMI - Returns the number of instructions required to materialize
 | 
				
			||||||
@@ -635,7 +626,6 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
 | 
				
			|||||||
    else  // tLDR has an extra register operand.
 | 
					    else  // tLDR has an extra register operand.
 | 
				
			||||||
      MI.addOperand(MachineOperand::CreateReg(0, false));
 | 
					      MI.addOperand(MachineOperand::CreateReg(0, false));
 | 
				
			||||||
  } else if (Desc.mayStore()) {
 | 
					  } else if (Desc.mayStore()) {
 | 
				
			||||||
    if (FrameIndexVirtualScavenging) {
 | 
					 | 
				
			||||||
      VReg = MF.getRegInfo().createVirtualRegister(ARM::tGPRRegisterClass);
 | 
					      VReg = MF.getRegInfo().createVirtualRegister(ARM::tGPRRegisterClass);
 | 
				
			||||||
      assert (Value && "Frame index virtual allocated, but Value arg is NULL!");
 | 
					      assert (Value && "Frame index virtual allocated, but Value arg is NULL!");
 | 
				
			||||||
      *Value = Offset;
 | 
					      *Value = Offset;
 | 
				
			||||||
@@ -658,52 +648,6 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
 | 
				
			|||||||
        MI.addOperand(MachineOperand::CreateReg(FrameReg, false));
 | 
					        MI.addOperand(MachineOperand::CreateReg(FrameReg, false));
 | 
				
			||||||
      else // tSTR has an extra register operand.
 | 
					      else // tSTR has an extra register operand.
 | 
				
			||||||
        MI.addOperand(MachineOperand::CreateReg(0, false));
 | 
					        MI.addOperand(MachineOperand::CreateReg(0, false));
 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      // FIXME! This is horrific!!! We need register scavenging.
 | 
					 | 
				
			||||||
      // Our temporary workaround has marked r3 unavailable. Of course, r3 is
 | 
					 | 
				
			||||||
      // also a ABI register so it's possible that is is the register that is
 | 
					 | 
				
			||||||
      // being storing here. If that's the case, we do the following:
 | 
					 | 
				
			||||||
      // r12 = r2
 | 
					 | 
				
			||||||
      // Use r2 to materialize sp + offset
 | 
					 | 
				
			||||||
      // str r3, r2
 | 
					 | 
				
			||||||
      // r2 = r12
 | 
					 | 
				
			||||||
      unsigned ValReg = MI.getOperand(0).getReg();
 | 
					 | 
				
			||||||
      unsigned TmpReg = ARM::R3;
 | 
					 | 
				
			||||||
      bool UseRR = false;
 | 
					 | 
				
			||||||
      if (ValReg == ARM::R3) {
 | 
					 | 
				
			||||||
        BuildMI(MBB, II, dl, TII.get(ARM::tMOVtgpr2gpr), ARM::R12)
 | 
					 | 
				
			||||||
          .addReg(ARM::R2, RegState::Kill);
 | 
					 | 
				
			||||||
        TmpReg = ARM::R2;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if (TmpReg == ARM::R3 && AFI->isR3LiveIn())
 | 
					 | 
				
			||||||
        BuildMI(MBB, II, dl, TII.get(ARM::tMOVtgpr2gpr), ARM::R12)
 | 
					 | 
				
			||||||
          .addReg(ARM::R3, RegState::Kill);
 | 
					 | 
				
			||||||
      if (Opcode == ARM::tSpill) {
 | 
					 | 
				
			||||||
        if (FrameReg == ARM::SP)
 | 
					 | 
				
			||||||
          emitThumbRegPlusImmInReg(MBB, II, TmpReg, FrameReg,
 | 
					 | 
				
			||||||
                                   Offset, false, TII, *this, dl);
 | 
					 | 
				
			||||||
        else {
 | 
					 | 
				
			||||||
          emitLoadConstPool(MBB, II, dl, TmpReg, 0, Offset);
 | 
					 | 
				
			||||||
          UseRR = true;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      } else
 | 
					 | 
				
			||||||
        emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg, Offset, TII,
 | 
					 | 
				
			||||||
                                  *this, dl);
 | 
					 | 
				
			||||||
      MI.setDesc(TII.get(ARM::tSTR));
 | 
					 | 
				
			||||||
      MI.getOperand(i).ChangeToRegister(TmpReg, false, false, true);
 | 
					 | 
				
			||||||
      if (UseRR)  // Use [reg, reg] addrmode.
 | 
					 | 
				
			||||||
        MI.addOperand(MachineOperand::CreateReg(FrameReg, false));
 | 
					 | 
				
			||||||
      else // tSTR has an extra register operand.
 | 
					 | 
				
			||||||
        MI.addOperand(MachineOperand::CreateReg(0, false));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      MachineBasicBlock::iterator NII = next(II);
 | 
					 | 
				
			||||||
      if (ValReg == ARM::R3)
 | 
					 | 
				
			||||||
        BuildMI(MBB, NII, dl, TII.get(ARM::tMOVgpr2tgpr), ARM::R2)
 | 
					 | 
				
			||||||
          .addReg(ARM::R12, RegState::Kill);
 | 
					 | 
				
			||||||
      if (TmpReg == ARM::R3 && AFI->isR3LiveIn())
 | 
					 | 
				
			||||||
        BuildMI(MBB, NII, dl, TII.get(ARM::tMOVgpr2tgpr), ARM::R3)
 | 
					 | 
				
			||||||
          .addReg(ARM::R12, RegState::Kill);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  } else
 | 
					  } else
 | 
				
			||||||
    assert(false && "Unexpected opcode!");
 | 
					    assert(false && "Unexpected opcode!");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,6 +41,7 @@ public:
 | 
				
			|||||||
    getPhysicalRegisterRegClass(unsigned Reg, EVT VT = MVT::Other) const;
 | 
					    getPhysicalRegisterRegClass(unsigned Reg, EVT VT = MVT::Other) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bool requiresRegisterScavenging(const MachineFunction &MF) const;
 | 
					  bool requiresRegisterScavenging(const MachineFunction &MF) const;
 | 
				
			||||||
 | 
					  bool requiresFrameIndexScavenging(const MachineFunction &MF) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bool hasReservedCallFrame(MachineFunction &MF) const;
 | 
					  bool hasReservedCallFrame(MachineFunction &MF) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user