Skip to content

Commit 2524146

Browse files
authored
[RISCV] Add DAG combine for (vmv_s_x_vl (undef) (vmv_x_s X). (#90524)
We can use the original vector as long as the type of X matches the result type of the vmv_s_x_vl.
1 parent 6b961e2 commit 2524146

File tree

4 files changed

+23
-31
lines changed

4 files changed

+23
-31
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16791,6 +16791,10 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
1679116791
SDValue Scalar = N->getOperand(1);
1679216792
SDValue VL = N->getOperand(2);
1679316793

16794+
if (Scalar.getOpcode() == RISCVISD::VMV_X_S && Passthru.isUndef() &&
16795+
Scalar.getOperand(0).getValueType() == N->getValueType(0))
16796+
return Scalar.getOperand(0);
16797+
1679416798
// Use M1 or smaller to avoid over constraining register allocation
1679516799
const MVT M1VT = getLMUL1VT(VT);
1679616800
if (M1VT.bitsLT(VT)) {

llvm/test/CodeGen/RISCV/rvv/fixed-vector-i8-index-cornercase.ll

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,13 @@ define <512 x i8> @single_source(<512 x i8> %a) {
2626
; CHECK-NEXT: vmv.v.x v8, a1
2727
; CHECK-NEXT: vslide1down.vx v8, v8, a0
2828
; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
29-
; CHECK-NEXT: vslidedown.vi v17, v16, 5
30-
; CHECK-NEXT: vmv.x.s a0, v17
31-
; CHECK-NEXT: vmv.s.x v24, a0
29+
; CHECK-NEXT: vslidedown.vi v24, v16, 5
3230
; CHECK-NEXT: li a0, 432
3331
; CHECK-NEXT: li a1, 431
3432
; CHECK-NEXT: vsetvli zero, a0, e8, m8, tu, ma
3533
; CHECK-NEXT: vslideup.vx v8, v24, a1
3634
; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
3735
; CHECK-NEXT: vslidedown.vi v16, v16, 4
38-
; CHECK-NEXT: vmv.x.s a0, v16
39-
; CHECK-NEXT: vmv.s.x v16, a0
4036
; CHECK-NEXT: li a0, 466
4137
; CHECK-NEXT: li a1, 465
4238
; CHECK-NEXT: vsetvli zero, a0, e8, m8, tu, ma
@@ -109,30 +105,27 @@ define <512 x i8> @two_source(<512 x i8> %a, <512 x i8> %b) {
109105
; CHECK-NEXT: addi a1, sp, 512
110106
; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma
111107
; CHECK-NEXT: vse8.v v8, (a1)
108+
; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
109+
; CHECK-NEXT: vslidedown.vi v0, v24, 5
112110
; CHECK-NEXT: vmv.x.s a1, v24
111+
; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma
113112
; CHECK-NEXT: vmv.v.x v8, a1
114-
; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
115-
; CHECK-NEXT: vslidedown.vi v25, v24, 5
116-
; CHECK-NEXT: vmv.x.s a1, v25
117-
; CHECK-NEXT: vmv.s.x v0, a1
118113
; CHECK-NEXT: li a1, 432
119114
; CHECK-NEXT: li a2, 431
120115
; CHECK-NEXT: vsetvli zero, a1, e8, m8, tu, ma
121116
; CHECK-NEXT: vslideup.vx v8, v0, a2
122117
; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
123118
; CHECK-NEXT: vslidedown.vi v24, v24, 4
124-
; CHECK-NEXT: vmv.x.s a1, v24
125-
; CHECK-NEXT: vmv.s.x v24, a1
126119
; CHECK-NEXT: li a1, 466
127120
; CHECK-NEXT: li a2, 465
128121
; CHECK-NEXT: vsetvli zero, a1, e8, m8, tu, ma
129122
; CHECK-NEXT: lbu a1, 985(sp)
130123
; CHECK-NEXT: vslideup.vx v8, v24, a2
131124
; CHECK-NEXT: vmv.s.x v24, a1
132125
; CHECK-NEXT: li a1, 478
126+
; CHECK-NEXT: li a2, 477
133127
; CHECK-NEXT: vsetvli zero, a1, e8, m8, tu, ma
134128
; CHECK-NEXT: lbu a1, 1012(sp)
135-
; CHECK-NEXT: li a2, 477
136129
; CHECK-NEXT: vslideup.vx v8, v24, a2
137130
; CHECK-NEXT: vmv.s.x v24, a1
138131
; CHECK-NEXT: li a1, 501

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-reduction-int-vp.ll

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -802,27 +802,25 @@ define signext i32 @vpreduce_xor_v64i32(i32 signext %s, <64 x i32> %v, <64 x i1>
802802
; CHECK-LABEL: vpreduce_xor_v64i32:
803803
; CHECK: # %bb.0:
804804
; CHECK-NEXT: vsetivli zero, 4, e8, mf2, ta, ma
805+
; CHECK-NEXT: li a3, 32
805806
; CHECK-NEXT: vslidedown.vi v24, v0, 4
806-
; CHECK-NEXT: addi a2, a1, -32
807-
; CHECK-NEXT: sltu a3, a1, a2
808-
; CHECK-NEXT: addi a3, a3, -1
809-
; CHECK-NEXT: li a4, 32
810-
; CHECK-NEXT: and a2, a3, a2
811-
; CHECK-NEXT: bltu a1, a4, .LBB49_2
807+
; CHECK-NEXT: mv a2, a1
808+
; CHECK-NEXT: bltu a1, a3, .LBB49_2
812809
; CHECK-NEXT: # %bb.1:
813-
; CHECK-NEXT: li a1, 32
810+
; CHECK-NEXT: li a2, 32
814811
; CHECK-NEXT: .LBB49_2:
815812
; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
816813
; CHECK-NEXT: vmv.s.x v25, a0
817-
; CHECK-NEXT: vsetvli zero, a1, e32, m8, ta, ma
818-
; CHECK-NEXT: vredxor.vs v25, v8, v25, v0.t
819-
; CHECK-NEXT: vmv.x.s a0, v25
820-
; CHECK-NEXT: vsetivli zero, 1, e32, m8, ta, ma
821-
; CHECK-NEXT: vmv.s.x v8, a0
822814
; CHECK-NEXT: vsetvli zero, a2, e32, m8, ta, ma
815+
; CHECK-NEXT: vredxor.vs v25, v8, v25, v0.t
816+
; CHECK-NEXT: addi a0, a1, -32
817+
; CHECK-NEXT: sltu a1, a1, a0
818+
; CHECK-NEXT: addi a1, a1, -1
819+
; CHECK-NEXT: and a0, a1, a0
820+
; CHECK-NEXT: vsetvli zero, a0, e32, m8, ta, ma
823821
; CHECK-NEXT: vmv1r.v v0, v24
824-
; CHECK-NEXT: vredxor.vs v8, v16, v8, v0.t
825-
; CHECK-NEXT: vmv.x.s a0, v8
822+
; CHECK-NEXT: vredxor.vs v25, v16, v25, v0.t
823+
; CHECK-NEXT: vmv.x.s a0, v25
826824
; CHECK-NEXT: ret
827825
%r = call i32 @llvm.vp.reduce.xor.v64i32(i32 %s, <64 x i32> %v, <64 x i1> %m, i32 %evl)
828826
ret i32 %r

llvm/test/CodeGen/RISCV/rvv/vreductions-int-vp.ll

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,13 +1115,10 @@ define signext i32 @vpreduce_umax_nxv32i32(i32 signext %s, <vscale x 32 x i32> %
11151115
; CHECK-NEXT: vmv.s.x v25, a0
11161116
; CHECK-NEXT: vsetvli zero, a1, e32, m8, ta, ma
11171117
; CHECK-NEXT: vredmaxu.vs v25, v8, v25, v0.t
1118-
; CHECK-NEXT: vmv.x.s a0, v25
1119-
; CHECK-NEXT: vsetivli zero, 1, e32, m8, ta, ma
1120-
; CHECK-NEXT: vmv.s.x v8, a0
11211118
; CHECK-NEXT: vsetvli zero, a2, e32, m8, ta, ma
11221119
; CHECK-NEXT: vmv1r.v v0, v24
1123-
; CHECK-NEXT: vredmaxu.vs v8, v16, v8, v0.t
1124-
; CHECK-NEXT: vmv.x.s a0, v8
1120+
; CHECK-NEXT: vredmaxu.vs v25, v16, v25, v0.t
1121+
; CHECK-NEXT: vmv.x.s a0, v25
11251122
; CHECK-NEXT: ret
11261123
%r = call i32 @llvm.vp.reduce.umax.nxv32i32(i32 %s, <vscale x 32 x i32> %v, <vscale x 32 x i1> %m, i32 %evl)
11271124
ret i32 %r

0 commit comments

Comments
 (0)