[llvm] [llvm-mca] Add command line option -call-latency (PR #92958)
Chinmay Deshpande via llvm-commits
llvm-commits at lists.llvm.org
Tue May 21 12:52:39 PDT 2024
https://github.com/chinmaydd created https://github.com/llvm/llvm-project/pull/92958
Currently we assume a constant latency of 100 cycles for call instructions. This commit allows the user to specify a custom value for the same as a command line argument. Default latency is set to 100.
>From c1d632dfa9be9837614d2cba210ecf30f72aa358 Mon Sep 17 00:00:00 2001
From: Chinmay <cddeshpa at uci.edu>
Date: Tue, 21 May 2024 11:17:56 -0700
Subject: [PATCH] [llvm-mca] Add command line option -call-latency
Currently we assume a constant latency of 100 cycles for a call
instruction. This commit allows the user to specify a custom value for
the same as a command line argument. Default latency is set to 100.
---
llvm/include/llvm/MCA/InstrBuilder.h | 3 +++
llvm/lib/MCA/InstrBuilder.cpp | 17 +++++++++--------
llvm/tools/llvm-mca/llvm-mca.cpp | 6 ++++++
3 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/llvm/include/llvm/MCA/InstrBuilder.h b/llvm/include/llvm/MCA/InstrBuilder.h
index 3594372489148..49ba8d93ec76f 100644
--- a/llvm/include/llvm/MCA/InstrBuilder.h
+++ b/llvm/include/llvm/MCA/InstrBuilder.h
@@ -78,6 +78,7 @@ class InstrBuilder {
bool FirstCallInst;
bool FirstReturnInst;
+ unsigned CallLatency;
using InstRecycleCallback = std::function<Instruction *(const InstrDesc &)>;
InstRecycleCallback InstRecycleCB;
@@ -111,6 +112,8 @@ class InstrBuilder {
/// or null if there isn't any.
void setInstRecycleCallback(InstRecycleCallback CB) { InstRecycleCB = CB; }
+ void setCallLatency(unsigned CL) { CallLatency = CL; }
+
Expected<std::unique_ptr<Instruction>>
createInstruction(const MCInst &MCI, const SmallVector<Instrument *> &IVec);
};
diff --git a/llvm/lib/MCA/InstrBuilder.cpp b/llvm/lib/MCA/InstrBuilder.cpp
index bcf065c566918..e608fa520fc19 100644
--- a/llvm/lib/MCA/InstrBuilder.cpp
+++ b/llvm/lib/MCA/InstrBuilder.cpp
@@ -33,7 +33,7 @@ InstrBuilder::InstrBuilder(const llvm::MCSubtargetInfo &sti,
const llvm::MCInstrAnalysis *mcia,
const mca::InstrumentManager &im)
: STI(sti), MCII(mcii), MRI(mri), MCIA(mcia), IM(im), FirstCallInst(true),
- FirstReturnInst(true) {
+ FirstReturnInst(true), CallLatency(100U) {
const MCSchedModel &SM = STI.getSchedModel();
ProcResourceMasks.resize(SM.getNumProcResourceKinds());
computeProcResourceMasks(STI.getSchedModel(), ProcResourceMasks);
@@ -220,17 +220,18 @@ static void initializeUsedResources(InstrDesc &ID,
static void computeMaxLatency(InstrDesc &ID, const MCInstrDesc &MCDesc,
const MCSchedClassDesc &SCDesc,
- const MCSubtargetInfo &STI) {
+ const MCSubtargetInfo &STI,
+ unsigned CallLatency) {
if (MCDesc.isCall()) {
// We cannot estimate how long this call will take.
- // Artificially set an arbitrarily high latency (100cy).
- ID.MaxLatency = 100U;
+ // Artificially set an arbitrarily high latency (default: 100cy).
+ ID.MaxLatency = CallLatency;
return;
}
int Latency = MCSchedModel::computeInstrLatency(STI, SCDesc);
- // If latency is unknown, then conservatively assume a MaxLatency of 100cy.
- ID.MaxLatency = Latency < 0 ? 100U : static_cast<unsigned>(Latency);
+ // If latency is unknown, then conservatively assume a MaxLatency set for calls (default: 100cy).
+ ID.MaxLatency = Latency < 0 ? CallLatency : static_cast<unsigned>(Latency);
}
static Error verifyOperands(const MCInstrDesc &MCDesc, const MCInst &MCI) {
@@ -568,7 +569,7 @@ InstrBuilder::createInstrDescImpl(const MCInst &MCI,
// We don't correctly model calls.
WithColor::warning() << "found a call in the input assembly sequence.\n";
WithColor::note() << "call instructions are not correctly modeled. "
- << "Assume a latency of 100cy.\n";
+ << "Assume a latency of " << CallLatency << "cy.\n";
FirstCallInst = false;
}
@@ -580,7 +581,7 @@ InstrBuilder::createInstrDescImpl(const MCInst &MCI,
}
initializeUsedResources(*ID, SCDesc, STI, ProcResourceMasks);
- computeMaxLatency(*ID, MCDesc, SCDesc, STI);
+ computeMaxLatency(*ID, MCDesc, SCDesc, STI, CallLatency);
if (Error Err = verifyOperands(MCDesc, MCI))
return std::move(Err);
diff --git a/llvm/tools/llvm-mca/llvm-mca.cpp b/llvm/tools/llvm-mca/llvm-mca.cpp
index 03d7d7944b9cd..73b704283b8a8 100644
--- a/llvm/tools/llvm-mca/llvm-mca.cpp
+++ b/llvm/tools/llvm-mca/llvm-mca.cpp
@@ -135,6 +135,11 @@ static cl::opt<unsigned>
"(instructions per cycle)"),
cl::cat(ToolOptions), cl::init(0));
+static cl::opt<unsigned>
+ CallLatency("call-latency", cl::Hidden,
+ cl::desc("Number of cycles to assume for a call instruction"),
+ cl::cat(ToolOptions), cl::init(100U));
+
enum class SkipType { NONE, LACK_SCHED, PARSE_FAILURE, ANY_FAILURE };
static cl::opt<enum SkipType> SkipUnsupportedInstructions(
@@ -569,6 +574,7 @@ int main(int argc, char **argv) {
// Create an instruction builder.
mca::InstrBuilder IB(*STI, *MCII, *MRI, MCIA.get(), *IM);
+ IB.setCallLatency(CallLatency);
// Create a context to control ownership of the pipeline hardware.
mca::Context MCA(*MRI, *STI);
More information about the llvm-commits
mailing list