Skip to content

Commit 717efc0

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

File tree

2 files changed

+16
-12
lines changed

2 files changed

+16
-12
lines changed

‎llvm/lib/Target/RISCV/RISCVISelLowering.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -16007,6 +16007,7 @@ struct NodeExtensionHelper {
1600716007
case RISCVISD::VWADD_W_VL:
1600816008
case RISCVISD::VWADDU_W_VL:
1600916009
case ISD::OR:
16010+
case RISCVISD::OR_VL:
1601016011
return RISCVISD::VWADD_VL;
1601116012
case ISD::SUB:
1601216013
case RISCVISD::SUB_VL:
@@ -16030,6 +16031,7 @@ struct NodeExtensionHelper {
1603016031
case RISCVISD::VWADD_W_VL:
1603116032
case RISCVISD::VWADDU_W_VL:
1603216033
case ISD::OR:
16034+
case RISCVISD::OR_VL:
1603316035
return RISCVISD::VWADDU_VL;
1603416036
case ISD::SUB:
1603516037
case RISCVISD::SUB_VL:
@@ -16087,6 +16089,7 @@ struct NodeExtensionHelper {
1608716089
case ISD::ADD:
1608816090
case RISCVISD::ADD_VL:
1608916091
case ISD::OR:
16092+
case RISCVISD::OR_VL:
1609016093
return SupportsExt == ExtKind::SExt ? RISCVISD::VWADD_W_VL
1609116094
: RISCVISD::VWADDU_W_VL;
1609216095
case ISD::SUB:
@@ -16277,6 +16280,8 @@ struct NodeExtensionHelper {
1627716280
case RISCVISD::VFWADD_W_VL:
1627816281
case RISCVISD::VFWSUB_W_VL:
1627916282
return true;
16283+
case RISCVISD::OR_VL:
16284+
return Root->getFlags().hasDisjoint();
1628016285
case ISD::SHL:
1628116286
return Root->getValueType(0).isScalableVector() &&
1628216287
Subtarget.hasStdExtZvbb();
@@ -16362,6 +16367,7 @@ struct NodeExtensionHelper {
1636216367
case ISD::OR:
1636316368
case RISCVISD::ADD_VL:
1636416369
case RISCVISD::MUL_VL:
16370+
case RISCVISD::OR_VL:
1636516371
case RISCVISD::VWADD_W_VL:
1636616372
case RISCVISD::VWADDU_W_VL:
1636716373
case RISCVISD::FADD_VL:
@@ -16578,6 +16584,7 @@ NodeExtensionHelper::getSupportedFoldings(const SDNode *Root) {
1657816584
case ISD::OR:
1657916585
case RISCVISD::ADD_VL:
1658016586
case RISCVISD::SUB_VL:
16587+
case RISCVISD::OR_VL:
1658116588
case RISCVISD::FADD_VL:
1658216589
case RISCVISD::FSUB_VL:
1658316590
// add|sub|fadd|fsub-> vwadd(u)|vwsub(u)|vfwadd|vfwsub
@@ -16628,7 +16635,7 @@ NodeExtensionHelper::getSupportedFoldings(const SDNode *Root) {
1662816635

1662916636
/// Combine a binary or FMA operation to its equivalent VW or VW_W form.
1663016637
/// The supported combines are:
16631-
/// add | add_vl | or disjoint -> vwadd(u) | vwadd(u)_w
16638+
/// add | add_vl | or disjoint | or_vl disjoint -> vwadd(u) | vwadd(u)_w
1663216639
/// sub | sub_vl -> vwsub(u) | vwsub(u)_w
1663316640
/// mul | mul_vl -> vwmul(u) | vwmul_su
1663416641
/// shl | shl_vl -> vwsll
@@ -19464,6 +19471,7 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
1946419471
case RISCVISD::VWSUB_W_VL:
1946519472
case RISCVISD::VWSUBU_W_VL:
1946619473
return performVWADDSUBW_VLCombine(N, DCI, Subtarget);
19474+
case RISCVISD::OR_VL:
1946719475
case RISCVISD::SUB_VL:
1946819476
case RISCVISD::MUL_VL:
1946919477
return combineOp_VLToVWOp_VL(N, DCI, Subtarget);

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

+7-11
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)