Skip to content

Commit 11693d3

Browse files
committed
[RISCV] Support disjoint RISCVISD::OR_VL in combineOp_VLToVWOp_VL
This handles combining fixed-length disjoint ors to vwadd[u].wv, as was done for scalable vectors in llvm#86929. vwadd[u].vv patterns need to be handled separately with a pattern in a separate patch due to the extends being sunk, see llvm#136716.
1 parent 1a99f79 commit 11693d3

File tree

2 files changed

+16
-12
lines changed

2 files changed

+16
-12
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16002,6 +16002,7 @@ struct NodeExtensionHelper {
1600216002
case RISCVISD::VWADD_W_VL:
1600316003
case RISCVISD::VWADDU_W_VL:
1600416004
case ISD::OR:
16005+
case RISCVISD::OR_VL:
1600516006
return RISCVISD::VWADD_VL;
1600616007
case ISD::SUB:
1600716008
case RISCVISD::SUB_VL:
@@ -16025,6 +16026,7 @@ struct NodeExtensionHelper {
1602516026
case RISCVISD::VWADD_W_VL:
1602616027
case RISCVISD::VWADDU_W_VL:
1602716028
case ISD::OR:
16029+
case RISCVISD::OR_VL:
1602816030
return RISCVISD::VWADDU_VL;
1602916031
case ISD::SUB:
1603016032
case RISCVISD::SUB_VL:
@@ -16082,6 +16084,7 @@ struct NodeExtensionHelper {
1608216084
case ISD::ADD:
1608316085
case RISCVISD::ADD_VL:
1608416086
case ISD::OR:
16087+
case RISCVISD::OR_VL:
1608516088
return SupportsExt == ExtKind::SExt ? RISCVISD::VWADD_W_VL
1608616089
: RISCVISD::VWADDU_W_VL;
1608716090
case ISD::SUB:
@@ -16272,6 +16275,8 @@ struct NodeExtensionHelper {
1627216275
case RISCVISD::VFWADD_W_VL:
1627316276
case RISCVISD::VFWSUB_W_VL:
1627416277
return true;
16278+
case RISCVISD::OR_VL:
16279+
return Root->getFlags().hasDisjoint();
1627516280
case ISD::SHL:
1627616281
return Root->getValueType(0).isScalableVector() &&
1627716282
Subtarget.hasStdExtZvbb();
@@ -16357,6 +16362,7 @@ struct NodeExtensionHelper {
1635716362
case ISD::OR:
1635816363
case RISCVISD::ADD_VL:
1635916364
case RISCVISD::MUL_VL:
16365+
case RISCVISD::OR_VL:
1636016366
case RISCVISD::VWADD_W_VL:
1636116367
case RISCVISD::VWADDU_W_VL:
1636216368
case RISCVISD::FADD_VL:
@@ -16573,6 +16579,7 @@ NodeExtensionHelper::getSupportedFoldings(const SDNode *Root) {
1657316579
case ISD::OR:
1657416580
case RISCVISD::ADD_VL:
1657516581
case RISCVISD::SUB_VL:
16582+
case RISCVISD::OR_VL:
1657616583
case RISCVISD::FADD_VL:
1657716584
case RISCVISD::FSUB_VL:
1657816585
// add|sub|fadd|fsub-> vwadd(u)|vwsub(u)|vfwadd|vfwsub
@@ -16623,7 +16630,7 @@ NodeExtensionHelper::getSupportedFoldings(const SDNode *Root) {
1662316630

1662416631
/// Combine a binary or FMA operation to its equivalent VW or VW_W form.
1662516632
/// The supported combines are:
16626-
/// add | add_vl | or disjoint -> vwadd(u) | vwadd(u)_w
16633+
/// add | add_vl | or disjoint | or_vl disjoint -> vwadd(u) | vwadd(u)_w
1662716634
/// sub | sub_vl -> vwsub(u) | vwsub(u)_w
1662816635
/// mul | mul_vl -> vwmul(u) | vwmul_su
1662916636
/// shl | shl_vl -> vwsll
@@ -19459,6 +19466,7 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
1945919466
case RISCVISD::VWSUB_W_VL:
1946019467
case RISCVISD::VWSUBU_W_VL:
1946119468
return performVWADDSUBW_VLCombine(N, DCI, Subtarget);
19469+
case RISCVISD::OR_VL:
1946219470
case RISCVISD::SUB_VL:
1946319471
case RISCVISD::MUL_VL:
1946419472
return combineOp_VLToVWOp_VL(N, DCI, Subtarget);

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vwadd.ll

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -883,11 +883,9 @@ define <4 x i32> @vwaddu_vv_disjoint_or_add(<4 x i8> %x.i8, <4 x i8> %y.i8) {
883883
; CHECK: # %bb.0:
884884
; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
885885
; CHECK-NEXT: vzext.vf2 v10, v8
886-
; CHECK-NEXT: vsll.vi v8, v10, 8
887-
; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
888-
; CHECK-NEXT: vzext.vf2 v10, v8
889-
; CHECK-NEXT: vzext.vf4 v8, v9
890-
; CHECK-NEXT: vor.vv v8, v10, v8
886+
; CHECK-NEXT: vsll.vi v10, v10, 8
887+
; CHECK-NEXT: vzext.vf2 v11, v9
888+
; CHECK-NEXT: vwaddu.vv v8, v10, v11
891889
; CHECK-NEXT: ret
892890
%x.i16 = zext <4 x i8> %x.i8 to <4 x i16>
893891
%x.shl = shl <4 x i16> %x.i16, splat (i16 8)
@@ -960,9 +958,8 @@ define <4 x i32> @vwadd_vx_disjoint_or(<4 x i16> %x.i16, i16 %y.i16) {
960958
define <4 x i32> @vwaddu_wv_disjoint_or(<4 x i32> %x.i32, <4 x i16> %y.i16) {
961959
; CHECK-LABEL: vwaddu_wv_disjoint_or:
962960
; CHECK: # %bb.0:
963-
; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
964-
; CHECK-NEXT: vzext.vf2 v10, v9
965-
; CHECK-NEXT: vor.vv v8, v8, v10
961+
; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
962+
; CHECK-NEXT: vwaddu.wv v8, v8, v9
966963
; CHECK-NEXT: ret
967964
%y.i32 = zext <4 x i16> %y.i16 to <4 x i32>
968965
%or = or disjoint <4 x i32> %x.i32, %y.i32
@@ -972,9 +969,8 @@ define <4 x i32> @vwaddu_wv_disjoint_or(<4 x i32> %x.i32, <4 x i16> %y.i16) {
972969
define <4 x i32> @vwadd_wv_disjoint_or(<4 x i32> %x.i32, <4 x i16> %y.i16) {
973970
; CHECK-LABEL: vwadd_wv_disjoint_or:
974971
; CHECK: # %bb.0:
975-
; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
976-
; CHECK-NEXT: vsext.vf2 v10, v9
977-
; CHECK-NEXT: vor.vv v8, v8, v10
972+
; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
973+
; CHECK-NEXT: vwadd.wv v8, v8, v9
978974
; CHECK-NEXT: ret
979975
%y.i32 = sext <4 x i16> %y.i16 to <4 x i32>
980976
%or = or disjoint <4 x i32> %x.i32, %y.i32

0 commit comments

Comments
 (0)