Skip to content

Commit ca3ba6f

Browse files
committed
[RISCV] Avoid VMNOT by swapping VMERGE operands for mask extensions
1 parent 7b8dcda commit ca3ba6f

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8965,6 +8965,9 @@ SDValue RISCVTargetLowering::lowerVectorMaskExt(SDValue Op, SelectionDAG &DAG,
89658965
if (VecVT.isScalableVector()) {
89668966
SDValue SplatZero = DAG.getConstant(0, DL, VecVT);
89678967
SDValue SplatTrueVal = DAG.getSignedConstant(ExtTrueVal, DL, VecVT);
8968+
if (Src.getOpcode() == ISD::XOR &&
8969+
ISD::isConstantSplatVectorAllOnes(Src.getOperand(1).getNode(), false))
8970+
return DAG.getNode(ISD::VSELECT, DL, VecVT, Src.getOperand(0), SplatZero, SplatTrueVal);
89688971
return DAG.getNode(ISD::VSELECT, DL, VecVT, Src, SplatTrueVal, SplatZero);
89698972
}
89708973

@@ -8980,6 +8983,20 @@ SDValue RISCVTargetLowering::lowerVectorMaskExt(SDValue Op, SelectionDAG &DAG,
89808983
SDValue SplatZero = DAG.getConstant(0, DL, XLenVT);
89818984
SDValue SplatTrueVal = DAG.getSignedConstant(ExtTrueVal, DL, XLenVT);
89828985

8986+
if (Src.getOpcode() == ISD::EXTRACT_SUBVECTOR) {
8987+
SDValue Xor = Src.getOperand(0);
8988+
if (Xor.getOpcode() == RISCVISD::VMXOR_VL) {
8989+
SDValue ScalableOnes = Xor.getOperand(1);
8990+
if (ScalableOnes.getOpcode() == ISD::INSERT_SUBVECTOR &&
8991+
ScalableOnes.getOperand(0).isUndef() &&
8992+
ISD::isConstantSplatVectorAllOnes(
8993+
ScalableOnes.getOperand(1).getNode(), false)) {
8994+
CC = Xor.getOperand(0);
8995+
std::swap(SplatZero, SplatTrueVal);
8996+
}
8997+
}
8998+
}
8999+
89839000
SplatZero = DAG.getNode(RISCVISD::VMV_V_X_VL, DL, ContainerVT,
89849001
DAG.getUNDEF(ContainerVT), SplatZero, VL);
89859002
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
%n = xor <vscale x 8 x i1> %m, splat (i1 true)
1413
%ext = sext <vscale x 8 x i1> %n 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
%n = xor <vscale x 8 x i1> %m, splat (i1 true)
2725
%ext = zext <vscale x 8 x i1> %n 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
%n = xor <8 x i1> %m, splat (i1 true)
4037
%ext = sext <8 x i1> %n 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
%n = xor <8 x i1> %m, splat (i1 true)
5349
%ext = zext <8 x i1> %n to <8 x i8>

0 commit comments

Comments
 (0)