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

Skip to content

Commit ac9e7eb

Browse files
author
git apple-llvm automerger
committed
Merge commit '4d8a3f5b35b0' from llvm.org/main into next
2 parents 46101d5 + 4d8a3f5 commit ac9e7eb

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)