Skip to content

Commit 0746ff3

Browse files
authored
[RISCV] Explicitly use i32 in RV32 Zdinx patterns to prune tablegen patterns. NFC (#162790)
Tablegen was creating unnecessary patterns for the RV64 HwMode.
1 parent 3f84e16 commit 0746ff3

File tree

4 files changed

+60
-49
lines changed

4 files changed

+60
-49
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.td

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1653,17 +1653,18 @@ def riscv_selectcc_frag : PatFrag<(ops node:$lhs, node:$rhs, node:$cc,
16531653
node:$falsev), [{}],
16541654
IntCCtoRISCVCC>;
16551655

1656-
multiclass SelectCC_GPR_rrirr<DAGOperand valty, ValueType vt> {
1656+
multiclass SelectCC_GPR_rrirr<DAGOperand valty, ValueType vt,
1657+
ValueType cmpvt = XLenVT> {
16571658
let usesCustomInserter = 1 in
16581659
def _Using_CC_GPR : Pseudo<(outs valty:$dst),
16591660
(ins GPR:$lhs, GPR:$rhs, cond_code:$cc,
16601661
valty:$truev, valty:$falsev),
16611662
[(set valty:$dst,
1662-
(riscv_selectcc_frag:$cc (XLenVT GPR:$lhs), GPR:$rhs, cond,
1663+
(riscv_selectcc_frag:$cc (cmpvt GPR:$lhs), GPR:$rhs, cond,
16631664
(vt valty:$truev), valty:$falsev))]>;
16641665
// Explicitly select 0 in the condition to X0. The register coalescer doesn't
16651666
// always do it.
1666-
def : Pat<(riscv_selectcc_frag:$cc (XLenVT GPR:$lhs), 0, cond, (vt valty:$truev),
1667+
def : Pat<(riscv_selectcc_frag:$cc (cmpvt GPR:$lhs), 0, cond, (vt valty:$truev),
16671668
valty:$falsev),
16681669
(!cast<Instruction>(NAME#"_Using_CC_GPR") GPR:$lhs, (XLenVT X0),
16691670
(IntCCtoRISCVCC $cc), valty:$truev, valty:$falsev)>;

llvm/lib/Target/RISCV/RISCVInstrInfoD.td

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ def FPR64IN32X : RegisterOperand<GPRPair> {
5959
def DExt : ExtInfo<"", "", [HasStdExtD], f64, FPR64, FPR32, FPR64, ?>;
6060

6161
def ZdinxExt : ExtInfo<"_INX", "Zfinx", [HasStdExtZdinx, IsRV64],
62-
f64, FPR64INX, FPR32INX, FPR64INX, ?>;
62+
f64, FPR64INX, FPR32INX, FPR64INX, ?, i64>;
6363
def Zdinx32Ext : ExtInfo<"_IN32X", "ZdinxRV32Only", [HasStdExtZdinx, IsRV32],
64-
f64, FPR64IN32X, FPR32INX, FPR64IN32X, ?>;
64+
f64, FPR64IN32X, FPR32INX, FPR64IN32X, ?, i32>;
6565

6666
defvar DExts = [DExt, ZdinxExt, Zdinx32Ext];
6767
defvar DExtsRV64 = [DExt, ZdinxExt];
@@ -261,8 +261,10 @@ let Predicates = [HasStdExtZdinx, IsRV32] in {
261261
/// Float conversion operations
262262

263263
// f64 -> f32, f32 -> f64
264-
def : Pat<(any_fpround FPR64IN32X:$rs1), (FCVT_S_D_IN32X FPR64IN32X:$rs1, FRM_DYN)>;
265-
def : Pat<(any_fpextend FPR32INX:$rs1), (FCVT_D_S_IN32X FPR32INX:$rs1, FRM_RNE)>;
264+
def : Pat<(any_fpround FPR64IN32X:$rs1),
265+
(FCVT_S_D_IN32X FPR64IN32X:$rs1, (i32 FRM_DYN))>;
266+
def : Pat<(any_fpextend FPR32INX:$rs1),
267+
(FCVT_D_S_IN32X FPR32INX:$rs1, (i32 FRM_RNE))>;
266268
} // Predicates = [HasStdExtZdinx, IsRV32]
267269

268270
// [u]int<->double conversion patterns must be gated on IsRV32 or IsRV64, so
@@ -321,7 +323,7 @@ def : Pat<(any_fsqrt FPR64INX:$rs1), (FSQRT_D_INX FPR64INX:$rs1, FRM_DYN)>;
321323
def : Pat<(fneg FPR64INX:$rs1), (FSGNJN_D_INX $rs1, $rs1)>;
322324
def : Pat<(fabs FPR64INX:$rs1), (FSGNJX_D_INX $rs1, $rs1)>;
323325

324-
def : Pat<(riscv_fclass FPR64INX:$rs1), (FCLASS_D_INX $rs1)>;
326+
def : Pat<(i64 (riscv_fclass FPR64INX:$rs1)), (FCLASS_D_INX $rs1)>;
325327

326328
def : PatFprFpr<fcopysign, FSGNJ_D_INX, FPR64INX, f64>;
327329
def : PatFprFpr<riscv_fsgnjx, FSGNJX_D_INX, FPR64INX, f64>;
@@ -354,41 +356,46 @@ def : Pat<(fneg (any_fma_nsz FPR64INX:$rs1, FPR64INX:$rs2, FPR64INX:$rs3)),
354356
} // Predicates = [HasStdExtZdinx, IsRV64]
355357

356358
let Predicates = [HasStdExtZdinx, IsRV32] in {
357-
def : Pat<(any_fsqrt FPR64IN32X:$rs1), (FSQRT_D_IN32X FPR64IN32X:$rs1, FRM_DYN)>;
359+
def : Pat<(any_fsqrt FPR64IN32X:$rs1),
360+
(FSQRT_D_IN32X FPR64IN32X:$rs1, (i32 FRM_DYN))>;
358361

359362
def : Pat<(fneg FPR64IN32X:$rs1), (FSGNJN_D_IN32X $rs1, $rs1)>;
360363
def : Pat<(fabs FPR64IN32X:$rs1), (FSGNJX_D_IN32X $rs1, $rs1)>;
361364

362-
def : Pat<(riscv_fclass FPR64IN32X:$rs1), (FCLASS_D_IN32X $rs1)>;
365+
def : Pat<(i32 (riscv_fclass FPR64IN32X:$rs1)), (FCLASS_D_IN32X $rs1)>;
363366

364367
def : PatFprFpr<fcopysign, FSGNJ_D_IN32X, FPR64IN32X, f64>;
365368
def : PatFprFpr<riscv_fsgnjx, FSGNJX_D_IN32X, FPR64IN32X, f64>;
366369
def : Pat<(fcopysign FPR64IN32X:$rs1, (fneg FPR64IN32X:$rs2)),
367370
(FSGNJN_D_IN32X FPR64IN32X:$rs1, FPR64IN32X:$rs2)>;
368371
def : Pat<(fcopysign FPR64IN32X:$rs1, FPR32INX:$rs2),
369-
(FSGNJ_D_IN32X $rs1, (FCVT_D_S_IN32X $rs2, FRM_RNE))>;
372+
(FSGNJ_D_IN32X $rs1, (FCVT_D_S_IN32X $rs2, (i32 FRM_RNE)))>;
370373
def : Pat<(fcopysign FPR32INX:$rs1, FPR64IN32X:$rs2),
371-
(FSGNJ_S_INX $rs1, (FCVT_S_D_IN32X $rs2, FRM_DYN))>;
374+
(FSGNJ_S_INX $rs1, (FCVT_S_D_IN32X $rs2, (i32 FRM_DYN)))>;
372375

373376
// fmadd: rs1 * rs2 + rs3
374377
def : Pat<(any_fma FPR64IN32X:$rs1, FPR64IN32X:$rs2, FPR64IN32X:$rs3),
375-
(FMADD_D_IN32X $rs1, $rs2, $rs3, FRM_DYN)>;
378+
(FMADD_D_IN32X $rs1, $rs2, $rs3, (i32 FRM_DYN))>;
376379

377380
// fmsub: rs1 * rs2 - rs3
378381
def : Pat<(any_fma FPR64IN32X:$rs1, FPR64IN32X:$rs2, (fneg FPR64IN32X:$rs3)),
379-
(FMSUB_D_IN32X FPR64IN32X:$rs1, FPR64IN32X:$rs2, FPR64IN32X:$rs3, FRM_DYN)>;
382+
(FMSUB_D_IN32X FPR64IN32X:$rs1, FPR64IN32X:$rs2, FPR64IN32X:$rs3,
383+
(i32 FRM_DYN))>;
380384

381385
// fnmsub: -rs1 * rs2 + rs3
382386
def : Pat<(any_fma (fneg FPR64IN32X:$rs1), FPR64IN32X:$rs2, FPR64IN32X:$rs3),
383-
(FNMSUB_D_IN32X FPR64IN32X:$rs1, FPR64IN32X:$rs2, FPR64IN32X:$rs3, FRM_DYN)>;
387+
(FNMSUB_D_IN32X FPR64IN32X:$rs1, FPR64IN32X:$rs2, FPR64IN32X:$rs3,
388+
(i32 FRM_DYN))>;
384389

385390
// fnmadd: -rs1 * rs2 - rs3
386391
def : Pat<(any_fma (fneg FPR64IN32X:$rs1), FPR64IN32X:$rs2, (fneg FPR64IN32X:$rs3)),
387-
(FNMADD_D_IN32X FPR64IN32X:$rs1, FPR64IN32X:$rs2, FPR64IN32X:$rs3, FRM_DYN)>;
392+
(FNMADD_D_IN32X FPR64IN32X:$rs1, FPR64IN32X:$rs2, FPR64IN32X:$rs3,
393+
(i32 FRM_DYN))>;
388394

389395
// fnmadd: -(rs1 * rs2 + rs3) (the nsz flag on the FMA)
390396
def : Pat<(fneg (any_fma_nsz FPR64IN32X:$rs1, FPR64IN32X:$rs2, FPR64IN32X:$rs3)),
391-
(FNMADD_D_IN32X FPR64IN32X:$rs1, FPR64IN32X:$rs2, FPR64IN32X:$rs3, FRM_DYN)>;
397+
(FNMADD_D_IN32X FPR64IN32X:$rs1, FPR64IN32X:$rs2, FPR64IN32X:$rs3,
398+
(i32 FRM_DYN))>;
392399
} // Predicates = [HasStdExtZdinx, IsRV32]
393400

394401
// The ratified 20191213 ISA spec defines fmin and fmax in a way that matches
@@ -441,42 +448,42 @@ def : PatSetCC<FPR64, any_fsetccs, SETOLE, FLE_D, f64>;
441448

442449
let Predicates = [HasStdExtZdinx, IsRV64] in {
443450
// Match signaling FEQ_D
444-
def : Pat<(XLenVT (strict_fsetccs (f64 FPR64INX:$rs1), FPR64INX:$rs2, SETEQ)),
451+
def : Pat<(XLenVT (strict_fsetccs FPR64INX:$rs1, FPR64INX:$rs2, SETEQ)),
445452
(AND (XLenVT (FLE_D_INX $rs1, $rs2)),
446453
(XLenVT (FLE_D_INX $rs2, $rs1)))>;
447-
def : Pat<(XLenVT (strict_fsetccs (f64 FPR64INX:$rs1), FPR64INX:$rs2, SETOEQ)),
454+
def : Pat<(XLenVT (strict_fsetccs FPR64INX:$rs1, FPR64INX:$rs2, SETOEQ)),
448455
(AND (XLenVT (FLE_D_INX $rs1, $rs2)),
449456
(XLenVT (FLE_D_INX $rs2, $rs1)))>;
450457
// If both operands are the same, use a single FLE.
451-
def : Pat<(XLenVT (strict_fsetccs (f64 FPR64INX:$rs1), FPR64INX:$rs1, SETEQ)),
458+
def : Pat<(XLenVT (strict_fsetccs FPR64INX:$rs1, FPR64INX:$rs1, SETEQ)),
452459
(FLE_D_INX $rs1, $rs1)>;
453-
def : Pat<(XLenVT (strict_fsetccs (f64 FPR64INX:$rs1), FPR64INX:$rs1, SETOEQ)),
460+
def : Pat<(XLenVT (strict_fsetccs FPR64INX:$rs1, FPR64INX:$rs1, SETOEQ)),
454461
(FLE_D_INX $rs1, $rs1)>;
455462

456-
def : PatSetCC<FPR64INX, any_fsetccs, SETLT, FLT_D_INX, f64>;
457-
def : PatSetCC<FPR64INX, any_fsetccs, SETOLT, FLT_D_INX, f64>;
458-
def : PatSetCC<FPR64INX, any_fsetccs, SETLE, FLE_D_INX, f64>;
459-
def : PatSetCC<FPR64INX, any_fsetccs, SETOLE, FLE_D_INX, f64>;
463+
def : PatSetCC<FPR64INX, any_fsetccs, SETLT, FLT_D_INX, f64, i64>;
464+
def : PatSetCC<FPR64INX, any_fsetccs, SETOLT, FLT_D_INX, f64, i64>;
465+
def : PatSetCC<FPR64INX, any_fsetccs, SETLE, FLE_D_INX, f64, i64>;
466+
def : PatSetCC<FPR64INX, any_fsetccs, SETOLE, FLE_D_INX, f64, i64>;
460467
} // Predicates = [HasStdExtZdinx, IsRV64]
461468

462469
let Predicates = [HasStdExtZdinx, IsRV32] in {
463470
// Match signaling FEQ_D
464-
def : Pat<(XLenVT (strict_fsetccs (f64 FPR64IN32X:$rs1), FPR64IN32X:$rs2, SETEQ)),
471+
def : Pat<(i32 (strict_fsetccs FPR64IN32X:$rs1, FPR64IN32X:$rs2, SETEQ)),
465472
(AND (XLenVT (FLE_D_IN32X $rs1, $rs2)),
466473
(XLenVT (FLE_D_IN32X $rs2, $rs1)))>;
467-
def : Pat<(XLenVT (strict_fsetccs (f64 FPR64IN32X:$rs1), FPR64IN32X:$rs2, SETOEQ)),
474+
def : Pat<(i32 (strict_fsetccs FPR64IN32X:$rs1, FPR64IN32X:$rs2, SETOEQ)),
468475
(AND (XLenVT (FLE_D_IN32X $rs1, $rs2)),
469476
(XLenVT (FLE_D_IN32X $rs2, $rs1)))>;
470477
// If both operands are the same, use a single FLE.
471-
def : Pat<(XLenVT (strict_fsetccs (f64 FPR64IN32X:$rs1), FPR64IN32X:$rs1, SETEQ)),
478+
def : Pat<(i32 (strict_fsetccs FPR64IN32X:$rs1, FPR64IN32X:$rs1, SETEQ)),
472479
(FLE_D_IN32X $rs1, $rs1)>;
473-
def : Pat<(XLenVT (strict_fsetccs (f64 FPR64IN32X:$rs1), FPR64IN32X:$rs1, SETOEQ)),
480+
def : Pat<(i32 (strict_fsetccs FPR64IN32X:$rs1, FPR64IN32X:$rs1, SETOEQ)),
474481
(FLE_D_IN32X $rs1, $rs1)>;
475482

476-
def : PatSetCC<FPR64IN32X, any_fsetccs, SETLT, FLT_D_IN32X, f64>;
477-
def : PatSetCC<FPR64IN32X, any_fsetccs, SETOLT, FLT_D_IN32X, f64>;
478-
def : PatSetCC<FPR64IN32X, any_fsetccs, SETLE, FLE_D_IN32X, f64>;
479-
def : PatSetCC<FPR64IN32X, any_fsetccs, SETOLE, FLE_D_IN32X, f64>;
483+
def : PatSetCC<FPR64IN32X, any_fsetccs, SETLT, FLT_D_IN32X, f64, i32>;
484+
def : PatSetCC<FPR64IN32X, any_fsetccs, SETOLT, FLT_D_IN32X, f64, i32>;
485+
def : PatSetCC<FPR64IN32X, any_fsetccs, SETLE, FLE_D_IN32X, f64, i32>;
486+
def : PatSetCC<FPR64IN32X, any_fsetccs, SETOLE, FLE_D_IN32X, f64, i32>;
480487
} // Predicates = [HasStdExtZdinx, IsRV32]
481488

482489
let Predicates = [HasStdExtD] in {
@@ -511,7 +518,7 @@ def SplitF64Pseudo
511518
} // Predicates = [HasStdExtD, NoStdExtZfa, IsRV32]
512519

513520
let Predicates = [HasStdExtZdinx, IsRV64] in {
514-
defm Select_FPR64INX : SelectCC_GPR_rrirr<FPR64INX, f64>;
521+
defm Select_FPR64INX : SelectCC_GPR_rrirr<FPR64INX, f64, i64>;
515522

516523
def PseudoFROUND_D_INX : PseudoFROUND<FPR64INX, f64>;
517524

@@ -523,9 +530,9 @@ def : StPat<store, SD, GPR, f64>;
523530
} // Predicates = [HasStdExtZdinx, IsRV64]
524531

525532
let Predicates = [HasStdExtZdinx, IsRV32] in {
526-
defm Select_FPR64IN32X : SelectCC_GPR_rrirr<FPR64IN32X, f64>;
533+
defm Select_FPR64IN32X : SelectCC_GPR_rrirr<FPR64IN32X, f64, i32>;
527534

528-
def PseudoFROUND_D_IN32X : PseudoFROUND<FPR64IN32X, f64>;
535+
def PseudoFROUND_D_IN32X : PseudoFROUND<FPR64IN32X, f64, i32>;
529536

530537
/// Loads
531538
let hasSideEffects = 0, mayLoad = 1, mayStore = 0, Size = 8, isCodeGenOnly = 1 in

llvm/lib/Target/RISCV/RISCVInstrInfoF.td

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def FPR32INX : RegisterOperand<GPRF32> {
131131
// The DAGOperand can be unset if the predicates are not enough to define it.
132132
class ExtInfo<string suffix, string space, list<Predicate> predicates,
133133
ValueType primaryvt, DAGOperand primaryty, DAGOperand f32ty,
134-
DAGOperand f64ty, DAGOperand f16ty> {
134+
DAGOperand f64ty, DAGOperand f16ty, ValueType intvt = XLenVT> {
135135
list<Predicate> Predicates = predicates;
136136
string Suffix = suffix;
137137
string Space = space;
@@ -140,6 +140,7 @@ class ExtInfo<string suffix, string space, list<Predicate> predicates,
140140
DAGOperand F32Ty = f32ty;
141141
DAGOperand F64Ty = f64ty;
142142
ValueType PrimaryVT = primaryvt;
143+
ValueType IntVT = intvt;
143144
}
144145

145146
def FExt : ExtInfo<"", "", [HasStdExtF], f32, FPR32, FPR32, ?, ?>;
@@ -314,9 +315,9 @@ multiclass FPCmp_rr_m<bits<7> funct7, bits<3> funct3, string opcodestr,
314315
def Ext.Suffix : FPCmp_rr<funct7, funct3, opcodestr, Ext.PrimaryTy, Commutable>;
315316
}
316317

317-
class PseudoFROUND<DAGOperand Ty, ValueType vt>
318+
class PseudoFROUND<DAGOperand Ty, ValueType vt, ValueType intvt = XLenVT>
318319
: Pseudo<(outs Ty:$rd), (ins Ty:$rs1, Ty:$rs2, ixlenimm:$rm),
319-
[(set Ty:$rd, (vt (riscv_fround Ty:$rs1, Ty:$rs2, timm:$rm)))]> {
320+
[(set Ty:$rd, (vt (riscv_fround Ty:$rs1, Ty:$rs2, (intvt timm:$rm))))]> {
320321
let hasSideEffects = 0;
321322
let mayLoad = 0;
322323
let mayStore = 0;
@@ -529,13 +530,14 @@ def fpimm0 : PatLeaf<(fpimm), [{ return N->isExactlyValue(+0.0); }]>;
529530

530531
/// Generic pattern classes
531532
class PatSetCC<DAGOperand Ty, SDPatternOperator OpNode, CondCode Cond,
532-
RVInstCommon Inst, ValueType vt>
533-
: Pat<(XLenVT (OpNode (vt Ty:$rs1), Ty:$rs2, Cond)), (Inst $rs1, $rs2)>;
533+
RVInstCommon Inst, ValueType vt, ValueType intvt = XLenVT>
534+
: Pat<(intvt (OpNode (vt Ty:$rs1), Ty:$rs2, Cond)), (Inst $rs1, $rs2)>;
534535
multiclass PatSetCC_m<SDPatternOperator OpNode, CondCode Cond,
535536
RVInstCommon Inst, ExtInfo Ext> {
536537
let Predicates = Ext.Predicates in
537538
def Ext.Suffix : PatSetCC<Ext.PrimaryTy, OpNode, Cond,
538-
!cast<RVInstCommon>(Inst#Ext.Suffix), Ext.PrimaryVT>;
539+
!cast<RVInstCommon>(Inst#Ext.Suffix),
540+
Ext.PrimaryVT, Ext.IntVT>;
539541
}
540542

541543
class PatFprFpr<SDPatternOperator OpNode, RVInstR Inst,
@@ -549,14 +551,15 @@ multiclass PatFprFpr_m<SDPatternOperator OpNode, RVInstR Inst,
549551
}
550552

551553
class PatFprFprDynFrm<SDPatternOperator OpNode, RVInstRFrm Inst,
552-
DAGOperand RegTy, ValueType vt>
553-
: Pat<(OpNode (vt RegTy:$rs1), (vt RegTy:$rs2)), (Inst $rs1, $rs2, FRM_DYN)>;
554+
DAGOperand RegTy, ValueType vt, ValueType intvt>
555+
: Pat<(OpNode (vt RegTy:$rs1), (vt RegTy:$rs2)),
556+
(Inst $rs1, $rs2,(intvt FRM_DYN))>;
554557
multiclass PatFprFprDynFrm_m<SDPatternOperator OpNode, RVInstRFrm Inst,
555558
ExtInfo Ext> {
556559
let Predicates = Ext.Predicates in
557560
def Ext.Suffix : PatFprFprDynFrm<OpNode,
558561
!cast<RVInstRFrm>(Inst#Ext.Suffix),
559-
Ext.PrimaryTy, Ext.PrimaryVT>;
562+
Ext.PrimaryTy, Ext.PrimaryVT, Ext.IntVT>;
560563
}
561564

562565
/// Float conversion operations

llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,16 @@ def ZhinxminExt : ExtInfo<"_INX", "Zfinx",
6969
f16, FPR16INX, FPR32INX, ?, FPR16INX>;
7070
def ZhinxZdinxExt : ExtInfo<"_INX", "Zfinx",
7171
[HasStdExtZhinx, HasStdExtZdinx, IsRV64],
72-
?, ?, FPR32INX, FPR64INX, FPR16INX>;
72+
?, ?, FPR32INX, FPR64INX, FPR16INX, i64>;
7373
def ZhinxminZdinxExt : ExtInfo<"_INX", "Zfinx",
7474
[HasStdExtZhinxmin, HasStdExtZdinx, IsRV64],
75-
?, ?, FPR32INX, FPR64INX, FPR16INX>;
75+
?, ?, FPR32INX, FPR64INX, FPR16INX, i64>;
7676
def ZhinxZdinx32Ext : ExtInfo<"_IN32X", "ZdinxGPRPairRV32",
7777
[HasStdExtZhinx, HasStdExtZdinx, IsRV32],
78-
?, ?, FPR32INX, FPR64IN32X, FPR16INX>;
78+
?, ?, FPR32INX, FPR64IN32X, FPR16INX, i32>;
7979
def ZhinxminZdinx32Ext : ExtInfo<"_IN32X", "ZdinxGPRPairRV32",
8080
[HasStdExtZhinxmin, HasStdExtZdinx, IsRV32],
81-
?, ?, FPR32INX, FPR64IN32X, FPR16INX>;
81+
?, ?, FPR32INX, FPR64IN32X, FPR16INX, i32>;
8282

8383
defvar ZfhExts = [ZfhExt, ZhinxExt];
8484
defvar ZfhminExts = [ZfhminExt, ZhinxminExt];

0 commit comments

Comments
 (0)