Skip to content

Commit 39714a1

Browse files
[RISCV][VLOPT] Add getOperandInfo for integer and floating point widening reductions
1 parent 8948340 commit 39714a1

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,22 @@ 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 2*EEW
715+
// 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+
if (MO.getOperandNo() == 2)
724+
return OperandInfo(
725+
RISCVVType::getEMULEqualsEEWDivSEWTimesLMUL(Log2EEW, MI), Log2EEW);
726+
return OperandInfo(Log2EEW);
727+
}
728+
713729
default:
714730
return std::nullopt;
715731
}

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: vred_vs2
1346+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
1347+
; CHECK-NEXT: %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, %x, $noreg, 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_vs1_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)