[llvm] [RISCV] Use a DAG combine to prune pointless vrgather.vi (PR #135392)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 11 08:49:47 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-risc-v
Author: Philip Reames (preames)
<details>
<summary>Changes</summary>
If the vrgather.vi is preceeded by a vmv.v.x which writes a superset of the lanes writen by the vrgather, and the vrgather has no passthru, then the vrgather has no semantic effect.
This is the start of a mini-series of patches around rewriting vrgather.vi/vx preceeded by vmv.v.x, vfmf.v.f, vmv.s.x, etc... Starting with the simplest, but also lowest impact.
One point I'd like a second oppinion on is the out of bounds semenatic change. As far as I can tell, all the indices are in bounds by construction. The doc change is as much as I couldn't figure out how to test the alternative as anything else.
---
Full diff: https://github.com/llvm/llvm-project/pull/135392.diff
3 Files Affected:
- (modified) llvm/lib/Target/RISCV/RISCVISelLowering.cpp (+13)
- (modified) llvm/lib/Target/RISCV/RISCVISelLowering.h (+2-1)
- (modified) llvm/test/CodeGen/RISCV/rvv/fixed-vectors-shuffle-int.ll (+2-3)
``````````diff
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index fef9084bd0e73..e5843477e04e5 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -19709,6 +19709,19 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
if (SDValue V = combineToVCPOP(N, DAG, Subtarget))
return V;
break;
+ case RISCVISD::VRGATHER_VX_VL: {
+ // Drop a redundant vrgather_vx.
+ // Note this assumes that out of bounds indices produce poison
+ // and can thus be replaced without having to prove them inbounds..
+ SDValue Src = N->getOperand(0);
+ SDValue Passthru = N->getOperand(2);
+ SDValue VL = N->getOperand(4);
+ // TODO: Handle fmv.v.f?
+ if (Src.getOpcode() == RISCVISD::VMV_V_X_VL && Passthru.isUndef() &&
+ VL == Src.getOperand(2))
+ return Src;
+ break;
+ }
}
return SDValue();
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.h b/llvm/lib/Target/RISCV/RISCVISelLowering.h
index 5ebdbbd51f2b1..d624ee33d6a63 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.h
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.h
@@ -388,7 +388,8 @@ enum NodeType : unsigned {
VMSET_VL,
// Matches the semantics of vrgather.vx and vrgather.vv with extra operands
- // for passthru and VL. Operands are (src, index, mask, passthru, vl).
+ // for passthru and VL, except that out of bound indices result in a poison
+ // result not zero. Operands are (src, index, mask, passthru, vl).
VRGATHER_VX_VL,
VRGATHER_VV_VL,
VRGATHEREI16_VV_VL,
diff --git a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-shuffle-int.ll b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-shuffle-int.ll
index e6375e276d37f..185b8b6d03134 100644
--- a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-shuffle-int.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-shuffle-int.ll
@@ -1346,10 +1346,9 @@ define <4 x i16> @vmerge_2(<4 x i16> %x) {
define <4 x i16> @vmerge_3(<4 x i16> %x) {
; CHECK-LABEL: vmerge_3:
; CHECK: # %bb.0:
-; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, mu
+; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
; CHECK-NEXT: vmv.v.i v0, 6
-; CHECK-NEXT: vmv.v.i v9, 5
-; CHECK-NEXT: vrgather.vi v8, v9, 1, v0.t
+; CHECK-NEXT: vmerge.vim v8, v8, 5, v0
; CHECK-NEXT: ret
%s = shufflevector <4 x i16> %x, <4 x i16> <i16 poison, i16 5, i16 poison, i16 poison>, <4 x i32> <i32 0, i32 5, i32 5, i32 3>
ret <4 x i16> %s
``````````
</details>
https://github.com/llvm/llvm-project/pull/135392
More information about the llvm-commits
mailing list