diff options
author | Denis Antrushin <dantrushin@gmail.com> | 2020-06-04 19:11:13 +0300 |
---|---|---|
committer | Denis Antrushin <dantrushin@gmail.com> | 2020-06-05 14:57:29 +0300 |
commit | 66a1b83bf93ec46f6d7a06c47d5981ae154f9ea0 (patch) | |
tree | fd2f25ffeccf4b2c104f58f3ba95d81026f9b936 /llvm/lib/CodeGen/TargetLoweringBase.cpp | |
parent | c6aa829644f30d5590451b892918298f8117c985 (diff) | |
download | llvm-66a1b83bf93ec46f6d7a06c47d5981ae154f9ea0.zip llvm-66a1b83bf93ec46f6d7a06c47d5981ae154f9ea0.tar.gz llvm-66a1b83bf93ec46f6d7a06c47d5981ae154f9ea0.tar.bz2 |
[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
Diffstat (limited to 'llvm/lib/CodeGen/TargetLoweringBase.cpp')
-rw-r--r-- | llvm/lib/CodeGen/TargetLoweringBase.cpp | 34 |
1 files changed, 15 insertions, 19 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp index 62c3af9..41cfa99 100644 --- a/llvm/lib/CodeGen/TargetLoweringBase.cpp +++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -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; } |