Skip to content

Commit dc20661

Browse files
committed
[RISCV][MCA] Pick the correct VPseudo sched class for indexed memory operations
1 parent b8337bc commit dc20661

File tree

4 files changed

+359
-277
lines changed

4 files changed

+359
-277
lines changed

llvm/lib/Target/RISCV/MCA/RISCVCustomBehaviour.cpp

Lines changed: 65 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,33 @@
1414
#include "RISCVCustomBehaviour.h"
1515
#include "MCTargetDesc/RISCVMCTargetDesc.h"
1616
#include "RISCV.h"
17+
#include "RISCVISelDAGToDAG.h"
1718
#include "TargetInfo/RISCVTargetInfo.h"
1819
#include "llvm/MC/TargetRegistry.h"
1920
#include "llvm/Support/Debug.h"
2021

2122
#define DEBUG_TYPE "llvm-mca-riscv-custombehaviour"
2223

24+
namespace llvm::RISCV::mca {
25+
struct VXMemOpInfo {
26+
unsigned Log2IdxEEW : 3;
27+
unsigned IsOrdered : 1;
28+
unsigned IsStore : 1;
29+
unsigned NF : 4;
30+
unsigned BaseInstr;
31+
};
32+
33+
#define GET_RISCVBaseVXMemOpTable_DECL
34+
#define GET_RISCVBaseVXMemOpTable_IMPL
35+
// We need to include the implementation code here because RISCVCustomBehavior
36+
// is not linked against RISCVCodeGen.
37+
#define GET_RISCVVLXSEGTable_IMPL
38+
#define GET_RISCVVSXSEGTable_IMPL
39+
#define GET_RISCVVLXTable_IMPL
40+
#define GET_RISCVVSXTable_IMPL
41+
#include "RISCVGenSearchableTables.inc"
42+
} // namespace llvm::RISCV::mca
43+
2344
namespace llvm {
2445
namespace mca {
2546

@@ -247,21 +268,58 @@ unsigned RISCVInstrumentManager::getSchedClassID(
247268
// and SEW, or (Opcode, LMUL, 0) if does not depend on SEW.
248269
uint8_t SEW = SI ? SI->getSEW() : 0;
249270

250-
const RISCVVInversePseudosTable::PseudoInfo *RVV = nullptr;
251-
if (opcodeHasEEWAndEMULInfo(Opcode)) {
271+
std::optional<unsigned> VPOpcode;
272+
if (const auto *VXMO = RISCV::mca::getVXMemOpInfo(Opcode)) {
273+
// Calculate the expected index EMUL. For indexed operations,
274+
// the DataEEW and DataEMUL are equal to SEW and LMUL, respectively.
275+
unsigned IndexEMUL = ((1 << VXMO->Log2IdxEEW) * LMUL) / SEW;
276+
277+
if (!VXMO->NF) {
278+
// Indexed Load / Store.
279+
if (VXMO->IsStore) {
280+
if (const auto *VXP = RISCV::mca::getVSXPseudo(
281+
/*Masked=*/0, VXMO->IsOrdered, VXMO->Log2IdxEEW, LMUL,
282+
IndexEMUL))
283+
VPOpcode = VXP->Pseudo;
284+
} else {
285+
if (const auto *VXP = RISCV::mca::getVLXPseudo(
286+
/*Masked=*/0, VXMO->IsOrdered, VXMO->Log2IdxEEW, LMUL,
287+
IndexEMUL))
288+
VPOpcode = VXP->Pseudo;
289+
}
290+
} else {
291+
// Segmented Indexed Load / Store.
292+
if (VXMO->IsStore) {
293+
if (const auto *VXP = RISCV::mca::getVSXSEGPseudo(
294+
VXMO->NF, /*Masked=*/0, VXMO->IsOrdered, VXMO->Log2IdxEEW, LMUL,
295+
IndexEMUL))
296+
VPOpcode = VXP->Pseudo;
297+
} else {
298+
if (const auto *VXP = RISCV::mca::getVLXSEGPseudo(
299+
VXMO->NF, /*Masked=*/0, VXMO->IsOrdered, VXMO->Log2IdxEEW, LMUL,
300+
IndexEMUL))
301+
VPOpcode = VXP->Pseudo;
302+
}
303+
}
304+
} else if (opcodeHasEEWAndEMULInfo(Opcode)) {
252305
RISCVVType::VLMUL VLMUL = static_cast<RISCVVType::VLMUL>(LMUL);
253306
auto [EEW, EMUL] = getEEWAndEMUL(Opcode, VLMUL, SEW);
254-
RVV = RISCVVInversePseudosTable::getBaseInfo(Opcode, EMUL, EEW);
307+
if (const auto *RVV =
308+
RISCVVInversePseudosTable::getBaseInfo(Opcode, EMUL, EEW))
309+
VPOpcode = RVV->Pseudo;
255310
} else {
256311
// Check if it depends on LMUL and SEW
257-
RVV = RISCVVInversePseudosTable::getBaseInfo(Opcode, LMUL, SEW);
312+
const auto *RVV = RISCVVInversePseudosTable::getBaseInfo(Opcode, LMUL, SEW);
258313
// Check if it depends only on LMUL
259314
if (!RVV)
260315
RVV = RISCVVInversePseudosTable::getBaseInfo(Opcode, LMUL, 0);
316+
317+
if (RVV)
318+
VPOpcode = RVV->Pseudo;
261319
}
262320

263321
// Not a RVV instr
264-
if (!RVV) {
322+
if (!VPOpcode) {
265323
LLVM_DEBUG(
266324
dbgs() << "RVCB: Could not find PseudoInstruction for Opcode "
267325
<< MCII.getName(Opcode)
@@ -277,8 +335,8 @@ unsigned RISCVInstrumentManager::getSchedClassID(
277335
<< MCII.getName(Opcode) << ", LMUL=" << LI->getData()
278336
<< ", SEW=" << (SI ? SI->getData() : "Unspecified")
279337
<< ". Overriding original SchedClassID=" << SchedClassID
280-
<< " with " << MCII.getName(RVV->Pseudo) << '\n');
281-
return MCII.get(RVV->Pseudo).getSchedClass();
338+
<< " with " << MCII.getName(*VPOpcode) << '\n');
339+
return MCII.get(*VPOpcode).getSchedClass();
282340
}
283341

284342
} // namespace mca

llvm/lib/Target/RISCV/RISCVInstrInfoV.td

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,22 @@ class VSXSEGSched<int nf, int eew, bit isOrdered, string emul,
316316
class VSXSEGSchedMC<int nf, int eew, bit isOrdered>:
317317
VSXSEGSched<nf, eew, isOrdered, "WorstCase", forceMasked=1>;
318318

319+
class RISCVVXMemOpMC<bits<3> E, bit Ordered, bit Store, bits<4> N = 0> {
320+
bits<3> Log2EEW = E;
321+
bits<1> IsOrdered = Ordered;
322+
bits<1> IsStore = Store;
323+
bits<4> NF = N;
324+
Instruction BaseInstr = !cast<Instruction>(NAME);
325+
}
326+
327+
def RISCVBaseVXMemOpTable : GenericTable {
328+
let FilterClass = "RISCVVXMemOpMC";
329+
let CppTypeName = "VXMemOpInfo";
330+
let Fields = ["Log2EEW", "IsOrdered", "IsStore", "NF", "BaseInstr"];
331+
let PrimaryKey = ["BaseInstr"];
332+
let PrimaryKeyName = "getVXMemOpInfo";
333+
}
334+
319335
//===----------------------------------------------------------------------===//
320336
// Instruction class templates
321337
//===----------------------------------------------------------------------===//
@@ -560,16 +576,20 @@ multiclass VIndexLoadStore<int eew> {
560576

561577
def VLUXEI # eew # _V :
562578
VIndexedLoad<MOPLDIndexedUnord, w, "vluxei" # eew # ".v">,
579+
RISCVVXMemOpMC<!logtwo(eew), Ordered=false, Store=false>,
563580
VLXSchedMC<eew, isOrdered=0>;
564581
def VLOXEI # eew # _V :
565582
VIndexedLoad<MOPLDIndexedOrder, w, "vloxei" # eew # ".v">,
583+
RISCVVXMemOpMC<!logtwo(eew), Ordered=true, Store=false>,
566584
VLXSchedMC<eew, isOrdered=1>;
567585

568586
def VSUXEI # eew # _V :
569587
VIndexedStore<MOPSTIndexedUnord, w, "vsuxei" # eew # ".v">,
588+
RISCVVXMemOpMC<!logtwo(eew), Ordered=false, Store=true>,
570589
VSXSchedMC<eew, isOrdered=0>;
571590
def VSOXEI # eew # _V :
572591
VIndexedStore<MOPSTIndexedOrder, w, "vsoxei" # eew # ".v">,
592+
RISCVVXMemOpMC<!logtwo(eew), Ordered=true, Store=true>,
573593
VSXSchedMC<eew, isOrdered=1>;
574594
}
575595

@@ -1760,18 +1780,22 @@ let Predicates = [HasVInstructions] in {
17601780
def VLUXSEG#nf#EI#eew#_V :
17611781
VIndexedSegmentLoad<!add(nf, -1), MOPLDIndexedUnord, w,
17621782
"vluxseg"#nf#"ei"#eew#".v">,
1783+
RISCVVXMemOpMC<!logtwo(eew), Ordered=false, Store=false, N=nf>,
17631784
VLXSEGSchedMC<nf, eew, isOrdered=0>;
17641785
def VLOXSEG#nf#EI#eew#_V :
17651786
VIndexedSegmentLoad<!add(nf, -1), MOPLDIndexedOrder, w,
17661787
"vloxseg"#nf#"ei"#eew#".v">,
1788+
RISCVVXMemOpMC<!logtwo(eew), Ordered=true, Store=false, N=nf>,
17671789
VLXSEGSchedMC<nf, eew, isOrdered=1>;
17681790
def VSUXSEG#nf#EI#eew#_V :
17691791
VIndexedSegmentStore<!add(nf, -1), MOPSTIndexedUnord, w,
17701792
"vsuxseg"#nf#"ei"#eew#".v">,
1793+
RISCVVXMemOpMC<!logtwo(eew), Ordered=false, Store=true, N=nf>,
17711794
VSXSEGSchedMC<nf, eew, isOrdered=0>;
17721795
def VSOXSEG#nf#EI#eew#_V :
17731796
VIndexedSegmentStore<!add(nf, -1), MOPSTIndexedOrder, w,
17741797
"vsoxseg"#nf#"ei"#eew#".v">,
1798+
RISCVVXMemOpMC<!logtwo(eew), Ordered=true, Store=true, N=nf>,
17751799
VSXSEGSchedMC<nf, eew, isOrdered=1>;
17761800
}
17771801
}

0 commit comments

Comments
 (0)