diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 4289234e94b..607fffd9814 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -19083,15 +19083,16 @@ SDValue X86TargetLowering::LowerSINT_TO_FP(SDValue Op, // with two 32-bit stores. ValueToStore = DAG.getBitcast(MVT::f64, ValueToStore); - unsigned Size = SrcVT.getSizeInBits()/8; + unsigned Size = SrcVT.getStoreSize(); MachineFunction &MF = DAG.getMachineFunction(); auto PtrVT = getPointerTy(MF.getDataLayout()); int SSFI = MF.getFrameInfo().CreateStackObject(Size, Size, false); + MachinePointerInfo MPI = + MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SSFI); SDValue StackSlot = DAG.getFrameIndex(SSFI, PtrVT); - Chain = DAG.getStore( - Chain, dl, ValueToStore, StackSlot, - MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SSFI)); - std::pair Tmp = BuildFILD(Op, SrcVT, Chain, StackSlot, DAG); + Chain = DAG.getStore(Chain, dl, ValueToStore, StackSlot, MPI, Size); + std::pair Tmp = + BuildFILD(Op, SrcVT, Chain, StackSlot, MPI, Size, DAG); if (IsStrict) return DAG.getMergeValues({Tmp.first, Tmp.second}, dl); @@ -19099,9 +19100,10 @@ SDValue X86TargetLowering::LowerSINT_TO_FP(SDValue Op, return Tmp.first; } -std::pair X86TargetLowering::BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain, - SDValue StackSlot, - SelectionDAG &DAG) const { +std::pair +X86TargetLowering::BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain, + SDValue Pointer, MachinePointerInfo PtrInfo, + unsigned Align, SelectionDAG &DAG) const { // Build the FILD SDLoc DL(Op); SDVTList Tys; @@ -19111,23 +19113,10 @@ std::pair X86TargetLowering::BuildFILD(SDValue Op, EVT SrcVT, else Tys = DAG.getVTList(Op.getValueType(), MVT::Other); - unsigned ByteSize = SrcVT.getSizeInBits() / 8; - - FrameIndexSDNode *FI = dyn_cast(StackSlot); - MachineMemOperand *LoadMMO; - if (FI) { - int SSFI = FI->getIndex(); - LoadMMO = DAG.getMachineFunction().getMachineMemOperand( - MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SSFI), - MachineMemOperand::MOLoad, ByteSize, ByteSize); - } else { - LoadMMO = cast(StackSlot)->getMemOperand(); - StackSlot = StackSlot.getOperand(1); - } - SDValue FILDOps[] = {Chain, StackSlot}; + SDValue FILDOps[] = {Chain, Pointer}; SDValue Result = - DAG.getMemIntrinsicNode(X86ISD::FILD, DL, - Tys, FILDOps, SrcVT, LoadMMO); + DAG.getMemIntrinsicNode(X86ISD::FILD, DL, Tys, FILDOps, SrcVT, PtrInfo, + Align, MachineMemOperand::MOLoad); Chain = Result.getValue(1); if (useSSE) { @@ -19588,7 +19577,7 @@ SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op, SDValue Store2 = DAG.getStore(Store1, dl, DAG.getConstant(0, dl, MVT::i32), OffsetSlot, MPI.getWithOffset(4), 4); std::pair Tmp = - BuildFILD(Op, MVT::i64, Store2, StackSlot, DAG); + BuildFILD(Op, MVT::i64, Store2, StackSlot, MPI, 8, DAG); if (IsStrict) return DAG.getMergeValues({Tmp.first, Tmp.second}, dl); @@ -45068,8 +45057,10 @@ static SDValue combineSIntToFP(SDNode *N, SelectionDAG &DAG, if (Ld->isSimple() && !VT.isVector() && ISD::isNON_EXTLoad(Op0.getNode()) && Op0.hasOneUse() && !Subtarget.is64Bit() && LdVT == MVT::i64) { - std::pair Tmp = Subtarget.getTargetLowering()->BuildFILD( - SDValue(N, 0), LdVT, Ld->getChain(), Op0, DAG); + std::pair Tmp = + Subtarget.getTargetLowering()->BuildFILD( + SDValue(N, 0), LdVT, Ld->getChain(), Ld->getBasePtr(), + Ld->getPointerInfo(), Ld->getAlignment(), DAG); DAG.ReplaceAllUsesOfValueWith(Op0.getValue(1), Tmp.second); return Tmp.first; } diff --git a/lib/Target/X86/X86ISelLowering.h b/lib/Target/X86/X86ISelLowering.h index 09add3ce203..106b03745a7 100644 --- a/lib/Target/X86/X86ISelLowering.h +++ b/lib/Target/X86/X86ISelLowering.h @@ -1208,7 +1208,9 @@ namespace llvm { Value *getSafeStackPointerLocation(IRBuilder<> &IRB) const override; std::pair BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain, - SDValue StackSlot, + SDValue Pointer, + MachinePointerInfo PtrInfo, + unsigned Align, SelectionDAG &DAG) const; bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override;