mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
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:
parent
fff17a4cfa
commit
f7e04fbc3d
@ -1180,11 +1180,26 @@ public:
|
||||
/// Assign this MachineInstr's memory reference descriptor list.
|
||||
/// This does not transfer ownership.
|
||||
void setMemRefs(mmo_iterator NewMemRefs, mmo_iterator NewMemRefsEnd) {
|
||||
MemRefs = NewMemRefs;
|
||||
NumMemRefs = uint8_t(NewMemRefsEnd - NewMemRefs);
|
||||
assert(NumMemRefs == NewMemRefsEnd - NewMemRefs && "Too many memrefs");
|
||||
setMemRefs(std::make_pair(NewMemRefs, NewMemRefsEnd-NewMemRefs));
|
||||
}
|
||||
|
||||
/// Assign this MachineInstr's memory reference descriptor list. First
|
||||
/// element in the pair is the begin iterator/pointer to the array; the
|
||||
/// second is the number of MemoryOperands. This does not transfer ownership
|
||||
/// of the underlying memory.
|
||||
void setMemRefs(std::pair<mmo_iterator, unsigned> NewMemRefs) {
|
||||
MemRefs = NewMemRefs.first;
|
||||
NumMemRefs = uint8_t(NewMemRefs.second);
|
||||
assert(NumMemRefs == NewMemRefs.second &&
|
||||
"Too many memrefs - must drop memory operands");
|
||||
}
|
||||
|
||||
/// Return a set of memrefs (begin iterator, size) which conservatively
|
||||
/// describe the memory behavior of both MachineInstrs. This is appropriate
|
||||
/// for use when merging two MachineInstrs into one. This routine does not
|
||||
/// modify the memrefs of the this MachineInstr.
|
||||
std::pair<mmo_iterator, unsigned> mergeMemRefsWith(const MachineInstr& Other);
|
||||
|
||||
/// Clear this MachineInstr's memory reference descriptor list. This resets
|
||||
/// the memrefs to their most conservative state. This should be used only
|
||||
/// as a last resort since it greatly pessimizes our knowledge of the memory
|
||||
|
@ -162,6 +162,11 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
const MachineInstrBuilder &setMemRefs(std::pair<MachineInstr::mmo_iterator,
|
||||
unsigned> MemOperandsRef) const {
|
||||
MI->setMemRefs(MemOperandsRef);
|
||||
return *this;
|
||||
}
|
||||
|
||||
const MachineInstrBuilder &addOperand(const MachineOperand &MO) const {
|
||||
MI->addOperand(*MF, MO);
|
||||
|
@ -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) {
|
||||
|
@ -613,21 +613,6 @@ static bool isLdOffsetInRangeOfSt(MachineInstr *LoadInst,
|
||||
(UnscaledLdOffset + LoadSize <= (UnscaledStOffset + StoreSize));
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
MachineBasicBlock::iterator
|
||||
AArch64LoadStoreOpt::mergePairedInsns(MachineBasicBlock::iterator I,
|
||||
MachineBasicBlock::iterator Paired,
|
||||
@ -692,10 +677,8 @@ AArch64LoadStoreOpt::mergePairedInsns(MachineBasicBlock::iterator I,
|
||||
TII->get(NewOpc))
|
||||
.addOperand(getLdStRegOp(RtNewDest))
|
||||
.addOperand(BaseRegOp)
|
||||
.addImm(OffsetImm);
|
||||
|
||||
// Copy MachineMemOperands from the original loads.
|
||||
concatenateMemOperands(NewMemMI, I, Paired);
|
||||
.addImm(OffsetImm)
|
||||
.setMemRefs(I->mergeMemRefsWith(*Paired));
|
||||
|
||||
DEBUG(
|
||||
dbgs()
|
||||
@ -786,9 +769,8 @@ AArch64LoadStoreOpt::mergePairedInsns(MachineBasicBlock::iterator I,
|
||||
TII->get(NewOpc))
|
||||
.addOperand(getLdStRegOp(I))
|
||||
.addOperand(BaseRegOp)
|
||||
.addImm(OffsetImm);
|
||||
// Copy MachineMemOperands from the original stores.
|
||||
concatenateMemOperands(MIB, I, Paired);
|
||||
.addImm(OffsetImm)
|
||||
.setMemRefs(I->mergeMemRefsWith(*Paired));
|
||||
} else {
|
||||
// Handle Unscaled
|
||||
if (IsUnscaled)
|
||||
|
@ -1986,23 +1986,6 @@ static bool IsSafeAndProfitableToMove(bool isLd, unsigned Base,
|
||||
return AddedRegPressure.size() <= MemRegs.size() * 2;
|
||||
}
|
||||
|
||||
|
||||
/// Copy \p Op0 and \p Op1 operands into 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);
|
||||
}
|
||||
|
||||
bool
|
||||
ARMPreAllocLoadStoreOpt::CanFormLdStDWord(MachineInstr *Op0, MachineInstr *Op1,
|
||||
DebugLoc &dl, unsigned &NewOpc,
|
||||
@ -2196,7 +2179,7 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
|
||||
if (!isT2)
|
||||
MIB.addReg(0);
|
||||
MIB.addImm(Offset).addImm(Pred).addReg(PredReg);
|
||||
concatenateMemOperands(MIB, Op0, Op1);
|
||||
MIB.setMemRefs(Op0->mergeMemRefsWith(*Op1));
|
||||
DEBUG(dbgs() << "Formed " << *MIB << "\n");
|
||||
++NumLDRDFormed;
|
||||
} else {
|
||||
@ -2210,7 +2193,7 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
|
||||
if (!isT2)
|
||||
MIB.addReg(0);
|
||||
MIB.addImm(Offset).addImm(Pred).addReg(PredReg);
|
||||
concatenateMemOperands(MIB, Op0, Op1);
|
||||
MIB.setMemRefs(Op0->mergeMemRefsWith(*Op1));
|
||||
DEBUG(dbgs() << "Formed " << *MIB << "\n");
|
||||
++NumSTRDFormed;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user