Skip to content

Commit 4537aae

Browse files
author
Yeting Kuo
committed
[RISCV] Make PseudoReadVL have the vtypes of the corresponding VLEFF/VLSEGFF.
The patch make PseudoReadVL have the vtypes of the corresponding VLEFF/VLSEGFF. It's useful to get the vtypes of locations of PseudoReadVL without finding the corresponding VLEFF/VLSEGFF. It could simplify optimizations in RISCVInsertVSETVLI like D123581. Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D125199
1 parent 2509dcd commit 4537aae

File tree

8 files changed

+5294
-19
lines changed

8 files changed

+5294
-19
lines changed

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,8 @@ void RISCVDAGToDAGISel::selectVLSEGFF(SDNode *Node, bool IsMasked) {
357357
unsigned NF = Node->getNumValues() - 2; // Do not count VL and Chain.
358358
MVT VT = Node->getSimpleValueType(0);
359359
MVT XLenVT = Subtarget->getXLenVT();
360-
unsigned Log2SEW = Log2_32(VT.getScalarSizeInBits());
360+
unsigned SEW = VT.getScalarSizeInBits();
361+
unsigned Log2SEW = Log2_32(SEW);
361362
RISCVII::VLMUL LMUL = RISCVTargetLowering::getLMUL(VT);
362363

363364
unsigned CurOp = 2;
@@ -379,8 +380,18 @@ void RISCVDAGToDAGISel::selectVLSEGFF(SDNode *Node, bool IsMasked) {
379380
Log2SEW, static_cast<unsigned>(LMUL));
380381
MachineSDNode *Load = CurDAG->getMachineNode(P->Pseudo, DL, MVT::Untyped,
381382
MVT::Other, MVT::Glue, Operands);
383+
bool TailAgnostic = true;
384+
bool MaskAgnostic = false;
385+
if (IsMasked) {
386+
uint64_t Policy = Node->getConstantOperandVal(Node->getNumOperands() - 1);
387+
TailAgnostic = Policy & RISCVII::TAIL_AGNOSTIC;
388+
MaskAgnostic = Policy & RISCVII::MASK_AGNOSTIC;
389+
}
390+
unsigned VType =
391+
RISCVVType::encodeVTYPE(LMUL, SEW, TailAgnostic, MaskAgnostic);
392+
SDValue VTypeOp = CurDAG->getTargetConstant(VType, DL, XLenVT);
382393
SDNode *ReadVL = CurDAG->getMachineNode(RISCV::PseudoReadVL, DL, XLenVT,
383-
/*Glue*/ SDValue(Load, 2));
394+
VTypeOp, /*Glue*/ SDValue(Load, 2));
384395

385396
if (auto *MemOp = dyn_cast<MemSDNode>(Node))
386397
CurDAG->setNodeMemRefs(Load, {MemOp->getMemOperand()});
@@ -1342,7 +1353,8 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
13421353
bool IsMasked = IntNo == Intrinsic::riscv_vleff_mask;
13431354

13441355
MVT VT = Node->getSimpleValueType(0);
1345-
unsigned Log2SEW = Log2_32(VT.getScalarSizeInBits());
1356+
unsigned SEW = VT.getScalarSizeInBits();
1357+
unsigned Log2SEW = Log2_32(SEW);
13461358

13471359
unsigned CurOp = 2;
13481360
// Masked intrinsic only have TU version pseduo instructions.
@@ -1365,8 +1377,20 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
13651377
MachineSDNode *Load =
13661378
CurDAG->getMachineNode(P->Pseudo, DL, Node->getValueType(0),
13671379
MVT::Other, MVT::Glue, Operands);
1368-
SDNode *ReadVL = CurDAG->getMachineNode(RISCV::PseudoReadVL, DL, XLenVT,
1369-
/*Glue*/ SDValue(Load, 2));
1380+
bool TailAgnostic = !IsTU;
1381+
bool MaskAgnostic = false;
1382+
if (IsMasked) {
1383+
uint64_t Policy =
1384+
Node->getConstantOperandVal(Node->getNumOperands() - 1);
1385+
TailAgnostic = Policy & RISCVII::TAIL_AGNOSTIC;
1386+
MaskAgnostic = Policy & RISCVII::MASK_AGNOSTIC;
1387+
}
1388+
unsigned VType =
1389+
RISCVVType::encodeVTYPE(LMUL, SEW, TailAgnostic, MaskAgnostic);
1390+
SDValue VTypeOp = CurDAG->getTargetConstant(VType, DL, XLenVT);
1391+
SDNode *ReadVL =
1392+
CurDAG->getMachineNode(RISCV::PseudoReadVL, DL, XLenVT, VTypeOp,
1393+
/*Glue*/ SDValue(Load, 2));
13701394

13711395
if (auto *MemOp = dyn_cast<MemSDNode>(Node))
13721396
CurDAG->setNodeMemRefs(Load, {MemOp->getMemOperand()});

llvm/lib/Target/RISCV/RISCVInstrInfo.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1352,13 +1352,14 @@ std::string RISCVInstrInfo::createMIROperandComment(
13521352

13531353
uint64_t TSFlags = MI.getDesc().TSFlags;
13541354

1355-
// Print the full VType operand of vsetvli/vsetivli instructions, and the SEW
1356-
// operand of vector codegen pseudos.
1357-
if ((MI.getOpcode() == RISCV::VSETVLI || MI.getOpcode() == RISCV::VSETIVLI ||
1358-
MI.getOpcode() == RISCV::PseudoVSETVLI ||
1359-
MI.getOpcode() == RISCV::PseudoVSETIVLI ||
1360-
MI.getOpcode() == RISCV::PseudoVSETVLIX0) &&
1361-
OpIdx == 2) {
1355+
// Print the full VType operand of vsetvli/vsetivli and PseudoReadVL
1356+
// instructions, and the SEW operand of vector codegen pseudos.
1357+
if (((MI.getOpcode() == RISCV::VSETVLI || MI.getOpcode() == RISCV::VSETIVLI ||
1358+
MI.getOpcode() == RISCV::PseudoVSETVLI ||
1359+
MI.getOpcode() == RISCV::PseudoVSETIVLI ||
1360+
MI.getOpcode() == RISCV::PseudoVSETVLIX0) &&
1361+
OpIdx == 2) ||
1362+
(MI.getOpcode() == RISCV::PseudoReadVL && OpIdx == 1)) {
13621363
unsigned Imm = MI.getOperand(OpIdx).getImm();
13631364
RISCVVType::printVType(Imm, OS);
13641365
} else if (RISCVII::hasSEWOp(TSFlags)) {

llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4240,7 +4240,7 @@ let hasSideEffects = 0, mayLoad = 0, mayStore = 0, isCodeGenOnly = 1 in {
42404240

42414241
let hasSideEffects = 0, mayLoad = 0, mayStore = 0, isCodeGenOnly = 1,
42424242
Uses = [VL] in
4243-
def PseudoReadVL : Pseudo<(outs GPR:$rd), (ins), []>;
4243+
def PseudoReadVL : Pseudo<(outs GPR:$rd), (ins ixlenimm:$vtype), []>;
42444244

42454245
let hasSideEffects = 0, mayLoad = 0, mayStore = 1, isCodeGenOnly = 1 in {
42464246
def PseudoVSPILL_M1 : VPseudo<VS1R_V, V_M1, (outs), (ins VR:$rs1, GPR:$rs2)>;

llvm/lib/Target/RISCV/RISCVMCInstLower.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,16 @@ bool llvm::lowerRISCVMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
210210
if (lowerRISCVVMachineInstrToMCInst(MI, OutMI))
211211
return false;
212212

213+
// Only need the output operand when lower PseudoReadVL from MI to MCInst.
214+
if (MI->getOpcode() == RISCV::PseudoReadVL) {
215+
OutMI.setOpcode(RISCV::CSRRS);
216+
OutMI.addOperand(MCOperand::createReg(MI->getOperand(0).getReg()));
217+
OutMI.addOperand(
218+
MCOperand::createImm(RISCVSysReg::lookupSysRegByName("VL")->Encoding));
219+
OutMI.addOperand(MCOperand::createReg(RISCV::X0));
220+
return false;
221+
}
222+
213223
OutMI.setOpcode(MI->getOpcode());
214224

215225
for (const MachineOperand &MO : MI->operands()) {
@@ -238,12 +248,6 @@ bool llvm::lowerRISCVMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
238248
RISCVSysReg::lookupSysRegByName("VLENB")->Encoding));
239249
OutMI.addOperand(MCOperand::createReg(RISCV::X0));
240250
break;
241-
case RISCV::PseudoReadVL:
242-
OutMI.setOpcode(RISCV::CSRRS);
243-
OutMI.addOperand(
244-
MCOperand::createImm(RISCVSysReg::lookupSysRegByName("VL")->Encoding));
245-
OutMI.addOperand(MCOperand::createReg(RISCV::X0));
246-
break;
247251
}
248252
return false;
249253
}

0 commit comments

Comments
 (0)