Skip to content

Commit 3806550

Browse files
lukel97yuxuanchen1997
authored andcommitted
[RISCV] Update combine-vmv.ll to have more foldable cases. NFC
Summary: A lot of cases have differing AVLs which aren't foldable, update them so the peephole triggers on them and add explicit cases for non-foldable AVLs. Also rename it to vmv.v.v-peephole.ll since it's not actually a DAG combine. And remove a TODO, it's correct to fold if the two passthrus are the same. Test Plan: Reviewers: Subscribers: Tasks: Tags: Differential Revision: https://phabricator.intern.facebook.com/D60250727
1 parent eb475e2 commit 3806550

File tree

1 file changed

+51
-39
lines changed

1 file changed

+51
-39
lines changed

llvm/test/CodeGen/RISCV/rvv/combine-vmv.ll renamed to llvm/test/CodeGen/RISCV/rvv/vmv.v.v-peephole.ll

+51-39
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,14 @@
22
; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs | FileCheck %s
33
; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs | FileCheck %s
44

5-
declare <vscale x 4 x i32> @llvm.riscv.vmv.v.v.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, iXLen)
6-
7-
declare <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, iXLen)
8-
9-
define <vscale x 4 x i32> @vadd(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl1, iXLen %vl2) {
5+
define <vscale x 4 x i32> @vadd(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
106
; CHECK-LABEL: vadd:
117
; CHECK: # %bb.0:
12-
; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
13-
; CHECK-NEXT: vadd.vv v10, v10, v12
14-
; CHECK-NEXT: vsetvli zero, a1, e32, m2, tu, ma
15-
; CHECK-NEXT: vmv.v.v v8, v10
8+
; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma
9+
; CHECK-NEXT: vadd.vv v8, v10, v12
1610
; CHECK-NEXT: ret
17-
%v = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl1)
18-
%w = call <vscale x 4 x i32> @llvm.riscv.vmv.v.v.nxv4i32(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %v, iXLen %vl2)
11+
%v = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl)
12+
%w = call <vscale x 4 x i32> @llvm.riscv.vmv.v.v.nxv4i32(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %v, iXLen %vl)
1913
ret <vscale x 4 x i32> %w
2014
}
2115

@@ -30,23 +24,31 @@ define <vscale x 4 x i32> @vadd_mask(<vscale x 4 x i32> %passthru, <vscale x 4 x
3024
ret <vscale x 4 x i32> %w
3125
}
3226

33-
define <vscale x 4 x i32> @vadd_undef(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl1, iXLen %vl2) {
27+
define <vscale x 4 x i32> @vadd_undef(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
3428
; CHECK-LABEL: vadd_undef:
3529
; CHECK: # %bb.0:
3630
; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3731
; CHECK-NEXT: vadd.vv v8, v8, v10
38-
; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
39-
; CHECK-NEXT: vmv.v.v v8, v8
4032
; CHECK-NEXT: ret
41-
%v = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl1)
42-
%w = call <vscale x 4 x i32> @llvm.riscv.vmv.v.v.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %v, iXLen %vl2)
33+
%v = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl)
34+
%w = call <vscale x 4 x i32> @llvm.riscv.vmv.v.v.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %v, iXLen %vl)
4335
ret <vscale x 4 x i32> %w
4436
}
4537

46-
; TODO: Is this correct if there's already a passthru in the src?
47-
define <vscale x 4 x i32> @vadd_same_passthru(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl1, iXLen %vl2) {
38+
define <vscale x 4 x i32> @vadd_same_passthru(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
4839
; CHECK-LABEL: vadd_same_passthru:
4940
; CHECK: # %bb.0:
41+
; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma
42+
; CHECK-NEXT: vadd.vv v8, v10, v12
43+
; CHECK-NEXT: ret
44+
%v = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl)
45+
%w = call <vscale x 4 x i32> @llvm.riscv.vmv.v.v.nxv4i32(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %v, iXLen %vl)
46+
ret <vscale x 4 x i32> %w
47+
}
48+
49+
define <vscale x 4 x i32> @unfoldable_diff_avl_unknown(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl1, iXLen %vl2) {
50+
; CHECK-LABEL: unfoldable_diff_avl_unknown:
51+
; CHECK: # %bb.0:
5052
; CHECK-NEXT: vmv2r.v v14, v8
5153
; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma
5254
; CHECK-NEXT: vadd.vv v14, v10, v12
@@ -58,36 +60,50 @@ define <vscale x 4 x i32> @vadd_same_passthru(<vscale x 4 x i32> %passthru, <vsc
5860
ret <vscale x 4 x i32> %w
5961
}
6062

61-
declare <vscale x 4 x i32> @llvm.riscv.vadd.mask.nxv4i32.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i1>, iXLen, iXLen)
63+
define <vscale x 4 x i32> @diff_avl_known(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
64+
; CHECK-LABEL: diff_avl_known:
65+
; CHECK: # %bb.0:
66+
; CHECK-NEXT: vsetivli zero, 4, e32, m2, tu, ma
67+
; CHECK-NEXT: vadd.vv v8, v10, v12
68+
; CHECK-NEXT: ret
69+
%v = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen 4)
70+
%w = call <vscale x 4 x i32> @llvm.riscv.vmv.v.v.nxv4i32(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %v, iXLen 8)
71+
ret <vscale x 4 x i32> %w
72+
}
73+
74+
define <vscale x 4 x i32> @diff_avl_vlmax(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
75+
; CHECK-LABEL: diff_avl_vlmax:
76+
; CHECK: # %bb.0:
77+
; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma
78+
; CHECK-NEXT: vadd.vv v8, v10, v12
79+
; CHECK-NEXT: ret
80+
%v = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
81+
%w = call <vscale x 4 x i32> @llvm.riscv.vmv.v.v.nxv4i32(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %v, iXLen %vl)
82+
ret <vscale x 4 x i32> %w
83+
}
6284

63-
define <vscale x 4 x i32> @vadd_mask_ma(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %mask, iXLen %vl1, iXLen %vl2) {
85+
define <vscale x 4 x i32> @vadd_mask_ma(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %mask, iXLen %vl) {
6486
; CHECK-LABEL: vadd_mask_ma:
6587
; CHECK: # %bb.0:
66-
; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
67-
; CHECK-NEXT: vadd.vv v10, v10, v12, v0.t
68-
; CHECK-NEXT: vsetvli zero, a1, e32, m2, tu, ma
69-
; CHECK-NEXT: vmv.v.v v8, v10
88+
; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, mu
89+
; CHECK-NEXT: vadd.vv v8, v10, v12, v0.t
7090
; CHECK-NEXT: ret
71-
%v = call <vscale x 4 x i32> @llvm.riscv.vadd.mask.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %mask, iXLen %vl1, iXLen 2)
72-
%w = call <vscale x 4 x i32> @llvm.riscv.vmv.v.v.nxv4i32(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %v, iXLen %vl2)
91+
%v = call <vscale x 4 x i32> @llvm.riscv.vadd.mask.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %mask, iXLen %vl, iXLen 2)
92+
%w = call <vscale x 4 x i32> @llvm.riscv.vmv.v.v.nxv4i32(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %v, iXLen %vl)
7393
ret <vscale x 4 x i32> %w
7494
}
7595

76-
define <vscale x 4 x i32> @vadd_mask_mu(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %mask, iXLen %vl1, iXLen %vl2) {
96+
define <vscale x 4 x i32> @vadd_mask_mu(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %mask, iXLen %vl) {
7797
; CHECK-LABEL: vadd_mask_mu:
7898
; CHECK: # %bb.0:
79-
; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
80-
; CHECK-NEXT: vadd.vv v10, v10, v12, v0.t
81-
; CHECK-NEXT: vsetvli zero, a1, e32, m2, tu, ma
82-
; CHECK-NEXT: vmv.v.v v8, v10
99+
; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, mu
100+
; CHECK-NEXT: vadd.vv v8, v10, v12, v0.t
83101
; CHECK-NEXT: ret
84-
%v = call <vscale x 4 x i32> @llvm.riscv.vadd.mask.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %mask, iXLen %vl1, iXLen 0)
85-
%w = call <vscale x 4 x i32> @llvm.riscv.vmv.v.v.nxv4i32(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %v, iXLen %vl2)
102+
%v = call <vscale x 4 x i32> @llvm.riscv.vadd.mask.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %mask, iXLen %vl, iXLen 0)
103+
%w = call <vscale x 4 x i32> @llvm.riscv.vmv.v.v.nxv4i32(<vscale x 4 x i32> %passthru, <vscale x 4 x i32> %v, iXLen %vl)
86104
ret <vscale x 4 x i32> %w
87105
}
88106

89-
declare <vscale x 4 x i32> @llvm.riscv.vle.nxv4i32(<vscale x 4 x i32>, ptr, iXLen)
90-
91107
define <vscale x 4 x i32> @foldable_load(<vscale x 4 x i32> %passthru, ptr %p) {
92108
; CHECK-LABEL: foldable_load:
93109
; CHECK: # %bb.0:
@@ -113,10 +129,6 @@ define <vscale x 4 x i32> @unfoldable_load(<vscale x 4 x i32> %passthru, ptr %p,
113129
ret <vscale x 4 x i32> %w
114130
}
115131

116-
declare <vscale x 4 x float> @llvm.riscv.vmv.v.v.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>, iXLen)
117-
118-
declare <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>, iXLen, iXLen)
119-
120132
define <vscale x 4 x float> @unfoldable_vfadd(<vscale x 4 x float> %passthru, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl1, iXLen %vl2) {
121133
; CHECK-LABEL: unfoldable_vfadd:
122134
; CHECK: # %bb.0:

0 commit comments

Comments
 (0)