// Copy MachineMemOperands from Op0 and Op1 to a new array assigned to MI. static void concatenateMemOperands(MachineInstr *MI, MachineInstr *Op0, MachineInstr *Op1) { assert(MI->memoperands_empty() && "expected a new machineinstr"); size_t numMemRefs = (Op0->memoperands_end() - Op0->memoperands_begin()) + (Op1->memoperands_end() - Op1->memoperands_begin()); MachineFunction *MF = MI->getParent()->getParent(); MachineSDNode::mmo_iterator MemBegin = MF->allocateMemRefsArray(numMemRefs); MachineSDNode::mmo_iterator MemEnd = std::copy(Op0->memoperands_begin(), Op0->memoperands_end(), MemBegin); MemEnd = std::copy(Op1->memoperands_begin(), Op1->memoperands_end(), MemEnd); MI->setMemRefs(MemBegin, MemEnd); }
/// addMemOperand - Add a MachineMemOperand to the machine instruction. /// This function should be used only occasionally. The setMemRefs function /// is the primary method for setting up a MachineInstr's MemRefs list. void MachineInstr::addMemOperand(MachineFunction &MF, MachineMemOperand *MO) { mmo_iterator OldMemRefs = MemRefs; mmo_iterator OldMemRefsEnd = MemRefsEnd; size_t NewNum = (MemRefsEnd - MemRefs) + 1; mmo_iterator NewMemRefs = MF.allocateMemRefsArray(NewNum); mmo_iterator NewMemRefsEnd = NewMemRefs + NewNum; std::copy(OldMemRefs, OldMemRefsEnd, NewMemRefs); NewMemRefs[NewNum - 1] = MO; MemRefs = NewMemRefs; MemRefsEnd = NewMemRefsEnd; }