Skip to content

Commit 32dffdc

Browse files
authored
[RISCV][MCA] Pick the correct VPseudo sched class for indexed memory operation (#128978)
It seems like we had been picking the wrong VPseudo scheduling class for indexed memory operations in RISCVMCACustomBehavior: the VPseudo opcode of indexed memory ops encode two EMULs, one for index and the other for data. However, in RISCVInversePseudoTable, we're only able to look up against one of them, yielding an incorrect VPseudo opcode with the wrong data EEW (index EEW is encoded in the opcode). Since scheduling classes for indexed memory ops uses data EMUL / EEW in their scheduling class, we would eventually fetch the wrong scheduling classes with faulty data EEW. This patch fixes this issue by deducting the correct index EMUL with LMUL (data EMUL), SEW (data EEW), and index EEW. With these parameters we can thus fetch the correct VPseudo opcode with `getVLXPseudo` / `getVLXSEGPseudo` and friends. The new search table, RISCVBaseVXMemOpTable, is created to extract the NF and index EEW info from MC opcode. Otherwise we need to write a gigantic switch statement to decode this info.
1 parent 1f27ff9 commit 32dffdc

File tree

4 files changed

+352
-277
lines changed

4 files changed

+352
-277
lines changed

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

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,26 @@
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 {
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_IMPL
34+
#include "RISCVGenSearchableTables.inc"
35+
} // namespace llvm::RISCV
36+
2337
namespace llvm {
2438
namespace mca {
2539

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

250-
const RISCVVInversePseudosTable::PseudoInfo *RVV = nullptr;
251-
if (opcodeHasEEWAndEMULInfo(Opcode)) {
264+
std::optional<unsigned> VPOpcode;
265+
if (const auto *VXMO = RISCV::getVXMemOpInfo(Opcode)) {
266+
// Calculate the expected index EMUL. For indexed operations,
267+
// the DataEEW and DataEMUL are equal to SEW and LMUL, respectively.
268+
unsigned IndexEMUL = ((1 << VXMO->Log2IdxEEW) * LMUL) / SEW;
269+
270+
if (!VXMO->NF) {
271+
// Indexed Load / Store.
272+
if (VXMO->IsStore) {
273+
if (const auto *VXP = RISCV::getVSXPseudo(
274+
/*Masked=*/0, VXMO->IsOrdered, VXMO->Log2IdxEEW, LMUL,
275+
IndexEMUL))
276+
VPOpcode = VXP->Pseudo;
277+
} else {
278+
if (const auto *VXP = RISCV::getVLXPseudo(
279+
/*Masked=*/0, VXMO->IsOrdered, VXMO->Log2IdxEEW, LMUL,
280+
IndexEMUL))
281+
VPOpcode = VXP->Pseudo;
282+
}
283+
} else {
284+
// Segmented Indexed Load / Store.
285+
if (VXMO->IsStore) {
286+
if (const auto *VXP =
287+
RISCV::getVSXSEGPseudo(VXMO->NF, /*Masked=*/0, VXMO->IsOrdered,
288+
VXMO->Log2IdxEEW, LMUL, IndexEMUL))
289+
VPOpcode = VXP->Pseudo;
290+
} else {
291+
if (const auto *VXP =
292+
RISCV::getVLXSEGPseudo(VXMO->NF, /*Masked=*/0, VXMO->IsOrdered,
293+
VXMO->Log2IdxEEW, LMUL, IndexEMUL))
294+
VPOpcode = VXP->Pseudo;
295+
}
296+
}
297+
} else if (opcodeHasEEWAndEMULInfo(Opcode)) {
252298
RISCVVType::VLMUL VLMUL = static_cast<RISCVVType::VLMUL>(LMUL);
253299
auto [EEW, EMUL] = getEEWAndEMUL(Opcode, VLMUL, SEW);
254-
RVV = RISCVVInversePseudosTable::getBaseInfo(Opcode, EMUL, EEW);
300+
if (const auto *RVV =
301+
RISCVVInversePseudosTable::getBaseInfo(Opcode, EMUL, EEW))
302+
VPOpcode = RVV->Pseudo;
255303
} else {
256304
// Check if it depends on LMUL and SEW
257-
RVV = RISCVVInversePseudosTable::getBaseInfo(Opcode, LMUL, SEW);
305+
const auto *RVV = RISCVVInversePseudosTable::getBaseInfo(Opcode, LMUL, SEW);
258306
// Check if it depends only on LMUL
259307
if (!RVV)
260308
RVV = RISCVVInversePseudosTable::getBaseInfo(Opcode, LMUL, 0);
309+
310+
if (RVV)
311+
VPOpcode = RVV->Pseudo;
261312
}
262313

263314
// Not a RVV instr
264-
if (!RVV) {
315+
if (!VPOpcode) {
265316
LLVM_DEBUG(
266317
dbgs() << "RVCB: Could not find PseudoInstruction for Opcode "
267318
<< MCII.getName(Opcode)
@@ -277,8 +328,8 @@ unsigned RISCVInstrumentManager::getSchedClassID(
277328
<< MCII.getName(Opcode) << ", LMUL=" << LI->getData()
278329
<< ", SEW=" << (SI ? SI->getData() : "Unspecified")
279330
<< ". Overriding original SchedClassID=" << SchedClassID
280-
<< " with " << MCII.getName(RVV->Pseudo) << '\n');
281-
return MCII.get(RVV->Pseudo).getSchedClass();
331+
<< " with " << MCII.getName(*VPOpcode) << '\n');
332+
return MCII.get(*VPOpcode).getSchedClass();
282333
}
283334

284335
} // 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)