Skip to content

Commit f77a7dd

Browse files
[RISCV][VLOPT] Add getOperandInfo for integer and floating point widening reductions (#122176)
1 parent c85d516 commit f77a7dd

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,19 @@ getOperandLog2EEW(const MachineOperand &MO, const MachineRegisterInfo *MRI) {
710710
return MILog2SEW;
711711
}
712712

713+
// Vector Widening Integer Reduction Instructions
714+
// The Dest and VS1 read only element 0 for the vector register. Return
715+
// 2*EEW for these. VS2 has EEW=SEW and EMUL=LMUL.
716+
case RISCV::VWREDSUM_VS:
717+
case RISCV::VWREDSUMU_VS:
718+
// Vector Widening Floating-Point Reduction Instructions
719+
case RISCV::VFWREDOSUM_VS:
720+
case RISCV::VFWREDUSUM_VS: {
721+
bool TwoTimes = IsMODef || MO.getOperandNo() == 3;
722+
unsigned Log2EEW = TwoTimes ? MILog2SEW + 1 : MILog2SEW;
723+
return Log2EEW;
724+
}
725+
713726
default:
714727
return std::nullopt;
715728
}
@@ -729,6 +742,8 @@ getOperandInfo(const MachineOperand &MO, const MachineRegisterInfo *MRI) {
729742
switch (RVV->BaseInstr) {
730743
// Vector Reduction Operations
731744
// Vector Single-Width Integer Reduction Instructions
745+
// Vector Widening Integer Reduction Instructions
746+
// Vector Widening Floating-Point Reduction Instructions
732747
// The Dest and VS1 only read element 0 of the vector register. Return just
733748
// the EEW for these.
734749
case RISCV::VREDAND_VS:
@@ -739,6 +754,10 @@ getOperandInfo(const MachineOperand &MO, const MachineRegisterInfo *MRI) {
739754
case RISCV::VREDOR_VS:
740755
case RISCV::VREDSUM_VS:
741756
case RISCV::VREDXOR_VS:
757+
case RISCV::VWREDSUM_VS:
758+
case RISCV::VWREDSUMU_VS:
759+
case RISCV::VFWREDOSUM_VS:
760+
case RISCV::VFWREDUSUM_VS:
742761
if (MO.getOperandNo() != 2)
743762
return OperandInfo(*Log2EEW);
744763
break;

llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.mir

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1224,6 +1224,7 @@ body: |
12241224
%x:vr = PseudoVMAND_MM_B1 $noreg, $noreg, -1, 0
12251225
%y:vr = PseudoVIOTA_M_MF2 $noreg, %x, 1, 3 /* e8 */, 0
12261226
...
1227+
---
12271228
name: vred_vs2
12281229
body: |
12291230
bb.0:
@@ -1337,3 +1338,53 @@ body: |
13371338
%y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0
13381339
%z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 2, 3 /* e8 */, 0
13391340
...
1341+
---
1342+
name: vwred_vs2
1343+
body: |
1344+
bb.0:
1345+
; CHECK-LABEL: name: vwred_vs2
1346+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */
1347+
; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */
1348+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0
1349+
%y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0
1350+
...
1351+
---
1352+
name: vwred_vs1
1353+
body: |
1354+
bb.0:
1355+
; CHECK-LABEL: name: vwred_vs1
1356+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
1357+
; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
1358+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
1359+
%y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0
1360+
...
1361+
---
1362+
name: vwred_vs1_incompatible_eew
1363+
body: |
1364+
bb.0:
1365+
; CHECK-LABEL: name: vwred_vs1_incompatible_eew
1366+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */
1367+
; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
1368+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0
1369+
%y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0
1370+
...
1371+
---
1372+
name: vwred_vs2_incompatible_eew
1373+
body: |
1374+
bb.0:
1375+
; CHECK-LABEL: name: vwred_vs2_incompatible_eew
1376+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
1377+
; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */
1378+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
1379+
%y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0
1380+
...
1381+
---
1382+
name: vwred_incompatible_emul
1383+
body: |
1384+
bb.0:
1385+
; CHECK-LABEL: name: vwred_incompatible_emul
1386+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
1387+
; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_MF2_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
1388+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
1389+
%y:vr = PseudoVWREDSUM_VS_MF2_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0
1390+
...

0 commit comments

Comments
 (0)