Skip to content

Commit 0eb2f66

Browse files
[RISCV][CodeGen] Account for LMUL for Vector Integer Arithmetic Instructions
It is likley that subtargets act differently for a vector integer arithmetic instruction based on the LMUL. This patch creates seperate SchedRead, SchedWrite, WriteRes, ReadAdvance for each relevant LMUL. It also introduces the concept of an "UpperBound LMUL" which allows us to describe how an instruction should behave when the LMUL is unknown. All base instructions use the UpperBound resources because they are not tied to a specific LMUL. This gives subtargetes the flexibility to describe their own upper bounds on each vector instruction. I have a series of patches for the rest of the vector instruction set ready to go, but I would like to first get feedback on the first one of the series (this one). Differential Revision: https://reviews.llvm.org/D136730
1 parent e7deca5 commit 0eb2f66

File tree

3 files changed

+750
-401
lines changed

3 files changed

+750
-401
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoV.td

Lines changed: 96 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -402,97 +402,124 @@ multiclass VIndexLoadStore<list<int> EEWList> {
402402

403403
multiclass VALU_IV_V_X_I<string opcodestr, bits<6> funct6, Operand optype = simm5, string vw = "v"> {
404404
def V : VALUVV<funct6, OPIVV, opcodestr # "." # vw # "v">,
405-
Sched<[WriteVIALUV, ReadVIALUV, ReadVIALUV, ReadVMask]>;
405+
Sched<[WriteVIALUV_UpperBound, ReadVIALUV_UpperBound,
406+
ReadVIALUV_UpperBound, ReadVMask]>;
406407
def X : VALUVX<funct6, OPIVX, opcodestr # "." # vw # "x">,
407-
Sched<[WriteVIALUX, ReadVIALUV, ReadVIALUX, ReadVMask]>;
408+
Sched<[WriteVIALUX_UpperBound, ReadVIALUV_UpperBound,
409+
ReadVIALUX_UpperBound, ReadVMask]>;
408410
def I : VALUVI<funct6, opcodestr # "." # vw # "i", optype>,
409-
Sched<[WriteVIALUI, ReadVIALUV, ReadVMask]>;
411+
Sched<[WriteVIALUI_UpperBound, ReadVIALUV_UpperBound,
412+
ReadVMask]>;
410413
}
411414

412415
multiclass VALU_IV_V_X<string opcodestr, bits<6> funct6, string vw = "v"> {
413416
def V : VALUVV<funct6, OPIVV, opcodestr # "." # vw # "v">,
414-
Sched<[WriteVIALUV, ReadVIALUV, ReadVIALUV, ReadVMask]>;
417+
Sched<[WriteVIALUV_UpperBound, ReadVIALUV_UpperBound,
418+
ReadVIALUV_UpperBound, ReadVMask]>;
415419
def X : VALUVX<funct6, OPIVX, opcodestr # "." # vw # "x">,
416-
Sched<[WriteVIALUX, ReadVIALUV, ReadVIALUX, ReadVMask]>;
420+
Sched<[WriteVIALUX_UpperBound, ReadVIALUV_UpperBound,
421+
ReadVIALUX_UpperBound, ReadVMask]>;
417422
}
418423

419424
multiclass VALU_IV_X_I<string opcodestr, bits<6> funct6, Operand optype = simm5, string vw = "v"> {
420425
def X : VALUVX<funct6, OPIVX, opcodestr # "." # vw # "x">,
421-
Sched<[WriteVIALUV, ReadVIALUV, ReadVIALUX, ReadVMask]>;
426+
Sched<[WriteVIALUV_UpperBound, ReadVIALUV_UpperBound,
427+
ReadVIALUX_UpperBound, ReadVMask]>;
422428
def I : VALUVI<funct6, opcodestr # "." # vw # "i", optype>,
423-
Sched<[WriteVIALUI, ReadVIALUV, ReadVMask]>;
429+
Sched<[WriteVIALUI_UpperBound, ReadVIALUV_UpperBound,
430+
ReadVMask]>;
424431
}
425432

426433
multiclass VALU_MV_V_X<string opcodestr, bits<6> funct6, string vw = "v"> {
427434
def V : VALUVV<funct6, OPMVV, opcodestr # "." # vw # "v">,
428-
Sched<[WriteVIWALUV, ReadVIWALUV, ReadVIWALUV, ReadVMask]>;
435+
Sched<[WriteVIWALUV_UpperBound, ReadVIWALUV_UpperBound,
436+
ReadVIWALUV_UpperBound, ReadVMask]>;
429437
def X : VALUVX<funct6, OPMVX, opcodestr # "." # vw # "x">,
430-
Sched<[WriteVIWALUX, ReadVIWALUV, ReadVIWALUX, ReadVMask]>;
438+
Sched<[WriteVIWALUX_UpperBound, ReadVIWALUV_UpperBound,
439+
ReadVIWALUX_UpperBound, ReadVMask]>;
431440
}
432441

433442
multiclass VMAC_MV_V_X<string opcodestr, bits<6> funct6, string vw = "v"> {
434443
def V : VALUrVV<funct6, OPMVV, opcodestr # "." # vw # "v">,
435-
Sched<[WriteVIMulAddV, ReadVIMulAddV, ReadVIMulAddV, ReadVMask]>;
444+
Sched<[WriteVIMulAddV_UpperBound, ReadVIMulAddV_UpperBound,
445+
ReadVIMulAddV_UpperBound, ReadVMask]>;
436446
def X : VALUrVX<funct6, OPMVX, opcodestr # "." # vw # "x">,
437-
Sched<[WriteVIMulAddX, ReadVIMulAddV, ReadVIMulAddX, ReadVMask]>;
447+
Sched<[WriteVIMulAddX_UpperBound, ReadVIMulAddV_UpperBound,
448+
ReadVIMulAddX_UpperBound, ReadVMask]>;
438449
}
439450

440451
multiclass VWMAC_MV_V_X<string opcodestr, bits<6> funct6, string vw = "v"> {
441452
def V : VALUrVV<funct6, OPMVV, opcodestr # "." # vw # "v">,
442-
Sched<[WriteVIWMulAddV, ReadVIWMulAddV, ReadVIWMulAddV, ReadVMask]>;
453+
Sched<[WriteVIWMulAddV_UpperBound, ReadVIWMulAddV_UpperBound,
454+
ReadVIWMulAddV_UpperBound, ReadVMask]>;
443455
def X : VALUrVX<funct6, OPMVX, opcodestr # "." # vw # "x">,
444-
Sched<[WriteVIWMulAddX, ReadVIWMulAddV, ReadVIWMulAddX, ReadVMask]>;
456+
Sched<[WriteVIWMulAddX_UpperBound, ReadVIWMulAddV_UpperBound,
457+
ReadVIWMulAddX_UpperBound, ReadVMask]>;
445458
}
446459

447460
multiclass VWMAC_MV_X<string opcodestr, bits<6> funct6, string vw = "v"> {
448461
def X : VALUrVX<funct6, OPMVX, opcodestr # "." # vw # "x">,
449-
Sched<[WriteVIWMulAddX, ReadVIWMulAddV, ReadVIWMulAddX, ReadVMask]>;
462+
Sched<[WriteVIWMulAddX_UpperBound, ReadVIWMulAddV_UpperBound,
463+
ReadVIWMulAddX_UpperBound, ReadVMask]>;
450464
}
451465

452466
multiclass VALU_MV_VS2<string opcodestr, bits<6> funct6, bits<5> vs1> {
453467
def "" : VALUVs2<funct6, vs1, OPMVV, opcodestr>,
454-
Sched<[WriteVExtV, ReadVExtV, ReadVMask]>;
468+
Sched<[WriteVExtV_UpperBound, ReadVExtV_UpperBound,
469+
ReadVMask]>;
455470
}
456471

457472
multiclass VALUm_IV_V_X_I<string opcodestr, bits<6> funct6> {
458473
def VM : VALUmVV<funct6, OPIVV, opcodestr # ".vvm">,
459-
Sched<[WriteVICALUV, ReadVICALUV, ReadVICALUV, ReadVMask]>;
474+
Sched<[WriteVICALUV_UpperBound, ReadVICALUV_UpperBound,
475+
ReadVICALUV_UpperBound, ReadVMask]>;
460476
def XM : VALUmVX<funct6, OPIVX, opcodestr # ".vxm">,
461-
Sched<[WriteVICALUX, ReadVICALUV, ReadVICALUX, ReadVMask]>;
477+
Sched<[WriteVICALUX_UpperBound, ReadVICALUV_UpperBound,
478+
ReadVICALUX_UpperBound, ReadVMask]>;
462479
def IM : VALUmVI<funct6, opcodestr # ".vim">,
463-
Sched<[WriteVICALUI, ReadVICALUV, ReadVMask]>;
480+
Sched<[WriteVICALUI_UpperBound, ReadVICALUV_UpperBound,
481+
ReadVMask]>;
464482
}
465483

466484
multiclass VMRG_IV_V_X_I<string opcodestr, bits<6> funct6> {
467485
def VM : VALUmVV<funct6, OPIVV, opcodestr # ".vvm">,
468-
Sched<[WriteVIMergeV, ReadVIMergeV, ReadVIMergeV, ReadVMask]>;
486+
Sched<[WriteVIMergeV_UpperBound, ReadVIMergeV_UpperBound,
487+
ReadVIMergeV_UpperBound, ReadVMask]>;
469488
def XM : VALUmVX<funct6, OPIVX, opcodestr # ".vxm">,
470-
Sched<[WriteVIMergeX, ReadVIMergeV, ReadVIMergeX, ReadVMask]>;
489+
Sched<[WriteVIMergeX_UpperBound, ReadVIMergeV_UpperBound,
490+
ReadVIMergeX_UpperBound, ReadVMask]>;
471491
def IM : VALUmVI<funct6, opcodestr # ".vim">,
472-
Sched<[WriteVIMergeI, ReadVIMergeV, ReadVMask]>;
492+
Sched<[WriteVIMergeI_UpperBound, ReadVIMergeV_UpperBound,
493+
ReadVMask]>;
473494
}
474495

475496
multiclass VALUm_IV_V_X<string opcodestr, bits<6> funct6> {
476497
def VM : VALUmVV<funct6, OPIVV, opcodestr # ".vvm">,
477-
Sched<[WriteVICALUV, ReadVICALUV, ReadVICALUV, ReadVMask]>;
498+
Sched<[WriteVICALUV_UpperBound, ReadVICALUV_UpperBound,
499+
ReadVICALUV_UpperBound, ReadVMask]>;
478500
def XM : VALUmVX<funct6, OPIVX, opcodestr # ".vxm">,
479-
Sched<[WriteVICALUX, ReadVICALUV, ReadVICALUX, ReadVMask]>;
501+
Sched<[WriteVICALUX_UpperBound, ReadVICALUV_UpperBound,
502+
ReadVICALUX_UpperBound, ReadVMask]>;
480503
}
481504

482505
multiclass VALUNoVm_IV_V_X_I<string opcodestr, bits<6> funct6, Operand optype = simm5> {
483506
def V : VALUVVNoVm<funct6, OPIVV, opcodestr # ".vv">,
484-
Sched<[WriteVICALUV, ReadVICALUV, ReadVICALUV]>;
507+
Sched<[WriteVICALUV_UpperBound, ReadVICALUV_UpperBound,
508+
ReadVICALUV_UpperBound]>;
485509
def X : VALUVXNoVm<funct6, OPIVX, opcodestr # ".vx">,
486-
Sched<[WriteVICALUX, ReadVICALUV, ReadVICALUX]>;
510+
Sched<[WriteVICALUX_UpperBound, ReadVICALUV_UpperBound
511+
, ReadVICALUX_UpperBound]>;
487512
def I : VALUVINoVm<funct6, opcodestr # ".vi", optype>,
488-
Sched<[WriteVICALUI, ReadVICALUV]>;
513+
Sched<[WriteVICALUI_UpperBound, ReadVICALUV_UpperBound]>;
489514
}
490515

491516
multiclass VALUNoVm_IV_V_X<string opcodestr, bits<6> funct6> {
492517
def V : VALUVVNoVm<funct6, OPIVV, opcodestr # ".vv">,
493-
Sched<[WriteVICALUV, ReadVICALUV, ReadVICALUV]>;
518+
Sched<[WriteVICALUV_UpperBound, ReadVICALUV_UpperBound,
519+
ReadVICALUV_UpperBound]>;
494520
def X : VALUVXNoVm<funct6, OPIVX, opcodestr # ".vx">,
495-
Sched<[WriteVICALUX, ReadVICALUV, ReadVICALUX]>;
521+
Sched<[WriteVICALUX_UpperBound, ReadVICALUV_UpperBound,
522+
ReadVICALUX_UpperBound]>;
496523
}
497524

498525
multiclass VALU_FV_V_F<string opcodestr, bits<6> funct6, string vw = "v"> {
@@ -675,64 +702,83 @@ multiclass VMIOT_MV_V<string opcodestr, bits<6> funct6, bits<5> vs1> {
675702

676703
multiclass VSHT_IV_V_X_I<string opcodestr, bits<6> funct6, Operand optype = simm5, string vw = "v"> {
677704
def V : VALUVV<funct6, OPIVV, opcodestr # "." # vw # "v">,
678-
Sched<[WriteVShiftV, ReadVShiftV, ReadVShiftV, ReadVMask]>;
705+
Sched<[WriteVShiftV_UpperBound, ReadVShiftV_UpperBound,
706+
ReadVShiftV_UpperBound, ReadVMask]>;
679707
def X : VALUVX<funct6, OPIVX, opcodestr # "." # vw # "x">,
680-
Sched<[WriteVShiftX, ReadVShiftV, ReadVShiftX, ReadVMask]>;
708+
Sched<[WriteVShiftX_UpperBound, ReadVShiftV_UpperBound,
709+
ReadVShiftX_UpperBound, ReadVMask]>;
681710
def I : VALUVI<funct6, opcodestr # "." # vw # "i", optype>,
682-
Sched<[WriteVShiftI, ReadVShiftV, ReadVMask]>;
711+
Sched<[WriteVShiftI_UpperBound, ReadVShiftV_UpperBound,
712+
ReadVMask]>;
683713
}
684714

685715
multiclass VNSHT_IV_V_X_I<string opcodestr, bits<6> funct6, Operand optype = simm5, string vw = "v"> {
686716
def V : VALUVV<funct6, OPIVV, opcodestr # "." # vw # "v">,
687-
Sched<[WriteVNShiftV, ReadVNShiftV, ReadVNShiftV, ReadVMask]>;
717+
Sched<[WriteVNShiftV_UpperBound, ReadVNShiftV_UpperBound,
718+
ReadVNShiftV_UpperBound, ReadVMask]>;
688719
def X : VALUVX<funct6, OPIVX, opcodestr # "." # vw # "x">,
689-
Sched<[WriteVNShiftX, ReadVNShiftV, ReadVNShiftX, ReadVMask]>;
720+
Sched<[WriteVNShiftX_UpperBound, ReadVNShiftV_UpperBound,
721+
ReadVNShiftX_UpperBound, ReadVMask]>;
690722
def I : VALUVI<funct6, opcodestr # "." # vw # "i", optype>,
691-
Sched<[WriteVNShiftI, ReadVNShiftV, ReadVMask]>;
723+
Sched<[WriteVNShiftI_UpperBound, ReadVNShiftV_UpperBound,
724+
ReadVMask]>;
692725
}
693726

694727
multiclass VCMP_IV_V_X_I<string opcodestr, bits<6> funct6, Operand optype = simm5, string vw = "v"> {
695728
def V : VALUVV<funct6, OPIVV, opcodestr # "." # vw # "v">,
696-
Sched<[WriteVICmpV, ReadVICmpV, ReadVICmpV, ReadVMask]>;
729+
Sched<[WriteVICmpV_UpperBound, ReadVICmpV_UpperBound,
730+
ReadVICmpV_UpperBound, ReadVMask]>;
697731
def X : VALUVX<funct6, OPIVX, opcodestr # "." # vw # "x">,
698-
Sched<[WriteVICmpX, ReadVICmpV, ReadVICmpX, ReadVMask]>;
732+
Sched<[WriteVICmpX_UpperBound, ReadVICmpV_UpperBound,
733+
ReadVICmpX_UpperBound, ReadVMask]>;
699734
def I : VALUVI<funct6, opcodestr # "." # vw # "i", optype>,
700-
Sched<[WriteVICmpI, ReadVICmpV, ReadVMask]>;
735+
Sched<[WriteVICmpI_UpperBound, ReadVICmpV_UpperBound,
736+
ReadVMask]>;
701737
}
702738

703739
multiclass VCMP_IV_X_I<string opcodestr, bits<6> funct6, Operand optype = simm5, string vw = "v"> {
704740
def X : VALUVX<funct6, OPIVX, opcodestr # "." # vw # "x">,
705-
Sched<[WriteVICmpV, ReadVICmpV, ReadVICmpX, ReadVMask]>;
741+
Sched<[WriteVICmpV_UpperBound, ReadVICmpV_UpperBound,
742+
ReadVICmpX_UpperBound, ReadVMask]>;
706743
def I : VALUVI<funct6, opcodestr # "." # vw # "i", optype>,
707-
Sched<[WriteVICmpI, ReadVICmpV, ReadVMask]>;
744+
Sched<[WriteVICmpI_UpperBound, ReadVICmpV_UpperBound,
745+
ReadVMask]>;
708746
}
709747

710748
multiclass VCMP_IV_V_X<string opcodestr, bits<6> funct6, string vw = "v"> {
711749
def V : VALUVV<funct6, OPIVV, opcodestr # "." # vw # "v">,
712-
Sched<[WriteVICmpV, ReadVICmpV, ReadVICmpV, ReadVMask]>;
750+
Sched<[WriteVICmpV_UpperBound, ReadVICmpV_UpperBound,
751+
ReadVICmpV_UpperBound, ReadVMask]>;
713752
def X : VALUVX<funct6, OPIVX, opcodestr # "." # vw # "x">,
714-
Sched<[WriteVICmpX, ReadVICmpV, ReadVICmpX, ReadVMask]>;
753+
Sched<[WriteVICmpX_UpperBound, ReadVICmpV_UpperBound,
754+
ReadVICmpX_UpperBound, ReadVMask]>;
715755
}
716756

717757
multiclass VMUL_MV_V_X<string opcodestr, bits<6> funct6, string vw = "v"> {
718758
def V : VALUVV<funct6, OPMVV, opcodestr # "." # vw # "v">,
719-
Sched<[WriteVIMulV, ReadVIMulV, ReadVIMulV, ReadVMask]>;
759+
Sched<[WriteVIMulV_UpperBound, ReadVIMulV_UpperBound,
760+
ReadVIMulV_UpperBound, ReadVMask]>;
720761
def X : VALUVX<funct6, OPMVX, opcodestr # "." # vw # "x">,
721-
Sched<[WriteVIMulX, ReadVIMulV, ReadVIMulX, ReadVMask]>;
762+
Sched<[WriteVIMulX_UpperBound, ReadVIMulV_UpperBound,
763+
ReadVIMulX_UpperBound, ReadVMask]>;
722764
}
723765

724766
multiclass VWMUL_MV_V_X<string opcodestr, bits<6> funct6, string vw = "v"> {
725767
def V : VALUVV<funct6, OPMVV, opcodestr # "." # vw # "v">,
726-
Sched<[WriteVIWMulV, ReadVIWMulV, ReadVIWMulV, ReadVMask]>;
768+
Sched<[WriteVIWMulV_UpperBound, ReadVIWMulV_UpperBound,
769+
ReadVIWMulV_UpperBound, ReadVMask]>;
727770
def X : VALUVX<funct6, OPMVX, opcodestr # "." # vw # "x">,
728-
Sched<[WriteVIWMulX, ReadVIWMulV, ReadVIWMulX, ReadVMask]>;
771+
Sched<[WriteVIWMulX_UpperBound, ReadVIWMulV_UpperBound,
772+
ReadVIWMulX_UpperBound, ReadVMask]>;
729773
}
730774

731775
multiclass VDIV_MV_V_X<string opcodestr, bits<6> funct6, string vw = "v"> {
732776
def V : VALUVV<funct6, OPMVV, opcodestr # "." # vw # "v">,
733-
Sched<[WriteVIDivV, ReadVIDivV, ReadVIDivV, ReadVMask]>;
777+
Sched<[WriteVIDivV_UpperBound, ReadVIDivV_UpperBound,
778+
ReadVIDivV_UpperBound, ReadVMask]>;
734779
def X : VALUVX<funct6, OPMVX, opcodestr # "." # vw # "x">,
735-
Sched<[WriteVIDivX, ReadVIDivV, ReadVIDivX, ReadVMask]>;
780+
Sched<[WriteVIDivX_UpperBound, ReadVIDivV_UpperBound,
781+
ReadVIDivX_UpperBound, ReadVMask]>;
736782
}
737783

738784
multiclass VSALU_IV_V_X_I<string opcodestr, bits<6> funct6, Operand optype = simm5, string vw = "v"> {
@@ -1126,15 +1172,15 @@ let hasSideEffects = 0, mayLoad = 0, mayStore = 0, vs2 = 0, vm = 1,
11261172
// op vd, vs1
11271173
def VMV_V_V : RVInstVV<0b010111, OPIVV, (outs VR:$vd),
11281174
(ins VR:$vs1), "vmv.v.v", "$vd, $vs1">,
1129-
Sched<[WriteVIMovV, ReadVIMovV]>;
1175+
Sched<[WriteVIMovV_UpperBound, ReadVIMovV_UpperBound]>;
11301176
// op vd, rs1
11311177
def VMV_V_X : RVInstVX<0b010111, OPIVX, (outs VR:$vd),
11321178
(ins GPR:$rs1), "vmv.v.x", "$vd, $rs1">,
1133-
Sched<[WriteVIMovX, ReadVIMovX]>;
1179+
Sched<[WriteVIMovX_UpperBound, ReadVIMovX_UpperBound]>;
11341180
// op vd, imm
11351181
def VMV_V_I : RVInstIVI<0b010111, (outs VR:$vd),
11361182
(ins simm5:$imm), "vmv.v.i", "$vd, $imm">,
1137-
Sched<[WriteVIMovI]>;
1183+
Sched<[WriteVIMovI_UpperBound]>;
11381184
} // hasSideEffects = 0, mayLoad = 0, mayStore = 0
11391185

11401186
// Vector Fixed-Point Arithmetic Instructions

0 commit comments

Comments
 (0)