Skip to content

Commit 0a8341f

Browse files
authored
[RISCV] Avoid VMNOT by swapping VMERGE operands for mask extensions (llvm#126751)
Fold: (select (not m), 1, 0) -> (select m, 0, 1) (select (not m), -1, 0) -> (select m, 0, -1)
1 parent 58571c8 commit 0a8341f

File tree

2 files changed

+26
-12
lines changed

2 files changed

+26
-12
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8961,6 +8961,10 @@ SDValue RISCVTargetLowering::lowerVectorMaskExt(SDValue Op, SelectionDAG &DAG,
89618961
if (VecVT.isScalableVector()) {
89628962
SDValue SplatZero = DAG.getConstant(0, DL, VecVT);
89638963
SDValue SplatTrueVal = DAG.getSignedConstant(ExtTrueVal, DL, VecVT);
8964+
if (Src.getOpcode() == ISD::XOR &&
8965+
ISD::isConstantSplatVectorAllOnes(Src.getOperand(1).getNode()))
8966+
return DAG.getNode(ISD::VSELECT, DL, VecVT, Src.getOperand(0), SplatZero,
8967+
SplatTrueVal);
89648968
return DAG.getNode(ISD::VSELECT, DL, VecVT, Src, SplatTrueVal, SplatZero);
89658969
}
89668970

@@ -8976,6 +8980,20 @@ SDValue RISCVTargetLowering::lowerVectorMaskExt(SDValue Op, SelectionDAG &DAG,
89768980
SDValue SplatZero = DAG.getConstant(0, DL, XLenVT);
89778981
SDValue SplatTrueVal = DAG.getSignedConstant(ExtTrueVal, DL, XLenVT);
89788982

8983+
if (Src.getOpcode() == ISD::EXTRACT_SUBVECTOR) {
8984+
SDValue Xor = Src.getOperand(0);
8985+
if (Xor.getOpcode() == RISCVISD::VMXOR_VL) {
8986+
SDValue ScalableOnes = Xor.getOperand(1);
8987+
if (ScalableOnes.getOpcode() == ISD::INSERT_SUBVECTOR &&
8988+
ScalableOnes.getOperand(0).isUndef() &&
8989+
ISD::isConstantSplatVectorAllOnes(
8990+
ScalableOnes.getOperand(1).getNode())) {
8991+
CC = Xor.getOperand(0);
8992+
std::swap(SplatZero, SplatTrueVal);
8993+
}
8994+
}
8995+
}
8996+
89798997
SplatZero = DAG.getNode(RISCVISD::VMV_V_X_VL, DL, ContainerVT,
89808998
DAG.getUNDEF(ContainerVT), SplatZero, VL);
89818999
SplatTrueVal = DAG.getNode(RISCVISD::VMV_V_X_VL, DL, ContainerVT,

llvm/test/CodeGen/RISCV/rvv/mask-exts-not.ll

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ define <vscale x 8 x i8> @mask_sext_not_nxv8i8(<vscale x 8 x i1> %m) {
66
; CHECK-LABEL: mask_sext_not_nxv8i8:
77
; CHECK: # %bb.0:
88
; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma
9-
; CHECK-NEXT: vmnot.m v0, v0
10-
; CHECK-NEXT: vmv.v.i v8, 0
11-
; CHECK-NEXT: vmerge.vim v8, v8, -1, v0
9+
; CHECK-NEXT: vmv.v.i v8, -1
10+
; CHECK-NEXT: vmerge.vim v8, v8, 0, v0
1211
; CHECK-NEXT: ret
1312
%not = xor <vscale x 8 x i1> %m, splat (i1 true)
1413
%ext = sext <vscale x 8 x i1> %not to <vscale x 8 x i8>
@@ -19,9 +18,8 @@ define <vscale x 8 x i8> @mask_zext_not_nxv8i8(<vscale x 8 x i1> %m) {
1918
; CHECK-LABEL: mask_zext_not_nxv8i8:
2019
; CHECK: # %bb.0:
2120
; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma
22-
; CHECK-NEXT: vmnot.m v0, v0
23-
; CHECK-NEXT: vmv.v.i v8, 0
24-
; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
21+
; CHECK-NEXT: vmv.v.i v8, 1
22+
; CHECK-NEXT: vmerge.vim v8, v8, 0, v0
2523
; CHECK-NEXT: ret
2624
%not = xor <vscale x 8 x i1> %m, splat (i1 true)
2725
%ext = zext <vscale x 8 x i1> %not to <vscale x 8 x i8>
@@ -32,9 +30,8 @@ define <8 x i8> @mask_sext_not_v8i8(<8 x i1> %m) {
3230
; CHECK-LABEL: mask_sext_not_v8i8:
3331
; CHECK: # %bb.0:
3432
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
35-
; CHECK-NEXT: vmnot.m v0, v0
36-
; CHECK-NEXT: vmv.v.i v8, 0
37-
; CHECK-NEXT: vmerge.vim v8, v8, -1, v0
33+
; CHECK-NEXT: vmv.v.i v8, -1
34+
; CHECK-NEXT: vmerge.vim v8, v8, 0, v0
3835
; CHECK-NEXT: ret
3936
%not = xor <8 x i1> %m, splat (i1 true)
4037
%ext = sext <8 x i1> %not to <8 x i8>
@@ -45,9 +42,8 @@ define <8 x i8> @mask_zext_not_v8i8(<8 x i1> %m) {
4542
; CHECK-LABEL: mask_zext_not_v8i8:
4643
; CHECK: # %bb.0:
4744
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
48-
; CHECK-NEXT: vmnot.m v0, v0
49-
; CHECK-NEXT: vmv.v.i v8, 0
50-
; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
45+
; CHECK-NEXT: vmv.v.i v8, 1
46+
; CHECK-NEXT: vmerge.vim v8, v8, 0, v0
5147
; CHECK-NEXT: ret
5248
%not = xor <8 x i1> %m, splat (i1 true)
5349
%ext = zext <8 x i1> %not to <8 x i8>

0 commit comments

Comments
 (0)