Index: lib/Target/SystemZ/SystemZISelLowering.cpp =================================================================== --- lib/Target/SystemZ/SystemZISelLowering.cpp +++ lib/Target/SystemZ/SystemZISelLowering.cpp @@ -5805,6 +5805,39 @@ return MBB; } +static MachinePointerInfo getMachinePointerInfo(MachineInstr *MI, + unsigned BaseOpNo, + MachineRegisterInfo &MRI) { + MachineFunction *MF = MI->getParent()->getParent(); + MachineOperand *BaseMO = &MI->getOperand(BaseOpNo); + unsigned Displ = MI->getOperand(BaseOpNo + 1).getImm(); + if (BaseMO->isReg()) { + MachineInstr *AddrDefMI = MRI.getVRegDef(BaseMO->getReg()); + if (AddrDefMI != nullptr) { + if (AddrDefMI->getOpcode() == SystemZ::LARL && + AddrDefMI->getOperand(1).isGlobal()) + return MachinePointerInfo(AddrDefMI->getOperand(1).getGlobal(), + Displ); + if ((AddrDefMI->getOpcode() == SystemZ::LA || + AddrDefMI->getOpcode() == SystemZ::LAY) && + AddrDefMI->getOperand(1).isFI() && + AddrDefMI->getOperand(3).getReg() == SystemZ::NoRegister) { + Displ += AddrDefMI->getOperand(2).getImm(); + BaseMO = &AddrDefMI->getOperand(1); + } + } + } + + if (BaseMO->isFI()) { + MachinePointerInfo MPtrI = + MachinePointerInfo::getFixedStack(*MF, BaseMO->getIndex()); + MPtrI.Offset = Displ; + return MPtrI; + } + + return MachinePointerInfo(); +} + MachineBasicBlock *SystemZTargetLowering::emitMemMemWrapper( MachineInstr &MI, MachineBasicBlock *MBB, unsigned Opcode) const { MachineFunction &MF = *MBB->getParent(); @@ -5947,13 +5980,29 @@ SrcBase = MachineOperand::CreateReg(Reg, false); SrcDisp = 0; } + MachineInstr *BuiltMI = BuildMI(*MBB, MI, DL, TII->get(Opcode)) .add(DestBase) .addImm(DestDisp) .addImm(ThisLength) .add(SrcBase) - .addImm(SrcDisp) - ->setMemRefs(MI.memoperands_begin(), MI.memoperands_end()); + .addImm(SrcDisp); + if (!MI.memoperands_empty()) + BuiltMI->setMemRefs(MI.memoperands_begin(), MI.memoperands_end()); + else { + uint64_t Size = MI.getOperand(4).getImm(); + MachinePointerInfo SrcPtrInfo = getMachinePointerInfo(&MI, 2, MRI); + if (!SrcPtrInfo.V.isNull()) + BuiltMI->addMemOperand(MF, MF.getMachineMemOperand(SrcPtrInfo, + MachineMemOperand::MOLoad, Size, 1)); + if (Opcode != SystemZ::CLC) { + MachinePointerInfo DstPtrInfo = getMachinePointerInfo(&MI, 0, MRI); + if (!DstPtrInfo.V.isNull()) + BuiltMI->addMemOperand(MF, MF.getMachineMemOperand(DstPtrInfo, + MachineMemOperand::MOStore, Size, 1)); + } + } + DestDisp += ThisLength; SrcDisp += ThisLength; Length -= ThisLength;