You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[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
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) {
10
6
; CHECK-LABEL: vadd:
11
7
; 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
16
10
; 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)
19
13
ret <vscale x 4 x i32> %w
20
14
}
21
15
@@ -30,23 +24,31 @@ define <vscale x 4 x i32> @vadd_mask(<vscale x 4 x i32> %passthru, <vscale x 4 x
30
24
ret <vscale x 4 x i32> %w
31
25
}
32
26
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) {
34
28
; CHECK-LABEL: vadd_undef:
35
29
; CHECK: # %bb.0:
36
30
; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
37
31
; 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
40
32
; 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)
43
35
ret <vscale x 4 x i32> %w
44
36
}
45
37
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) {
48
39
; CHECK-LABEL: vadd_same_passthru:
49
40
; 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:
50
52
; CHECK-NEXT: vmv2r.v v14, v8
51
53
; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma
52
54
; 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
58
60
ret <vscale x 4 x i32> %w
59
61
}
60
62
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
+
}
62
84
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) {
64
86
; CHECK-LABEL: vadd_mask_ma:
65
87
; 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
70
90
; 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)
73
93
ret <vscale x 4 x i32> %w
74
94
}
75
95
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) {
77
97
; CHECK-LABEL: vadd_mask_mu:
78
98
; 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
83
101
; 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)
86
104
ret <vscale x 4 x i32> %w
87
105
}
88
106
89
-
declare <vscale x 4 x i32> @llvm.riscv.vle.nxv4i32(<vscale x 4 x i32>, ptr, iXLen)
90
-
91
107
define <vscale x 4 x i32> @foldable_load(<vscale x 4 x i32> %passthru, ptr%p) {
92
108
; CHECK-LABEL: foldable_load:
93
109
; CHECK: # %bb.0:
@@ -113,10 +129,6 @@ define <vscale x 4 x i32> @unfoldable_load(<vscale x 4 x i32> %passthru, ptr %p,
113
129
ret <vscale x 4 x i32> %w
114
130
}
115
131
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
-
120
132
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) {
0 commit comments