Skip to content

Commit 7f5b388

Browse files
committed
[RISCV] Remove unneeded indexed segment load/store vector pseudo instruction.
We had more combinations of data and index lmuls than we needed. Also add some asserts to verify that the IndexVT and data VT have the same element count when we isel these pseudo instructions.
1 parent d056d5d commit 7f5b388

File tree

2 files changed

+50
-26
lines changed

2 files changed

+50
-26
lines changed

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,9 @@ void RISCVDAGToDAGISel::selectVLXSEG(SDNode *Node, bool IsMasked,
297297
Operands.push_back(SEW);
298298
Operands.push_back(Node->getOperand(0)); // Chain.
299299

300+
assert(VT.getVectorElementCount() == IndexVT.getVectorElementCount() &&
301+
"Element count mismatch");
302+
300303
RISCVVLMUL IndexLMUL = getLMUL(IndexVT);
301304
unsigned IndexScalarSize = IndexVT.getScalarSizeInBits();
302305
const RISCV::VLXSEGPseudo *P = RISCV::getVLXSEGPseudo(
@@ -376,6 +379,9 @@ void RISCVDAGToDAGISel::selectVSXSEG(SDNode *Node, bool IsMasked,
376379
Operands.push_back(SEW);
377380
Operands.push_back(Node->getOperand(0)); // Chain.
378381

382+
assert(VT.getVectorElementCount() == IndexVT.getVectorElementCount() &&
383+
"Element count mismatch");
384+
379385
RISCVVLMUL IndexLMUL = getLMUL(IndexVT);
380386
unsigned IndexScalarSize = IndexVT.getScalarSizeInBits();
381387
const RISCV::VSXSEGPseudo *P = RISCV::getVSXSEGPseudo(

llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2004,19 +2004,28 @@ multiclass VPseudoSSegLoad {
20042004
}
20052005

20062006
multiclass VPseudoISegLoad<bit Ordered> {
2007-
foreach idx_eew = EEWList in { // EEW for index argument.
2008-
foreach idx_lmul = MxSet<idx_eew>.m in { // LMUL for index argument.
2009-
foreach val_lmul = MxList.m in { // LMUL for the value.
2010-
defvar IdxLInfo = idx_lmul.MX;
2011-
defvar IdxVreg = idx_lmul.vrclass;
2012-
defvar ValLInfo = val_lmul.MX;
2013-
let VLMul = val_lmul.value in {
2014-
foreach nf = NFSet<val_lmul>.L in {
2015-
defvar ValVreg = SegRegClass<val_lmul, nf>.RC;
2016-
def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo :
2017-
VPseudoISegLoadNoMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value, nf, Ordered>;
2018-
def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo # "_MASK" :
2019-
VPseudoISegLoadMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value, nf, Ordered>;
2007+
foreach idx_eew = EEWList in {
2008+
foreach sew = EEWList in {
2009+
foreach val_lmul = MxSet<sew>.m in {
2010+
defvar octuple_lmul = octuple_from_str<val_lmul.MX>.ret;
2011+
// Calculate emul = eew * lmul / sew
2012+
defvar octuple_emul = !srl(!mul(idx_eew, octuple_lmul), shift_amount<sew>.val);
2013+
if !and(!ge(octuple_emul, 1), !le(octuple_emul, 64)) then {
2014+
defvar ValLInfo = val_lmul.MX;
2015+
defvar IdxLInfo = octuple_to_str<octuple_emul>.ret;
2016+
defvar idx_lmul = !cast<LMULInfo>("V_" # IdxLInfo);
2017+
defvar Vreg = val_lmul.vrclass;
2018+
defvar IdxVreg = idx_lmul.vrclass;
2019+
let VLMul = val_lmul.value in {
2020+
foreach nf = NFSet<val_lmul>.L in {
2021+
defvar ValVreg = SegRegClass<val_lmul, nf>.RC;
2022+
def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo :
2023+
VPseudoISegLoadNoMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value,
2024+
nf, Ordered>;
2025+
def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo # "_MASK" :
2026+
VPseudoISegLoadMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value,
2027+
nf, Ordered>;
2028+
}
20202029
}
20212030
}
20222031
}
@@ -2055,19 +2064,28 @@ multiclass VPseudoSSegStore {
20552064
}
20562065

20572066
multiclass VPseudoISegStore<bit Ordered> {
2058-
foreach idx_eew = EEWList in { // EEW for index argument.
2059-
foreach idx_lmul = MxSet<idx_eew>.m in { // LMUL for index argument.
2060-
foreach val_lmul = MxList.m in { // LMUL for the value.
2061-
defvar IdxLInfo = idx_lmul.MX;
2062-
defvar IdxVreg = idx_lmul.vrclass;
2063-
defvar ValLInfo = val_lmul.MX;
2064-
let VLMul = val_lmul.value in {
2065-
foreach nf = NFSet<val_lmul>.L in {
2066-
defvar ValVreg = SegRegClass<val_lmul, nf>.RC;
2067-
def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo :
2068-
VPseudoISegStoreNoMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value, nf, Ordered>;
2069-
def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo # "_MASK" :
2070-
VPseudoISegStoreMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value, nf, Ordered>;
2067+
foreach idx_eew = EEWList in {
2068+
foreach sew = EEWList in {
2069+
foreach val_lmul = MxSet<sew>.m in {
2070+
defvar octuple_lmul = octuple_from_str<val_lmul.MX>.ret;
2071+
// Calculate emul = eew * lmul / sew
2072+
defvar octuple_emul = !srl(!mul(idx_eew, octuple_lmul), shift_amount<sew>.val);
2073+
if !and(!ge(octuple_emul, 1), !le(octuple_emul, 64)) then {
2074+
defvar ValLInfo = val_lmul.MX;
2075+
defvar IdxLInfo = octuple_to_str<octuple_emul>.ret;
2076+
defvar idx_lmul = !cast<LMULInfo>("V_" # IdxLInfo);
2077+
defvar Vreg = val_lmul.vrclass;
2078+
defvar IdxVreg = idx_lmul.vrclass;
2079+
let VLMul = val_lmul.value in {
2080+
foreach nf = NFSet<val_lmul>.L in {
2081+
defvar ValVreg = SegRegClass<val_lmul, nf>.RC;
2082+
def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo :
2083+
VPseudoISegStoreNoMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value,
2084+
nf, Ordered>;
2085+
def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo # "_MASK" :
2086+
VPseudoISegStoreMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value,
2087+
nf, Ordered>;
2088+
}
20712089
}
20722090
}
20732091
}

0 commit comments

Comments
 (0)