diff options
author | Martell Malone <martellmalone@gmail.com> | 2015-11-23 13:11:39 +0000 |
---|---|---|
committer | Martell Malone <martellmalone@gmail.com> | 2015-11-23 13:11:39 +0000 |
commit | a6b867eb0d6a79a378db68cd913b96f400675e24 (patch) | |
tree | 45bcfe27750ab08f7080707a84a4accc57af764d /llvm/lib/Target/ARM/ARMISelLowering.cpp | |
parent | 5a998ed7a6befd975fb364b079e9c3e9a4c1e45f (diff) | |
download | bcm5719-llvm-a6b867eb0d6a79a378db68cd913b96f400675e24.tar.gz bcm5719-llvm-a6b867eb0d6a79a378db68cd913b96f400675e24.zip |
ARM: address WoA division overflow crash
Disable custom handling of signed 32-bit and 64-bit integer divide.
Add test cases for both 32-bit and 64-bit integer overflow crashes.
llvm-svn: 253865
Diffstat (limited to 'llvm/lib/Target/ARM/ARMISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 31 |
1 files changed, 11 insertions, 20 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 3c99675a473..b9b37396187 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -395,6 +395,8 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM, { RTLIB::SINTTOFP_I64_F64, "__i64tod", CallingConv::ARM_AAPCS_VFP }, { RTLIB::UINTTOFP_I64_F32, "__u64tos", CallingConv::ARM_AAPCS_VFP }, { RTLIB::UINTTOFP_I64_F64, "__u64tod", CallingConv::ARM_AAPCS_VFP }, + { RTLIB::SDIV_I32, "__rt_sdiv", CallingConv::ARM_AAPCS_VFP }, + { RTLIB::SDIV_I64, "__rt_sdiv64", CallingConv::ARM_AAPCS_VFP }, }; for (const auto &LC : LibraryCalls) { @@ -782,10 +784,8 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM, } if (Subtarget->isTargetWindows() && !Subtarget->hasDivide()) { - setOperationAction(ISD::SDIV, MVT::i32, Custom); setOperationAction(ISD::UDIV, MVT::i32, Custom); - setOperationAction(ISD::SDIV, MVT::i64, Custom); setOperationAction(ISD::UDIV, MVT::i64, Custom); } @@ -6667,7 +6667,6 @@ SDValue ARMTargetLowering::LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const { } SDValue ARMTargetLowering::LowerWindowsDIVLibCall(SDValue Op, SelectionDAG &DAG, - bool Signed, SDValue &Chain) const { EVT VT = Op.getValueType(); assert((VT == MVT::i32 || VT == MVT::i64) && @@ -6678,10 +6677,7 @@ SDValue ARMTargetLowering::LowerWindowsDIVLibCall(SDValue Op, SelectionDAG &DAG, const auto &TLI = DAG.getTargetLoweringInfo(); const char *Name = nullptr; - if (Signed) - Name = (VT == MVT::i32) ? "__rt_sdiv" : "__rt_sdiv64"; - else - Name = (VT == MVT::i32) ? "__rt_udiv" : "__rt_udiv64"; + Name = (VT == MVT::i32) ? "__rt_udiv" : "__rt_udiv64"; SDValue ES = DAG.getExternalSymbol(Name, TLI.getPointerTy(DL)); @@ -6703,8 +6699,8 @@ SDValue ARMTargetLowering::LowerWindowsDIVLibCall(SDValue Op, SelectionDAG &DAG, return LowerCallTo(CLI).first; } -SDValue ARMTargetLowering::LowerDIV_Windows(SDValue Op, SelectionDAG &DAG, - bool Signed) const { +SDValue ARMTargetLowering::LowerDIV_Windows(SDValue Op, + SelectionDAG &DAG) const { assert(Op.getValueType() == MVT::i32 && "unexpected type for custom lowering DIV"); SDLoc dl(Op); @@ -6712,11 +6708,11 @@ SDValue ARMTargetLowering::LowerDIV_Windows(SDValue Op, SelectionDAG &DAG, SDValue DBZCHK = DAG.getNode(ARMISD::WIN__DBZCHK, dl, MVT::Other, DAG.getEntryNode(), Op.getOperand(1)); - return LowerWindowsDIVLibCall(Op, DAG, Signed, DBZCHK); + return LowerWindowsDIVLibCall(Op, DAG, DBZCHK); } void ARMTargetLowering::ExpandDIV_Windows( - SDValue Op, SelectionDAG &DAG, bool Signed, + SDValue Op, SelectionDAG &DAG, SmallVectorImpl<SDValue> &Results) const { const auto &DL = DAG.getDataLayout(); const auto &TLI = DAG.getTargetLoweringInfo(); @@ -6734,7 +6730,7 @@ void ARMTargetLowering::ExpandDIV_Windows( SDValue DBZCHK = DAG.getNode(ARMISD::WIN__DBZCHK, dl, MVT::Other, DAG.getEntryNode(), Or); - SDValue Result = LowerWindowsDIVLibCall(Op, DAG, Signed, DBZCHK); + SDValue Result = LowerWindowsDIVLibCall(Op, DAG, DBZCHK); SDValue Lower = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Result); SDValue Upper = DAG.getNode(ISD::SRL, dl, MVT::i64, Result, @@ -6835,13 +6831,10 @@ SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const { case ISD::CONCAT_VECTORS: return LowerCONCAT_VECTORS(Op, DAG); case ISD::FLT_ROUNDS_: return LowerFLT_ROUNDS_(Op, DAG); case ISD::MUL: return LowerMUL(Op, DAG); - case ISD::SDIV: - if (Subtarget->isTargetWindows()) - return LowerDIV_Windows(Op, DAG, /* Signed */ true); - return LowerSDIV(Op, DAG); + case ISD::SDIV: return LowerSDIV(Op, DAG); case ISD::UDIV: if (Subtarget->isTargetWindows()) - return LowerDIV_Windows(Op, DAG, /* Signed */ false); + return LowerDIV_Windows(Op, DAG); return LowerUDIV(Op, DAG); case ISD::ADDC: case ISD::ADDE: @@ -6894,10 +6887,8 @@ void ARMTargetLowering::ReplaceNodeResults(SDNode *N, ReplaceREADCYCLECOUNTER(N, Results, DAG, Subtarget); return; case ISD::UDIV: - case ISD::SDIV: assert(Subtarget->isTargetWindows() && "can only expand DIV on Windows"); - return ExpandDIV_Windows(SDValue(N, 0), DAG, N->getOpcode() == ISD::SDIV, - Results); + return ExpandDIV_Windows(SDValue(N, 0), DAG, Results); } if (Res.getNode()) Results.push_back(Res); |