Extract helper function to merge MemoryOperand lists [NFC]
In the discussion on http://reviews.llvm.org/D15730, Andy pointed out we had a utility function for merging MMO lists. Since it turned we actually had two copies and there's another review in progress (http://reviews.llvm.org/D15230) which needs the same, extract it into a utility function and clean up the interfaces to make it easier to use with a MachineInstBuilder. I introduced a pair here to track size and allocation together. I think we should probably move in the direction of the MachineOperandsRef helper class, but I'm leaving that for further work. I want to get the poison state introduced before I make major changes to the interface. Differential Revision: http://reviews.llvm.org/D15757 llvm-svn: 256909
This commit is contained in:
@@ -866,6 +866,26 @@ void MachineInstr::addMemOperand(MachineFunction &MF,
|
||||
setMemRefs(NewMemRefs, NewMemRefs + NewNum);
|
||||
}
|
||||
|
||||
std::pair<MachineInstr::mmo_iterator, unsigned>
|
||||
MachineInstr::mergeMemRefsWith(const MachineInstr& Other) {
|
||||
// TODO: If we end up with too many memory operands, return the empty
|
||||
// conservative set rather than failing asserts.
|
||||
// TODO: consider uniquing elements within the operand lists to reduce
|
||||
// space usage and fall back to conservative information less often.
|
||||
size_t CombinedNumMemRefs = (memoperands_end() - memoperands_begin())
|
||||
+ (Other.memoperands_end() - Other.memoperands_begin());
|
||||
|
||||
MachineFunction *MF = getParent()->getParent();
|
||||
mmo_iterator MemBegin = MF->allocateMemRefsArray(CombinedNumMemRefs);
|
||||
mmo_iterator MemEnd = std::copy(memoperands_begin(), memoperands_end(),
|
||||
MemBegin);
|
||||
MemEnd = std::copy(Other.memoperands_begin(), Other.memoperands_end(),
|
||||
MemEnd);
|
||||
assert(MemEnd - MemBegin == CombinedNumMemRefs && "missing memrefs");
|
||||
|
||||
return std::make_pair(MemBegin, CombinedNumMemRefs);
|
||||
}
|
||||
|
||||
bool MachineInstr::hasPropertyInBundle(unsigned Mask, QueryType Type) const {
|
||||
assert(!isBundledWithPred() && "Must be called on bundle header");
|
||||
for (MachineBasicBlock::const_instr_iterator MII = getIterator();; ++MII) {
|
||||
|
||||
Reference in New Issue
Block a user