summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/Sparc
diff options
context:
space:
mode:
authorDaniel Cederman <cederman@gaisler.com>2018-09-27 13:32:54 +0000
committerDaniel Cederman <cederman@gaisler.com>2018-09-27 13:32:54 +0000
commit0c05bdea2bc6e9acc1fb8455c01527e1cfe0e02a (patch)
tree5a94d7621ea3e095d7ecd872fd32e7955430a17f /llvm/lib/Target/Sparc
parentddb7d46aa53c2eeff3b07427f9c1e776332b8837 (diff)
downloadbcm5719-llvm-0c05bdea2bc6e9acc1fb8455c01527e1cfe0e02a.tar.gz
bcm5719-llvm-0c05bdea2bc6e9acc1fb8455c01527e1cfe0e02a.zip
[Sparc] Remove the support for builtin setjmp/longjmp
Summary: It is currently broken and for Sparc there is not much benefit in using a builtin version compared to a library version. Both versions needs to store the same four values in setjmp and flush the register windows in longjmp. If the need for a builtin setjmp/longjmp arises there is an improved implementation available at https://reviews.llvm.org/D50969. Reviewers: jyknight, joerg, venkatra Subscribers: fedor.sergeev, jrtc27, llvm-commits Differential Revision: https://reviews.llvm.org/D51487 llvm-svn: 343210
Diffstat (limited to 'llvm/lib/Target/Sparc')
-rw-r--r--llvm/lib/Target/Sparc/SparcISelLowering.cpp227
-rw-r--r--llvm/lib/Target/Sparc/SparcISelLowering.h12
-rw-r--r--llvm/lib/Target/Sparc/SparcInstrInfo.td31
3 files changed, 0 insertions, 270 deletions
diff --git a/llvm/lib/Target/Sparc/SparcISelLowering.cpp b/llvm/lib/Target/Sparc/SparcISelLowering.cpp
index 7236d75ecd3..307b6e3c382 100644
--- a/llvm/lib/Target/Sparc/SparcISelLowering.cpp
+++ b/llvm/lib/Target/Sparc/SparcISelLowering.cpp
@@ -1545,9 +1545,6 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
setOperationAction(ISD::SELECT_CC, MVT::f64, Custom);
setOperationAction(ISD::SELECT_CC, MVT::f128, Custom);
- setOperationAction(ISD::EH_SJLJ_SETJMP, MVT::i32, Custom);
- setOperationAction(ISD::EH_SJLJ_LONGJMP, MVT::Other, Custom);
-
setOperationAction(ISD::ADDC, MVT::i32, Custom);
setOperationAction(ISD::ADDE, MVT::i32, Custom);
setOperationAction(ISD::SUBC, MVT::i32, Custom);
@@ -1828,8 +1825,6 @@ const char *SparcTargetLowering::getTargetNodeName(unsigned Opcode) const {
case SPISD::SELECT_ICC: return "SPISD::SELECT_ICC";
case SPISD::SELECT_XCC: return "SPISD::SELECT_XCC";
case SPISD::SELECT_FCC: return "SPISD::SELECT_FCC";
- case SPISD::EH_SJLJ_SETJMP: return "SPISD::EH_SJLJ_SETJMP";
- case SPISD::EH_SJLJ_LONGJMP: return "SPISD::EH_SJLJ_LONGJMP";
case SPISD::Hi: return "SPISD::Hi";
case SPISD::Lo: return "SPISD::Lo";
case SPISD::FTOI: return "SPISD::FTOI";
@@ -2502,20 +2497,6 @@ static SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG,
DAG.getConstant(SPCC, dl, MVT::i32), CompareFlag);
}
-SDValue SparcTargetLowering::LowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG,
- const SparcTargetLowering &TLI) const {
- SDLoc DL(Op);
- return DAG.getNode(SPISD::EH_SJLJ_SETJMP, DL,
- DAG.getVTList(MVT::i32, MVT::Other), Op.getOperand(0), Op.getOperand(1));
-
-}
-
-SDValue SparcTargetLowering::LowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG,
- const SparcTargetLowering &TLI) const {
- SDLoc DL(Op);
- return DAG.getNode(SPISD::EH_SJLJ_LONGJMP, DL, MVT::Other, Op.getOperand(0), Op.getOperand(1));
-}
-
static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG,
const SparcTargetLowering &TLI) {
MachineFunction &MF = DAG.getMachineFunction();
@@ -3045,8 +3026,6 @@ LowerOperation(SDValue Op, SelectionDAG &DAG) const {
hasHardQuad);
case ISD::SELECT_CC: return LowerSELECT_CC(Op, DAG, *this,
hasHardQuad);
- case ISD::EH_SJLJ_SETJMP: return LowerEH_SJLJ_SETJMP(Op, DAG, *this);
- case ISD::EH_SJLJ_LONGJMP: return LowerEH_SJLJ_LONGJMP(Op, DAG, *this);
case ISD::VASTART: return LowerVASTART(Op, DAG, *this);
case ISD::VAARG: return LowerVAARG(Op, DAG);
case ISD::DYNAMIC_STACKALLOC: return LowerDYNAMIC_STACKALLOC(Op, DAG,
@@ -3129,13 +3108,6 @@ SparcTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
case SP::SELECT_CC_DFP_FCC:
case SP::SELECT_CC_QFP_FCC:
return expandSelectCC(MI, BB, SP::FBCOND);
- case SP::EH_SJLJ_SETJMP32ri:
- case SP::EH_SJLJ_SETJMP32rr:
- return emitEHSjLjSetJmp(MI, BB);
- case SP::EH_SJLJ_LONGJMP32rr:
- case SP::EH_SJLJ_LONGJMP32ri:
- return emitEHSjLjLongJmp(MI, BB);
-
}
}
@@ -3195,205 +3167,6 @@ SparcTargetLowering::expandSelectCC(MachineInstr &MI, MachineBasicBlock *BB,
return SinkMBB;
}
-MachineBasicBlock *
-SparcTargetLowering::emitEHSjLjLongJmp(MachineInstr &MI,
- MachineBasicBlock *MBB) const {
- DebugLoc DL = MI.getDebugLoc();
- const TargetInstrInfo *TII = Subtarget->getInstrInfo();
-
- MachineFunction *MF = MBB->getParent();
- MachineRegisterInfo &MRI = MF->getRegInfo();
- MachineInstrBuilder MIB;
-
- MVT PVT = getPointerTy(MF->getDataLayout());
- unsigned RegSize = PVT.getStoreSize();
- assert(PVT == MVT::i32 && "Invalid Pointer Size!");
-
- unsigned Buf = MI.getOperand(0).getReg();
- unsigned JmpLoc = MRI.createVirtualRegister(&SP::IntRegsRegClass);
-
- // TO DO: If we do 64-bit handling, this perhaps should be FLUSHW, not TA 3
- MIB = BuildMI(*MBB, MI, DL, TII->get(SP::TRAPri), SP::G0).addImm(3).addImm(SPCC::ICC_A);
-
- // Instruction to restore FP
- const unsigned FP = SP::I6;
- MIB = BuildMI(*MBB, MI, DL, TII->get(SP::LDri))
- .addReg(FP)
- .addReg(Buf)
- .addImm(0);
-
- // Instruction to load jmp location
- MIB = BuildMI(*MBB, MI, DL, TII->get(SP::LDri))
- .addReg(JmpLoc, RegState::Define)
- .addReg(Buf)
- .addImm(RegSize);
-
- // Instruction to restore SP
- const unsigned SP = SP::O6;
- MIB = BuildMI(*MBB, MI, DL, TII->get(SP::LDri))
- .addReg(SP)
- .addReg(Buf)
- .addImm(2 * RegSize);
-
- // Instruction to restore I7
- MIB = BuildMI(*MBB, MI, DL, TII->get(SP::LDri))
- .addReg(SP::I7)
- .addReg(Buf, RegState::Kill)
- .addImm(3 * RegSize);
-
- // Jump to JmpLoc
- BuildMI(*MBB, MI, DL, TII->get(SP::JMPLrr)).addReg(SP::G0).addReg(JmpLoc, RegState::Kill).addReg(SP::G0);
-
- MI.eraseFromParent();
- return MBB;
-}
-
-MachineBasicBlock *
-SparcTargetLowering::emitEHSjLjSetJmp(MachineInstr &MI,
- MachineBasicBlock *MBB) const {
- DebugLoc DL = MI.getDebugLoc();
- const TargetInstrInfo *TII = Subtarget->getInstrInfo();
- const TargetRegisterInfo *TRI = Subtarget->getRegisterInfo();
-
- MachineFunction *MF = MBB->getParent();
- MachineRegisterInfo &MRI = MF->getRegInfo();
- MachineInstrBuilder MIB;
-
- MVT PVT = getPointerTy(MF->getDataLayout());
- unsigned RegSize = PVT.getStoreSize();
- assert(PVT == MVT::i32 && "Invalid Pointer Size!");
-
- unsigned DstReg = MI.getOperand(0).getReg();
- const TargetRegisterClass *RC = MRI.getRegClass(DstReg);
- assert(TRI->isTypeLegalForClass(*RC, MVT::i32) && "Invalid destination!");
- (void)TRI;
- unsigned mainDstReg = MRI.createVirtualRegister(RC);
- unsigned restoreDstReg = MRI.createVirtualRegister(RC);
-
- // For v = setjmp(buf), we generate
- //
- // thisMBB:
- // buf[0] = FP
- // buf[RegSize] = restoreMBB <-- takes address of restoreMBB
- // buf[RegSize * 2] = O6
- // buf[RegSize * 3] = I7
- // Ensure restoreMBB remains in the relocations list (done using a bn instruction)
- // b mainMBB
- //
- // mainMBB:
- // v_main = 0
- // b sinkMBB
- //
- // restoreMBB:
- // v_restore = 1
- // --fall through--
- //
- // sinkMBB:
- // v = phi(main, restore)
-
- const BasicBlock *BB = MBB->getBasicBlock();
- MachineFunction::iterator It = ++MBB->getIterator();
- MachineBasicBlock *thisMBB = MBB;
- MachineBasicBlock *mainMBB = MF->CreateMachineBasicBlock(BB);
- MachineBasicBlock *restoreMBB = MF->CreateMachineBasicBlock(BB);
- MachineBasicBlock *sinkMBB = MF->CreateMachineBasicBlock(BB);
-
- MF->insert(It, mainMBB);
- MF->insert(It, restoreMBB);
- MF->insert(It, sinkMBB);
- restoreMBB->setHasAddressTaken();
-
- // Transfer the remainder of BB and its successor edges to sinkMBB.
- sinkMBB->splice(sinkMBB->begin(), MBB,
- std::next(MachineBasicBlock::iterator(MI)),
- MBB->end());
- sinkMBB->transferSuccessorsAndUpdatePHIs(MBB);
-
- unsigned LabelReg = MRI.createVirtualRegister(&SP::IntRegsRegClass);
- unsigned LabelReg2 = MRI.createVirtualRegister(&SP::IntRegsRegClass);
- unsigned BufReg = MI.getOperand(1).getReg();
-
- // Instruction to store FP
- const unsigned FP = SP::I6;
- MIB = BuildMI(thisMBB, DL, TII->get(SP::STri))
- .addReg(BufReg)
- .addImm(0)
- .addReg(FP);
-
- // Instructions to store jmp location
- MIB = BuildMI(thisMBB, DL, TII->get(SP::SETHIi))
- .addReg(LabelReg, RegState::Define)
- .addMBB(restoreMBB, SparcMCExpr::VK_Sparc_HI);
-
- MIB = BuildMI(thisMBB, DL, TII->get(SP::ORri))
- .addReg(LabelReg2, RegState::Define)
- .addReg(LabelReg, RegState::Kill)
- .addMBB(restoreMBB, SparcMCExpr::VK_Sparc_LO);
-
- MIB = BuildMI(thisMBB, DL, TII->get(SP::STri))
- .addReg(BufReg)
- .addImm(RegSize)
- .addReg(LabelReg2, RegState::Kill);
-
- // Instruction to store SP
- const unsigned SP = SP::O6;
- MIB = BuildMI(thisMBB, DL, TII->get(SP::STri))
- .addReg(BufReg)
- .addImm(2 * RegSize)
- .addReg(SP);
-
- // Instruction to store I7
- MIB = BuildMI(thisMBB, DL, TII->get(SP::STri))
- .addReg(BufReg)
- .addImm(3 * RegSize)
- .addReg(SP::I7);
-
-
- // FIX ME: This next instruction ensures that the restoreMBB block address remains
- // valid through optimization passes and serves no other purpose. The ICC_N ensures
- // that the branch is never taken. This commented-out code here was an alternative
- // attempt to achieve this which brought myriad problems.
- //MIB = BuildMI(thisMBB, DL, TII->get(SP::EH_SjLj_Setup)).addMBB(restoreMBB, SparcMCExpr::VK_Sparc_None);
- MIB = BuildMI(thisMBB, DL, TII->get(SP::BCOND))
- .addMBB(restoreMBB)
- .addImm(SPCC::ICC_N);
-
- MIB = BuildMI(thisMBB, DL, TII->get(SP::BCOND))
- .addMBB(mainMBB)
- .addImm(SPCC::ICC_A);
-
- thisMBB->addSuccessor(mainMBB);
- thisMBB->addSuccessor(restoreMBB);
-
-
- // mainMBB:
- MIB = BuildMI(mainMBB, DL, TII->get(SP::ORrr))
- .addReg(mainDstReg, RegState::Define)
- .addReg(SP::G0)
- .addReg(SP::G0);
- MIB = BuildMI(mainMBB, DL, TII->get(SP::BCOND)).addMBB(sinkMBB).addImm(SPCC::ICC_A);
-
- mainMBB->addSuccessor(sinkMBB);
-
-
- // restoreMBB:
- MIB = BuildMI(restoreMBB, DL, TII->get(SP::ORri))
- .addReg(restoreDstReg, RegState::Define)
- .addReg(SP::G0)
- .addImm(1);
- //MIB = BuildMI(restoreMBB, DL, TII->get(SP::BCOND)).addMBB(sinkMBB).addImm(SPCC::ICC_A);
- restoreMBB->addSuccessor(sinkMBB);
-
- // sinkMBB:
- MIB = BuildMI(*sinkMBB, sinkMBB->begin(), DL,
- TII->get(SP::PHI), DstReg)
- .addReg(mainDstReg).addMBB(mainMBB)
- .addReg(restoreDstReg).addMBB(restoreMBB);
-
- MI.eraseFromParent();
- return sinkMBB;
-}
-
//===----------------------------------------------------------------------===//
// Sparc Inline Assembly Support
//===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/Sparc/SparcISelLowering.h b/llvm/lib/Target/Sparc/SparcISelLowering.h
index 0f7c7311616..718851db25b 100644
--- a/llvm/lib/Target/Sparc/SparcISelLowering.h
+++ b/llvm/lib/Target/Sparc/SparcISelLowering.h
@@ -33,9 +33,6 @@ namespace llvm {
SELECT_XCC, // Select between two values using the current XCC flags.
SELECT_FCC, // Select between two values using the current FCC flags.
- EH_SJLJ_SETJMP, // builtin setjmp operation
- EH_SJLJ_LONGJMP, // builtin longjmp operation
-
Hi, Lo, // Hi/Lo operations, typically on a global address.
FTOI, // FP to Int within a FP register.
@@ -171,11 +168,6 @@ namespace llvm {
SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
- SDValue LowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG,
- const SparcTargetLowering &TLI) const ;
- SDValue LowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG,
- const SparcTargetLowering &TLI) const ;
-
SDValue withTargetFlags(SDValue Op, unsigned TF, SelectionDAG &DAG) const;
SDValue makeHiLoPair(SDValue Op, unsigned HiTF, unsigned LoTF,
SelectionDAG &DAG) const;
@@ -219,10 +211,6 @@ namespace llvm {
MachineBasicBlock *expandSelectCC(MachineInstr &MI, MachineBasicBlock *BB,
unsigned BROpcode) const;
- MachineBasicBlock *emitEHSjLjSetJmp(MachineInstr &MI,
- MachineBasicBlock *MBB) const;
- MachineBasicBlock *emitEHSjLjLongJmp(MachineInstr &MI,
- MachineBasicBlock *MBB) const;
};
} // end namespace llvm
diff --git a/llvm/lib/Target/Sparc/SparcInstrInfo.td b/llvm/lib/Target/Sparc/SparcInstrInfo.td
index 428ba2d3e15..62f3d96af84 100644
--- a/llvm/lib/Target/Sparc/SparcInstrInfo.td
+++ b/llvm/lib/Target/Sparc/SparcInstrInfo.td
@@ -186,9 +186,6 @@ SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisSameAs<0, 1>, SDTCisPtrTy<2>]>;
def SDTSPtlsld :
SDTypeProfile<1, 2, [SDTCisPtrTy<0>, SDTCisPtrTy<1>]>;
-def SDTSPeh_sjlj_setjmp : SDTypeProfile<1, 1, [SDTCisInt<0>, SDTCisPtrTy<1>]>;
-def SDTSPeh_sjlj_longjmp: SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>;
-
def SPcmpicc : SDNode<"SPISD::CMPICC", SDTSPcmpicc, [SDNPOutGlue]>;
def SPcmpfcc : SDNode<"SPISD::CMPFCC", SDTSPcmpfcc, [SDNPOutGlue]>;
def SPbricc : SDNode<"SPISD::BRICC", SDTSPbrcc, [SDNPHasChain, SDNPInGlue]>;
@@ -207,13 +204,6 @@ def SPselecticc : SDNode<"SPISD::SELECT_ICC", SDTSPselectcc, [SDNPInGlue]>;
def SPselectxcc : SDNode<"SPISD::SELECT_XCC", SDTSPselectcc, [SDNPInGlue]>;
def SPselectfcc : SDNode<"SPISD::SELECT_FCC", SDTSPselectcc, [SDNPInGlue]>;
-def SPsjlj_setjmp: SDNode<"SPISD::EH_SJLJ_SETJMP",
- SDTSPeh_sjlj_setjmp,
- [SDNPHasChain, SDNPSideEffect]>;
-def SPsjlj_longjmp: SDNode<"SPISD::EH_SJLJ_LONGJMP",
- SDTSPeh_sjlj_longjmp,
- [SDNPHasChain, SDNPSideEffect]>;
-
// These are target-independent nodes, but have target-specific formats.
def SDT_SPCallSeqStart : SDCallSeqStart<[ SDTCisVT<0, i32>,
SDTCisVT<1, i32> ]>;
@@ -490,27 +480,6 @@ let usesCustomInserter = 1, Uses = [FCC0] in {
[(set f128:$dst, (SPselectfcc f128:$T, f128:$F, imm:$Cond))]>;
}
-let hasSideEffects = 1, isBarrier = 1, usesCustomInserter = 1 in {
- let Defs = [WIM] in
- def EH_SJLJ_SETJMP32ri : Pseudo<(outs IntRegs:$dst), (ins MEMri:$buf),
- "#EH_SJLJ_SETJMP32",
- [(set i32:$dst, (SPsjlj_setjmp ADDRri:$buf))]>,
- Requires<[Is32Bit]>;
- def EH_SJLJ_SETJMP32rr : Pseudo<(outs IntRegs:$dst), (ins MEMrr:$buf),
- "#EH_SJLJ_SETJMP32",
- [(set i32:$dst, (SPsjlj_setjmp ADDRrr:$buf))]>,
- Requires<[Is32Bit]>;
- let isTerminator = 1 in
- def EH_SJLJ_LONGJMP32ri : Pseudo<(outs), (ins MEMri:$buf),
- "#EH_SJLJ_LONGJMP32",
- [(SPsjlj_longjmp ADDRri:$buf)]>,
- Requires<[Is32Bit]>;
- def EH_SJLJ_LONGJMP32rr : Pseudo<(outs), (ins MEMrr:$buf),
- "#EH_SJLJ_LONGJMP32",
- [(SPsjlj_longjmp ADDRrr:$buf)]>,
- Requires<[Is32Bit]>;
-}
-
// Section B.1 - Load Integer Instructions, p. 90
let DecoderMethod = "DecodeLoadInt" in {
defm LDSB : LoadA<"ldsb", 0b001001, 0b011001, sextloadi8, IntRegs, i32>;
OpenPOWER on IntegriCloud