Пример #1
0
// 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);
}
Пример #2
0
/// 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;
}