Skip to content

Commit 30ca258

Browse files
[RISCV] Pre-commit concat-vectors-constant-stride.ll
This patch commits tests that can be optimized by improving performCONCAT_VECTORCombine to do a better job at decomposing the base pointer and recognizing a constant offset.
1 parent 2565f9f commit 30ca258

File tree

1 file changed

+231
-0
lines changed

1 file changed

+231
-0
lines changed
Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=riscv32 -mattr=+v,+unaligned-vector-mem -target-abi=ilp32 \
3+
; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
4+
; RUN: llc -mtriple=riscv64 -mattr=+v,+unaligned-vector-mem -target-abi=lp64 \
5+
; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
6+
7+
define void @constant_forward_stride(ptr %s, ptr %d) {
8+
; CHECK-LABEL: constant_forward_stride:
9+
; CHECK: # %bb.0:
10+
; CHECK-NEXT: addi a2, a0, 16
11+
; CHECK-NEXT: addi a3, a0, 32
12+
; CHECK-NEXT: addi a4, a0, 48
13+
; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
14+
; CHECK-NEXT: vle8.v v8, (a0)
15+
; CHECK-NEXT: vle8.v v9, (a2)
16+
; CHECK-NEXT: vle8.v v10, (a3)
17+
; CHECK-NEXT: vle8.v v11, (a4)
18+
; CHECK-NEXT: vsetivli zero, 4, e8, mf2, tu, ma
19+
; CHECK-NEXT: vslideup.vi v8, v9, 2
20+
; CHECK-NEXT: vsetivli zero, 6, e8, mf2, tu, ma
21+
; CHECK-NEXT: vslideup.vi v8, v10, 4
22+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
23+
; CHECK-NEXT: vslideup.vi v8, v11, 6
24+
; CHECK-NEXT: vse8.v v8, (a1)
25+
; CHECK-NEXT: ret
26+
%1 = getelementptr inbounds i8, ptr %s, i64 16
27+
%2 = getelementptr inbounds i8, ptr %s, i64 32
28+
%3 = getelementptr inbounds i8, ptr %s, i64 48
29+
%4 = load <2 x i8>, ptr %s, align 1
30+
%5 = load <2 x i8>, ptr %1, align 1
31+
%6 = load <2 x i8>, ptr %2, align 1
32+
%7 = load <2 x i8>, ptr %3, align 1
33+
%8 = shufflevector <2 x i8> %4, <2 x i8> %5, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
34+
%9 = shufflevector <2 x i8> %6, <2 x i8> %7, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
35+
%10 = shufflevector <4 x i8> %8, <4 x i8> %9, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
36+
store <8 x i8> %10, ptr %d, align 1
37+
ret void
38+
}
39+
40+
define void @constant_forward_stride2(ptr %s, ptr %d) {
41+
; CHECK-LABEL: constant_forward_stride2:
42+
; CHECK: # %bb.0:
43+
; CHECK-NEXT: addi a2, a0, -16
44+
; CHECK-NEXT: addi a3, a0, -32
45+
; CHECK-NEXT: addi a4, a0, -48
46+
; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
47+
; CHECK-NEXT: vle8.v v8, (a4)
48+
; CHECK-NEXT: vle8.v v9, (a3)
49+
; CHECK-NEXT: vle8.v v10, (a2)
50+
; CHECK-NEXT: vle8.v v11, (a0)
51+
; CHECK-NEXT: vsetivli zero, 4, e8, mf2, tu, ma
52+
; CHECK-NEXT: vslideup.vi v8, v9, 2
53+
; CHECK-NEXT: vsetivli zero, 6, e8, mf2, tu, ma
54+
; CHECK-NEXT: vslideup.vi v8, v10, 4
55+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
56+
; CHECK-NEXT: vslideup.vi v8, v11, 6
57+
; CHECK-NEXT: vse8.v v8, (a1)
58+
; CHECK-NEXT: ret
59+
%1 = getelementptr inbounds i8, ptr %s, i64 -16
60+
%2 = getelementptr inbounds i8, ptr %s, i64 -32
61+
%3 = getelementptr inbounds i8, ptr %s, i64 -48
62+
%4 = load <2 x i8>, ptr %3, align 1
63+
%5 = load <2 x i8>, ptr %2, align 1
64+
%6 = load <2 x i8>, ptr %1, align 1
65+
%7 = load <2 x i8>, ptr %s, align 1
66+
%8 = shufflevector <2 x i8> %4, <2 x i8> %5, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
67+
%9 = shufflevector <2 x i8> %6, <2 x i8> %7, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
68+
%10 = shufflevector <4 x i8> %8, <4 x i8> %9, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
69+
store <8 x i8> %10, ptr %d, align 1
70+
ret void
71+
}
72+
73+
define void @constant_forward_stride3(ptr %s, ptr %d) {
74+
; CHECK-LABEL: constant_forward_stride3:
75+
; CHECK: # %bb.0:
76+
; CHECK-NEXT: addi a2, a0, 16
77+
; CHECK-NEXT: addi a3, a0, 32
78+
; CHECK-NEXT: addi a4, a0, 48
79+
; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
80+
; CHECK-NEXT: vle8.v v8, (a0)
81+
; CHECK-NEXT: vle8.v v9, (a2)
82+
; CHECK-NEXT: vle8.v v10, (a3)
83+
; CHECK-NEXT: vle8.v v11, (a4)
84+
; CHECK-NEXT: vsetivli zero, 4, e8, mf2, tu, ma
85+
; CHECK-NEXT: vslideup.vi v8, v9, 2
86+
; CHECK-NEXT: vsetivli zero, 6, e8, mf2, tu, ma
87+
; CHECK-NEXT: vslideup.vi v8, v10, 4
88+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
89+
; CHECK-NEXT: vslideup.vi v8, v11, 6
90+
; CHECK-NEXT: vse8.v v8, (a1)
91+
; CHECK-NEXT: ret
92+
%1 = getelementptr inbounds i8, ptr %s, i64 16
93+
%2 = getelementptr inbounds i8, ptr %s, i64 32
94+
%3 = getelementptr inbounds i8, ptr %s, i64 48
95+
%4 = getelementptr inbounds i8, ptr %1, i64 0
96+
%5 = getelementptr inbounds i8, ptr %2, i64 0
97+
%6 = getelementptr inbounds i8, ptr %3, i64 0
98+
%7 = load <2 x i8>, ptr %s, align 1
99+
%8 = load <2 x i8>, ptr %4, align 1
100+
%9 = load <2 x i8>, ptr %5, align 1
101+
%10 = load <2 x i8>, ptr %6, align 1
102+
%11 = shufflevector <2 x i8> %7, <2 x i8> %8, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
103+
%12 = shufflevector <2 x i8> %9, <2 x i8> %10, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
104+
%13 = shufflevector <4 x i8> %11, <4 x i8> %12, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
105+
store <8 x i8> %13, ptr %d, align 1
106+
ret void
107+
}
108+
109+
define void @constant_back_stride(ptr %s, ptr %d) {
110+
; CHECK-LABEL: constant_back_stride:
111+
; CHECK: # %bb.0:
112+
; CHECK-NEXT: addi a2, a0, -16
113+
; CHECK-NEXT: addi a3, a0, -32
114+
; CHECK-NEXT: addi a4, a0, -48
115+
; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
116+
; CHECK-NEXT: vle8.v v8, (a0)
117+
; CHECK-NEXT: vle8.v v9, (a2)
118+
; CHECK-NEXT: vle8.v v10, (a3)
119+
; CHECK-NEXT: vle8.v v11, (a4)
120+
; CHECK-NEXT: vsetivli zero, 4, e8, mf2, tu, ma
121+
; CHECK-NEXT: vslideup.vi v8, v9, 2
122+
; CHECK-NEXT: vsetivli zero, 6, e8, mf2, tu, ma
123+
; CHECK-NEXT: vslideup.vi v8, v10, 4
124+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
125+
; CHECK-NEXT: vslideup.vi v8, v11, 6
126+
; CHECK-NEXT: vse8.v v8, (a1)
127+
; CHECK-NEXT: ret
128+
%1 = getelementptr inbounds i8, ptr %s, i64 -16
129+
%2 = getelementptr inbounds i8, ptr %s, i64 -32
130+
%3 = getelementptr inbounds i8, ptr %s, i64 -48
131+
%4 = load <2 x i8>, ptr %s, align 1
132+
%5 = load <2 x i8>, ptr %1, align 1
133+
%6 = load <2 x i8>, ptr %2, align 1
134+
%7 = load <2 x i8>, ptr %3, align 1
135+
%8 = shufflevector <2 x i8> %4, <2 x i8> %5, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
136+
%9 = shufflevector <2 x i8> %6, <2 x i8> %7, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
137+
%10 = shufflevector <4 x i8> %8, <4 x i8> %9, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
138+
store <8 x i8> %10, ptr %d, align 1
139+
ret void
140+
}
141+
142+
define void @constant_back_stride2(ptr %s, ptr %d) {
143+
; CHECK-LABEL: constant_back_stride2:
144+
; CHECK: # %bb.0:
145+
; CHECK-NEXT: addi a2, a0, 16
146+
; CHECK-NEXT: addi a3, a0, 32
147+
; CHECK-NEXT: addi a4, a0, 48
148+
; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
149+
; CHECK-NEXT: vle8.v v8, (a4)
150+
; CHECK-NEXT: vle8.v v9, (a3)
151+
; CHECK-NEXT: vle8.v v10, (a2)
152+
; CHECK-NEXT: vle8.v v11, (a0)
153+
; CHECK-NEXT: vsetivli zero, 4, e8, mf2, tu, ma
154+
; CHECK-NEXT: vslideup.vi v8, v9, 2
155+
; CHECK-NEXT: vsetivli zero, 6, e8, mf2, tu, ma
156+
; CHECK-NEXT: vslideup.vi v8, v10, 4
157+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
158+
; CHECK-NEXT: vslideup.vi v8, v11, 6
159+
; CHECK-NEXT: vse8.v v8, (a1)
160+
; CHECK-NEXT: ret
161+
%1 = getelementptr inbounds i8, ptr %s, i64 16
162+
%2 = getelementptr inbounds i8, ptr %s, i64 32
163+
%3 = getelementptr inbounds i8, ptr %s, i64 48
164+
%4 = load <2 x i8>, ptr %3, align 1
165+
%5 = load <2 x i8>, ptr %2, align 1
166+
%6 = load <2 x i8>, ptr %1, align 1
167+
%7 = load <2 x i8>, ptr %s, align 1
168+
%8 = shufflevector <2 x i8> %4, <2 x i8> %5, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
169+
%9 = shufflevector <2 x i8> %6, <2 x i8> %7, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
170+
%10 = shufflevector <4 x i8> %8, <4 x i8> %9, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
171+
store <8 x i8> %10, ptr %d, align 1
172+
ret void
173+
}
174+
175+
define void @constant_back_stride3(ptr %s, ptr %d) {
176+
; CHECK-LABEL: constant_back_stride3:
177+
; CHECK: # %bb.0:
178+
; CHECK-NEXT: addi a2, a0, -16
179+
; CHECK-NEXT: addi a3, a0, -32
180+
; CHECK-NEXT: addi a4, a0, -48
181+
; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
182+
; CHECK-NEXT: vle8.v v8, (a0)
183+
; CHECK-NEXT: vle8.v v9, (a2)
184+
; CHECK-NEXT: vle8.v v10, (a3)
185+
; CHECK-NEXT: vle8.v v11, (a4)
186+
; CHECK-NEXT: vsetivli zero, 4, e8, mf2, tu, ma
187+
; CHECK-NEXT: vslideup.vi v8, v9, 2
188+
; CHECK-NEXT: vsetivli zero, 6, e8, mf2, tu, ma
189+
; CHECK-NEXT: vslideup.vi v8, v10, 4
190+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
191+
; CHECK-NEXT: vslideup.vi v8, v11, 6
192+
; CHECK-NEXT: vse8.v v8, (a1)
193+
; CHECK-NEXT: ret
194+
%1 = getelementptr inbounds i8, ptr %s, i64 -16
195+
%2 = getelementptr inbounds i8, ptr %s, i64 -32
196+
%3 = getelementptr inbounds i8, ptr %s, i64 -48
197+
%4 = getelementptr inbounds i8, ptr %1, i64 0
198+
%5 = getelementptr inbounds i8, ptr %2, i64 0
199+
%6 = getelementptr inbounds i8, ptr %3, i64 0
200+
%7 = load <2 x i8>, ptr %s, align 1
201+
%8 = load <2 x i8>, ptr %4, align 1
202+
%9 = load <2 x i8>, ptr %5, align 1
203+
%10 = load <2 x i8>, ptr %6, align 1
204+
%11 = shufflevector <2 x i8> %7, <2 x i8> %8, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
205+
%12 = shufflevector <2 x i8> %9, <2 x i8> %10, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
206+
%13 = shufflevector <4 x i8> %11, <4 x i8> %12, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
207+
store <8 x i8> %13, ptr %d, align 1
208+
ret void
209+
}
210+
211+
define void @constant_zero_stride(ptr %s, ptr %d) {
212+
; CHECK-LABEL: constant_zero_stride:
213+
; CHECK: # %bb.0:
214+
; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
215+
; CHECK-NEXT: vle8.v v8, (a0)
216+
; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma
217+
; CHECK-NEXT: vmv1r.v v9, v8
218+
; CHECK-NEXT: vslideup.vi v9, v8, 2
219+
; CHECK-NEXT: vse8.v v9, (a1)
220+
; CHECK-NEXT: ret
221+
%1 = getelementptr inbounds i8, ptr %s, i64 0
222+
%2 = load <2 x i8>, ptr %s, align 1
223+
%3 = load <2 x i8>, ptr %1, align 1
224+
%4 = shufflevector <2 x i8> %2, <2 x i8> %3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
225+
store <4 x i8> %4, ptr %d, align 1
226+
ret void
227+
}
228+
229+
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
230+
; RV32: {{.*}}
231+
; RV64: {{.*}}

0 commit comments

Comments
 (0)