forked from OSchip/llvm-project
[TargetLowering][NFC] More efficient emitPatchpoint().
Current implementation of emitPatchpoint() is very inefficient: for every FrameIndex operand if creates new MachineInstr with that operand expanded and all other copied as is. Since PATCHPOINT/STATEPOINT instructions may have *a lot* of FrameIndex operands, we end up creating and erasing many machine instructions. But we can do it in single pass, with only one new machine instruction generated. Reviewed By: reames Differential Revision: https://reviews.llvm.org/D81181
This commit is contained in:
parent
c6aa829644
commit
66a1b83bf9
|
|
@ -1023,20 +1023,25 @@ TargetLoweringBase::emitPatchPoint(MachineInstr &InitialMI,
|
|||
// all stack slots), but we need to handle the different type of stackmap
|
||||
// operands and memory effects here.
|
||||
|
||||
// MI changes inside this loop as we grow operands.
|
||||
for(unsigned OperIdx = 0; OperIdx != MI->getNumOperands(); ++OperIdx) {
|
||||
MachineOperand &MO = MI->getOperand(OperIdx);
|
||||
if (!MO.isFI())
|
||||
if (!llvm::any_of(MI->operands(),
|
||||
[](MachineOperand &Operand) { return Operand.isFI(); }))
|
||||
return MBB;
|
||||
|
||||
MachineInstrBuilder MIB = BuildMI(MF, MI->getDebugLoc(), MI->getDesc());
|
||||
|
||||
// Inherit previous memory operands.
|
||||
MIB.cloneMemRefs(*MI);
|
||||
|
||||
for (auto &MO : MI->operands()) {
|
||||
if (!MO.isFI()) {
|
||||
MIB.add(MI->getOperand(OperIdx));
|
||||
continue;
|
||||
}
|
||||
|
||||
// foldMemoryOperand builds a new MI after replacing a single FI operand
|
||||
// with the canonical set of five x86 addressing-mode operands.
|
||||
int FI = MO.getIndex();
|
||||
MachineInstrBuilder MIB = BuildMI(MF, MI->getDebugLoc(), MI->getDesc());
|
||||
|
||||
// Copy operands before the frame-index.
|
||||
for (unsigned i = 0; i < OperIdx; ++i)
|
||||
MIB.add(MI->getOperand(i));
|
||||
// Add frame index operands recognized by stackmaps.cpp
|
||||
if (MFI.isStatepointSpillSlotObjectIndex(FI)) {
|
||||
// indirect-mem-ref tag, size, #FI, offset.
|
||||
|
|
@ -1055,12 +1060,7 @@ TargetLoweringBase::emitPatchPoint(MachineInstr &InitialMI,
|
|||
MIB.add(MI->getOperand(OperIdx));
|
||||
MIB.addImm(0);
|
||||
}
|
||||
// Copy the operands after the frame index.
|
||||
for (unsigned i = OperIdx + 1; i != MI->getNumOperands(); ++i)
|
||||
MIB.add(MI->getOperand(i));
|
||||
|
||||
// Inherit previous memory operands.
|
||||
MIB.cloneMemRefs(*MI);
|
||||
assert(MIB->mayLoad() && "Folded a stackmap use to a non-load!");
|
||||
|
||||
// Add a new memory operand for this FI.
|
||||
|
|
@ -1075,13 +1075,9 @@ TargetLoweringBase::emitPatchPoint(MachineInstr &InitialMI,
|
|||
MF.getDataLayout().getPointerSize(), MFI.getObjectAlign(FI));
|
||||
MIB->addMemOperand(MF, MMO);
|
||||
}
|
||||
|
||||
// Replace the instruction and update the operand index.
|
||||
MBB->insert(MachineBasicBlock::iterator(MI), MIB);
|
||||
OperIdx += (MIB->getNumOperands() - MI->getNumOperands()) - 1;
|
||||
MI->eraseFromParent();
|
||||
MI = MIB;
|
||||
}
|
||||
MBB->insert(MachineBasicBlock::iterator(MI), MIB);
|
||||
MI->eraseFromParent();
|
||||
return MBB;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue