Skip to content

Commit b20e80a

Browse files
committed
[RISCV] DAG Combine vcpop and vfirst with VL=0 to li imm
vcpop and vfirst are still useful when VL=0. vcpop equivalents to li 0 and vfirst equivalents to li -1, since no mask elements are active. Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D120302
1 parent 4e115b7 commit b20e80a

File tree

3 files changed

+31
-12
lines changed

3 files changed

+31
-12
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,6 +1031,7 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
10311031
setTargetDAGCombine(ISD::ROTL);
10321032
setTargetDAGCombine(ISD::ROTR);
10331033
setTargetDAGCombine(ISD::ANY_EXTEND);
1034+
setTargetDAGCombine(ISD::INTRINSIC_WO_CHAIN);
10341035
if (Subtarget.hasStdExtZfh())
10351036
setTargetDAGCombine(ISD::SIGN_EXTEND_INREG);
10361037
if (Subtarget.hasStdExtF()) {
@@ -8474,6 +8475,32 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
84748475

84758476
break;
84768477
}
8478+
case ISD::INTRINSIC_WO_CHAIN: {
8479+
unsigned IntNo = N->getConstantOperandVal(0);
8480+
switch (IntNo) {
8481+
// By default we do not combine any intrinsic.
8482+
default:
8483+
return SDValue();
8484+
case Intrinsic::riscv_vcpop:
8485+
case Intrinsic::riscv_vcpop_mask:
8486+
case Intrinsic::riscv_vfirst:
8487+
case Intrinsic::riscv_vfirst_mask: {
8488+
SDValue VL = N->getOperand(2);
8489+
if (IntNo == Intrinsic::riscv_vcpop_mask ||
8490+
IntNo == Intrinsic::riscv_vfirst_mask)
8491+
VL = N->getOperand(3);
8492+
if (!isNullConstant(VL))
8493+
return SDValue();
8494+
// If VL is 0, vcpop -> li 0, vfirst -> li -1.
8495+
SDLoc DL(N);
8496+
EVT VT = N->getValueType(0);
8497+
if (IntNo == Intrinsic::riscv_vfirst ||
8498+
IntNo == Intrinsic::riscv_vfirst_mask)
8499+
return DAG.getConstant(-1, DL, VT);
8500+
return DAG.getConstant(0, DL, VT);
8501+
}
8502+
}
8503+
}
84778504
}
84788505

84798506
return SDValue();

llvm/test/CodeGen/RISCV/rvv/vcpop.ll

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ entry:
2424
define iXLen @intrinsic_vcpop_m_nxv1i1_zero(<vscale x 1 x i1> %0) nounwind {
2525
; CHECK-LABEL: intrinsic_vcpop_m_nxv1i1_zero:
2626
; CHECK: # %bb.0: # %entry
27-
; CHECK-NEXT: vsetivli zero, 0, e8, mf8, ta, mu
28-
; CHECK-NEXT: vcpop.m a0, v0
27+
; CHECK-NEXT: li a0, 0
2928
; CHECK-NEXT: ret
3029
entry:
3130
%a = call iXLen @llvm.riscv.vcpop.iXLen.nxv1i1(
@@ -60,10 +59,7 @@ entry:
6059
define iXLen @intrinsic_vcpop_mask_m_nxv1i1_zero(<vscale x 1 x i1> %0, <vscale x 1 x i1> %1) nounwind {
6160
; CHECK-LABEL: intrinsic_vcpop_mask_m_nxv1i1_zero:
6261
; CHECK: # %bb.0: # %entry
63-
; CHECK-NEXT: vmv1r.v v9, v0
64-
; CHECK-NEXT: vsetivli zero, 0, e8, mf8, ta, mu
65-
; CHECK-NEXT: vmv1r.v v0, v8
66-
; CHECK-NEXT: vcpop.m a0, v9, v0.t
62+
; CHECK-NEXT: li a0, 0
6763
; CHECK-NEXT: ret
6864
entry:
6965
%a = call iXLen @llvm.riscv.vcpop.mask.iXLen.nxv1i1(

llvm/test/CodeGen/RISCV/rvv/vfirst.ll

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ entry:
2424
define iXLen @intrinsic_vfirst_m_nxv1i1_zero(<vscale x 1 x i1> %0) nounwind {
2525
; CHECK-LABEL: intrinsic_vfirst_m_nxv1i1_zero:
2626
; CHECK: # %bb.0: # %entry
27-
; CHECK-NEXT: vsetivli zero, 0, e8, mf8, ta, mu
28-
; CHECK-NEXT: vfirst.m a0, v0
27+
; CHECK-NEXT: li a0, -1
2928
; CHECK-NEXT: ret
3029
entry:
3130
%a = call iXLen @llvm.riscv.vfirst.iXLen.nxv1i1(
@@ -60,10 +59,7 @@ entry:
6059
define iXLen @intrinsic_vfirst_mask_m_nxv1i1_zero(<vscale x 1 x i1> %0, <vscale x 1 x i1> %1) nounwind {
6160
; CHECK-LABEL: intrinsic_vfirst_mask_m_nxv1i1_zero:
6261
; CHECK: # %bb.0: # %entry
63-
; CHECK-NEXT: vmv1r.v v9, v0
64-
; CHECK-NEXT: vsetivli zero, 0, e8, mf8, ta, mu
65-
; CHECK-NEXT: vmv1r.v v0, v8
66-
; CHECK-NEXT: vfirst.m a0, v9, v0.t
62+
; CHECK-NEXT: li a0, -1
6763
; CHECK-NEXT: ret
6864
entry:
6965
%a = call iXLen @llvm.riscv.vfirst.mask.iXLen.nxv1i1(

0 commit comments

Comments
 (0)