aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/TargetLoweringBase.cpp
diff options
context:
space:
mode:
authorDenis Antrushin <dantrushin@gmail.com>2020-06-04 19:11:13 +0300
committerDenis Antrushin <dantrushin@gmail.com>2020-06-05 14:57:29 +0300
commit66a1b83bf93ec46f6d7a06c47d5981ae154f9ea0 (patch)
treefd2f25ffeccf4b2c104f58f3ba95d81026f9b936 /llvm/lib/CodeGen/TargetLoweringBase.cpp
parentc6aa829644f30d5590451b892918298f8117c985 (diff)
downloadllvm-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.cpp34
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;
}