mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-06 23:32:27 +00:00
Mark the Int_eh_sjlj_dispatchsetup pseudo instruction as clobbering all
registers. Previously, the register we being marked as implicitly defined, but not killed. In some cases this would cause the register scavenger to spill a dead register. Also, use an empty register mask to simplify the logic and to reduce the memory footprint. rdar://12592448 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167499 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7979b24e5c
commit
e7bd51980a
@ -84,6 +84,11 @@ ARMBaseRegisterInfo::getCallPreservedMask(CallingConv::ID) const {
|
||||
? CSR_iOS_RegMask : CSR_AAPCS_RegMask;
|
||||
}
|
||||
|
||||
const uint32_t*
|
||||
ARMBaseRegisterInfo::getNoPreservedMask() const {
|
||||
return CSR_NoRegs_RegMask;
|
||||
}
|
||||
|
||||
BitVector ARMBaseRegisterInfo::
|
||||
getReservedRegs(const MachineFunction &MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
|
||||
|
@ -96,6 +96,7 @@ public:
|
||||
/// Code Generation virtual methods...
|
||||
const uint16_t *getCalleeSavedRegs(const MachineFunction *MF = 0) const;
|
||||
const uint32_t *getCallPreservedMask(CallingConv::ID) const;
|
||||
const uint32_t *getNoPreservedMask() const;
|
||||
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
|
||||
|
@ -190,6 +190,8 @@ def RetCC_ARM_AAPCS_VFP : CallingConv<[
|
||||
// Callee-saved register lists.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
def CSR_NoRegs : CalleeSavedRegs<(add)>;
|
||||
|
||||
def CSR_AAPCS : CalleeSavedRegs<(add LR, R11, R10, R9, R8, R7, R6, R5, R4,
|
||||
(sequence "D%u", 15, 8))>;
|
||||
|
||||
|
@ -777,9 +777,7 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
|
||||
MI.eraseFromParent();
|
||||
return true;
|
||||
}
|
||||
case ARM::Int_eh_sjlj_dispatchsetup:
|
||||
case ARM::Int_eh_sjlj_dispatchsetup_nofp:
|
||||
case ARM::tInt_eh_sjlj_dispatchsetup: {
|
||||
case ARM::Int_eh_sjlj_dispatchsetup: {
|
||||
MachineFunction &MF = *MI.getParent()->getParent();
|
||||
const ARMBaseInstrInfo *AII =
|
||||
static_cast<const ARMBaseInstrInfo*>(TII);
|
||||
|
@ -6077,12 +6077,15 @@ EmitSjLjDispatchBlock(MachineInstr *MI, MachineBasicBlock *MBB) const {
|
||||
MachineMemOperand::MOLoad |
|
||||
MachineMemOperand::MOVolatile, 4, 4);
|
||||
|
||||
if (AFI->isThumb1OnlyFunction())
|
||||
BuildMI(DispatchBB, dl, TII->get(ARM::tInt_eh_sjlj_dispatchsetup));
|
||||
else if (!Subtarget->hasVFP2())
|
||||
BuildMI(DispatchBB, dl, TII->get(ARM::Int_eh_sjlj_dispatchsetup_nofp));
|
||||
else
|
||||
BuildMI(DispatchBB, dl, TII->get(ARM::Int_eh_sjlj_dispatchsetup));
|
||||
MachineInstrBuilder MIB;
|
||||
MIB = BuildMI(DispatchBB, dl, TII->get(ARM::Int_eh_sjlj_dispatchsetup));
|
||||
|
||||
const ARMBaseInstrInfo *AII = static_cast<const ARMBaseInstrInfo*>(TII);
|
||||
const ARMBaseRegisterInfo &RI = AII->getRegisterInfo();
|
||||
|
||||
// Add a register mask with no preserved registers. This results in all
|
||||
// registers being marked as clobbered.
|
||||
MIB.addRegMask(RI.getNoPreservedMask());
|
||||
|
||||
unsigned NumLPads = LPadList.size();
|
||||
if (Subtarget->isThumb2()) {
|
||||
@ -6301,8 +6304,6 @@ EmitSjLjDispatchBlock(MachineInstr *MI, MachineBasicBlock *MBB) const {
|
||||
}
|
||||
|
||||
// N.B. the order the invoke BBs are processed in doesn't matter here.
|
||||
const ARMBaseInstrInfo *AII = static_cast<const ARMBaseInstrInfo*>(TII);
|
||||
const ARMBaseRegisterInfo &RI = AII->getRegisterInfo();
|
||||
const uint16_t *SavedRegs = RI.getCalleeSavedRegs(MF);
|
||||
SmallVector<MachineBasicBlock*, 64> MBBLPads;
|
||||
for (SmallPtrSet<MachineBasicBlock*, 64>::iterator
|
||||
|
@ -4743,21 +4743,13 @@ def Int_eh_sjlj_longjmp : PseudoInst<(outs), (ins GPR:$src, GPR:$scratch),
|
||||
Requires<[IsARM, IsIOS]>;
|
||||
}
|
||||
|
||||
// eh.sjlj.dispatchsetup pseudo-instructions.
|
||||
// These pseudos are used for both ARM and Thumb2. Any differences are
|
||||
// handled when the pseudo is expanded (which happens before any passes
|
||||
// that need the instruction size).
|
||||
let Defs =
|
||||
[ R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, LR, CPSR,
|
||||
Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10, Q11, Q12, Q13, Q14, Q15 ],
|
||||
isBarrier = 1 in
|
||||
// eh.sjlj.dispatchsetup pseudo-instruction.
|
||||
// This pseudo is used for both ARM and Thumb. Any differences are handled when
|
||||
// the pseudo is expanded (which happens before any passes that need the
|
||||
// instruction size).
|
||||
let isBarrier = 1 in
|
||||
def Int_eh_sjlj_dispatchsetup : PseudoInst<(outs), (ins), NoItinerary, []>;
|
||||
|
||||
let Defs =
|
||||
[ R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, LR, CPSR ],
|
||||
isBarrier = 1 in
|
||||
def Int_eh_sjlj_dispatchsetup_nofp : PseudoInst<(outs), (ins), NoItinerary, []>;
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Non-Instruction Patterns
|
||||
|
@ -1247,10 +1247,6 @@ def tInt_eh_sjlj_longjmp : XI<(outs), (ins GPR:$src, GPR:$scratch),
|
||||
[(ARMeh_sjlj_longjmp GPR:$src, GPR:$scratch)]>,
|
||||
Requires<[IsThumb, IsIOS]>;
|
||||
|
||||
let Defs = [ R0, R1, R2, R3, R4, R5, R6, R7, R12, CPSR ],
|
||||
isBarrier = 1 in
|
||||
def tInt_eh_sjlj_dispatchsetup : PseudoInst<(outs), (ins), NoItinerary, []>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Non-Instruction Patterns
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user