Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4d8a3f5

Browse files
committed
[VectorCombine][X86] Add some tests showing failure to fold shuffle(cast(x),cast(y)) -> cast(shuffle(x,y))
Part of llvm#67803
1 parent 6a13bbf commit 4d8a3f5

File tree

1 file changed

+189
-0
lines changed

1 file changed

+189
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=vector-combine -S -mtriple=x86_64-- -mattr=sse2 | FileCheck %s --check-prefixes=CHECK,SSE
3+
; RUN: opt < %s -passes=vector-combine -S -mtriple=x86_64-- -mattr=avx2 | FileCheck %s --check-prefixes=CHECK,AVX
4+
5+
; standard vector concatenations
6+
7+
define <16 x i32> @concat_zext_v8i16_v16i32(<8 x i16> %a0, <8 x i16> %a1) {
8+
; CHECK-LABEL: @concat_zext_v8i16_v16i32(
9+
; CHECK-NEXT: [[X0:%.*]] = zext <8 x i16> [[A0:%.*]] to <8 x i32>
10+
; CHECK-NEXT: [[X1:%.*]] = zext <8 x i16> [[A1:%.*]] to <8 x i32>
11+
; CHECK-NEXT: [[R:%.*]] = shufflevector <8 x i32> [[X0]], <8 x i32> [[X1]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
12+
; CHECK-NEXT: ret <16 x i32> [[R]]
13+
;
14+
%x0 = zext <8 x i16> %a0 to <8 x i32>
15+
%x1 = zext <8 x i16> %a1 to <8 x i32>
16+
%r = shufflevector <8 x i32> %x0, <8 x i32> %x1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
17+
ret <16 x i32> %r
18+
}
19+
20+
define <16 x i32> @concat_sext_v8i16_v16i32(<8 x i16> %a0, <8 x i16> %a1) {
21+
; CHECK-LABEL: @concat_sext_v8i16_v16i32(
22+
; CHECK-NEXT: [[X0:%.*]] = sext <8 x i16> [[A0:%.*]] to <8 x i32>
23+
; CHECK-NEXT: [[X1:%.*]] = sext <8 x i16> [[A1:%.*]] to <8 x i32>
24+
; CHECK-NEXT: [[R:%.*]] = shufflevector <8 x i32> [[X0]], <8 x i32> [[X1]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
25+
; CHECK-NEXT: ret <16 x i32> [[R]]
26+
;
27+
%x0 = sext <8 x i16> %a0 to <8 x i32>
28+
%x1 = sext <8 x i16> %a1 to <8 x i32>
29+
%r = shufflevector <8 x i32> %x0, <8 x i32> %x1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
30+
ret <16 x i32> %r
31+
}
32+
33+
define <8 x i32> @concat_sext_v4i1_v8i32(<4 x i1> %a0, <4 x i1> %a1) {
34+
; CHECK-LABEL: @concat_sext_v4i1_v8i32(
35+
; CHECK-NEXT: [[X0:%.*]] = sext <4 x i1> [[A0:%.*]] to <4 x i32>
36+
; CHECK-NEXT: [[X1:%.*]] = sext <4 x i1> [[A1:%.*]] to <4 x i32>
37+
; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i32> [[X0]], <4 x i32> [[X1]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
38+
; CHECK-NEXT: ret <8 x i32> [[R]]
39+
;
40+
%x0 = sext <4 x i1> %a0 to <4 x i32>
41+
%x1 = sext <4 x i1> %a1 to <4 x i32>
42+
%r = shufflevector <4 x i32> %x0, <4 x i32> %x1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
43+
ret <8 x i32> %r
44+
}
45+
46+
define <8 x i16> @concat_trunc_v4i32_v8i16(<4 x i32> %a0, <4 x i32> %a1) {
47+
; CHECK-LABEL: @concat_trunc_v4i32_v8i16(
48+
; CHECK-NEXT: [[X0:%.*]] = trunc <4 x i32> [[A0:%.*]] to <4 x i16>
49+
; CHECK-NEXT: [[X1:%.*]] = trunc <4 x i32> [[A1:%.*]] to <4 x i16>
50+
; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[X0]], <4 x i16> [[X1]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
51+
; CHECK-NEXT: ret <8 x i16> [[R]]
52+
;
53+
%x0 = trunc <4 x i32> %a0 to <4 x i16>
54+
%x1 = trunc <4 x i32> %a1 to <4 x i16>
55+
%r = shufflevector <4 x i16> %x0, <4 x i16> %x1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
56+
ret <8 x i16> %r
57+
}
58+
59+
define <8 x ptr> @concat_inttoptr_v4i32_v8iptr(<4 x i32> %a0, <4 x i32> %a1) {
60+
; CHECK-LABEL: @concat_inttoptr_v4i32_v8iptr(
61+
; CHECK-NEXT: [[X0:%.*]] = inttoptr <4 x i32> [[A0:%.*]] to <4 x ptr>
62+
; CHECK-NEXT: [[X1:%.*]] = inttoptr <4 x i32> [[A1:%.*]] to <4 x ptr>
63+
; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x ptr> [[X0]], <4 x ptr> [[X1]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
64+
; CHECK-NEXT: ret <8 x ptr> [[R]]
65+
;
66+
%x0 = inttoptr <4 x i32> %a0 to <4 x ptr>
67+
%x1 = inttoptr <4 x i32> %a1 to <4 x ptr>
68+
%r = shufflevector <4 x ptr> %x0, <4 x ptr> %x1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
69+
ret <8 x ptr> %r
70+
}
71+
72+
define <16 x i64> @concat_ptrtoint_v8i16_v16i32(<8 x ptr> %a0, <8 x ptr> %a1) {
73+
; CHECK-LABEL: @concat_ptrtoint_v8i16_v16i32(
74+
; CHECK-NEXT: [[X0:%.*]] = ptrtoint <8 x ptr> [[A0:%.*]] to <8 x i64>
75+
; CHECK-NEXT: [[X1:%.*]] = ptrtoint <8 x ptr> [[A1:%.*]] to <8 x i64>
76+
; CHECK-NEXT: [[R:%.*]] = shufflevector <8 x i64> [[X0]], <8 x i64> [[X1]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
77+
; CHECK-NEXT: ret <16 x i64> [[R]]
78+
;
79+
%x0 = ptrtoint <8 x ptr> %a0 to <8 x i64>
80+
%x1 = ptrtoint <8 x ptr> %a1 to <8 x i64>
81+
%r = shufflevector <8 x i64> %x0, <8 x i64> %x1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
82+
ret <16 x i64> %r
83+
}
84+
85+
define <8 x double> @concat_fpext_v4f32_v8f64(<4 x float> %a0, <4 x float> %a1) {
86+
; CHECK-LABEL: @concat_fpext_v4f32_v8f64(
87+
; CHECK-NEXT: [[X0:%.*]] = fpext <4 x float> [[A0:%.*]] to <4 x double>
88+
; CHECK-NEXT: [[X1:%.*]] = fpext <4 x float> [[A1:%.*]] to <4 x double>
89+
; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x double> [[X0]], <4 x double> [[X1]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
90+
; CHECK-NEXT: ret <8 x double> [[R]]
91+
;
92+
%x0 = fpext <4 x float> %a0 to <4 x double>
93+
%x1 = fpext <4 x float> %a1 to <4 x double>
94+
%r = shufflevector <4 x double> %x0, <4 x double> %x1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
95+
ret <8 x double> %r
96+
}
97+
98+
define <16 x float> @concat_fptrunc_v8f64_v16f32(<8 x double> %a0, <8 x double> %a1) {
99+
; CHECK-LABEL: @concat_fptrunc_v8f64_v16f32(
100+
; CHECK-NEXT: [[X0:%.*]] = fptrunc <8 x double> [[A0:%.*]] to <8 x float>
101+
; CHECK-NEXT: [[X1:%.*]] = fptrunc <8 x double> [[A1:%.*]] to <8 x float>
102+
; CHECK-NEXT: [[R:%.*]] = shufflevector <8 x float> [[X0]], <8 x float> [[X1]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
103+
; CHECK-NEXT: ret <16 x float> [[R]]
104+
;
105+
%x0 = fptrunc <8 x double> %a0 to <8 x float>
106+
%x1 = fptrunc <8 x double> %a1 to <8 x float>
107+
%r = shufflevector <8 x float> %x0, <8 x float> %x1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
108+
ret <16 x float> %r
109+
}
110+
111+
; commuted vector concatenation
112+
113+
define <16 x i32> @rconcat_sext_v8i16_v16i32(<8 x i16> %a0, <8 x i16> %a1) {
114+
; CHECK-LABEL: @rconcat_sext_v8i16_v16i32(
115+
; CHECK-NEXT: [[X0:%.*]] = sext <8 x i16> [[A0:%.*]] to <8 x i32>
116+
; CHECK-NEXT: [[X1:%.*]] = sext <8 x i16> [[A1:%.*]] to <8 x i32>
117+
; CHECK-NEXT: [[R:%.*]] = shufflevector <8 x i32> [[X0]], <8 x i32> [[X1]], <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
118+
; CHECK-NEXT: ret <16 x i32> [[R]]
119+
;
120+
%x0 = sext <8 x i16> %a0 to <8 x i32>
121+
%x1 = sext <8 x i16> %a1 to <8 x i32>
122+
%r = shufflevector <8 x i32> %x0, <8 x i32> %x1, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
123+
ret <16 x i32> %r
124+
}
125+
126+
; interleaved shuffle
127+
128+
define <8 x double> @interleave_fpext_v4f32_v8f64(<4 x float> %a0, <4 x float> %a1) {
129+
; CHECK-LABEL: @interleave_fpext_v4f32_v8f64(
130+
; CHECK-NEXT: [[X0:%.*]] = fpext <4 x float> [[A0:%.*]] to <4 x double>
131+
; CHECK-NEXT: [[X1:%.*]] = fpext <4 x float> [[A1:%.*]] to <4 x double>
132+
; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x double> [[X0]], <4 x double> [[X1]], <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
133+
; CHECK-NEXT: ret <8 x double> [[R]]
134+
;
135+
%x0 = fpext <4 x float> %a0 to <4 x double>
136+
%x1 = fpext <4 x float> %a1 to <4 x double>
137+
%r = shufflevector <4 x double> %x0, <4 x double> %x1, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
138+
ret <8 x double> %r
139+
}
140+
141+
; negative - multiuse
142+
143+
define <8 x i16> @concat_trunc_v4i32_v8i16_multiuse(<4 x i32> %a0, <4 x i32> %a1, ptr %a2) {
144+
; CHECK-LABEL: @concat_trunc_v4i32_v8i16_multiuse(
145+
; CHECK-NEXT: [[X0:%.*]] = trunc <4 x i32> [[A0:%.*]] to <4 x i16>
146+
; CHECK-NEXT: [[X1:%.*]] = trunc <4 x i32> [[A1:%.*]] to <4 x i16>
147+
; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[X0]], <4 x i16> [[X1]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
148+
; CHECK-NEXT: store <4 x i16> [[X0]], ptr [[A2:%.*]], align 8
149+
; CHECK-NEXT: ret <8 x i16> [[R]]
150+
;
151+
%x0 = trunc <4 x i32> %a0 to <4 x i16>
152+
%x1 = trunc <4 x i32> %a1 to <4 x i16>
153+
%r = shufflevector <4 x i16> %x0, <4 x i16> %x1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
154+
store <4 x i16> %x0, ptr %a2
155+
ret <8 x i16> %r
156+
}
157+
158+
; negative - bitcasts
159+
160+
define <8 x float> @concat_bitcast_v4i32_v8f32(<4 x i32> %a0, <4 x i32> %a1) {
161+
; CHECK-LABEL: @concat_bitcast_v4i32_v8f32(
162+
; CHECK-NEXT: [[X0:%.*]] = bitcast <4 x i32> [[A0:%.*]] to <4 x float>
163+
; CHECK-NEXT: [[X1:%.*]] = bitcast <4 x i32> [[A1:%.*]] to <4 x float>
164+
; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x float> [[X0]], <4 x float> [[X1]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
165+
; CHECK-NEXT: ret <8 x float> [[R]]
166+
;
167+
%x0 = bitcast <4 x i32> %a0 to <4 x float>
168+
%x1 = bitcast <4 x i32> %a1 to <4 x float>
169+
%r = shufflevector <4 x float> %x0, <4 x float> %x1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
170+
ret <8 x float> %r
171+
}
172+
173+
; negative - castop mismatch
174+
175+
define <16 x i32> @concat_sext_zext_v8i16_v16i32(<8 x i16> %a0, <8 x i16> %a1) {
176+
; CHECK-LABEL: @concat_sext_zext_v8i16_v16i32(
177+
; CHECK-NEXT: [[X0:%.*]] = sext <8 x i16> [[A0:%.*]] to <8 x i32>
178+
; CHECK-NEXT: [[X1:%.*]] = zext <8 x i16> [[A1:%.*]] to <8 x i32>
179+
; CHECK-NEXT: [[R:%.*]] = shufflevector <8 x i32> [[X0]], <8 x i32> [[X1]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
180+
; CHECK-NEXT: ret <16 x i32> [[R]]
181+
;
182+
%x0 = sext <8 x i16> %a0 to <8 x i32>
183+
%x1 = zext <8 x i16> %a1 to <8 x i32>
184+
%r = shufflevector <8 x i32> %x0, <8 x i32> %x1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
185+
ret <16 x i32> %r
186+
}
187+
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
188+
; AVX: {{.*}}
189+
; SSE: {{.*}}

0 commit comments

Comments
 (0)