Skip to content

Commit 3a75016

Browse files
author
Leon Clark
committed
[AggressiveInstCombine] Shrink loads used in shufflevector rebroadcasts.
Attempt to shrink the size of vector loads where only some of the incoming lanes are used for rebroadcasts in shufflevector instructions.
1 parent 73a7a3d commit 3a75016

File tree

1 file changed

+345
-0
lines changed

1 file changed

+345
-0
lines changed
Lines changed: 345 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,345 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -passes=aggressive-instcombine -S < %s | FileCheck %s
3+
4+
define <8 x half> @shuffle_v4_v8f16_r0_1(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
5+
; CHECK-LABEL: define <8 x half> @shuffle_v4_v8f16_r0_1(
6+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
7+
; CHECK-NEXT: [[ENTRY:.*:]]
8+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x half>, ptr addrspace(1) [[ARG0]], align 32
9+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x half> [[VAL0]], <4 x half> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>
10+
; CHECK-NEXT: ret <8 x half> [[TMP1]]
11+
;
12+
entry:
13+
%val0 = load <4 x half>, ptr addrspace(1) %arg0, align 32
14+
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>
15+
ret <8 x half> %val1
16+
}
17+
18+
define <8 x half> @shuffle_v4_v8f16_r0_2(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
19+
; CHECK-LABEL: define <8 x half> @shuffle_v4_v8f16_r0_2(
20+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
21+
; CHECK-NEXT: [[ENTRY:.*:]]
22+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x half>, ptr addrspace(1) [[ARG0]], align 32
23+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x half> [[VAL0]], <4 x half> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 2, i32 2, i32 2, i32 2>
24+
; CHECK-NEXT: ret <8 x half> [[TMP1]]
25+
;
26+
entry:
27+
%val0 = load <4 x half>, ptr addrspace(1) %arg0, align 32
28+
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 2, i32 2, i32 2, i32 2>
29+
ret <8 x half> %val1
30+
}
31+
32+
define <4 x half> @shuffle_v4_v4f16_r1_2(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
33+
; CHECK-LABEL: define <4 x half> @shuffle_v4_v4f16_r1_2(
34+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
35+
; CHECK-NEXT: [[ENTRY:.*:]]
36+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x half>, ptr addrspace(1) [[ARG0]], align 32
37+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x half> [[VAL0]], <4 x half> poison, <4 x i32> <i32 1, i32 1, i32 2, i32 2>
38+
; CHECK-NEXT: ret <4 x half> [[TMP1]]
39+
;
40+
entry:
41+
%val0 = load <4 x half>, ptr addrspace(1) %arg0, align 32
42+
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <4 x i32> <i32 1, i32 1, i32 2, i32 2>
43+
ret <4 x half> %val1
44+
}
45+
46+
define <8 x half> @shuffle_v4_v8f16_r1_2(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
47+
; CHECK-LABEL: define <8 x half> @shuffle_v4_v8f16_r1_2(
48+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
49+
; CHECK-NEXT: [[ENTRY:.*:]]
50+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x half>, ptr addrspace(1) [[ARG0]], align 32
51+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x half> [[VAL0]], <4 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2>
52+
; CHECK-NEXT: ret <8 x half> [[TMP1]]
53+
;
54+
entry:
55+
%val0 = load <4 x half>, ptr addrspace(1) %arg0, align 32
56+
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2>
57+
ret <8 x half> %val1
58+
}
59+
60+
define <8 x half> @shuffle_v4_v8f16_cond_r0_1(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
61+
; CHECK-LABEL: define <8 x half> @shuffle_v4_v8f16_cond_r0_1(
62+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
63+
; CHECK-NEXT: [[ENTRY:.*:]]
64+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x half>, ptr addrspace(1) [[ARG0]], align 32
65+
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
66+
; CHECK: [[THEN]]:
67+
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <4 x half> [[VAL0]], <4 x half> poison, <8 x i32> zeroinitializer
68+
; CHECK-NEXT: br label %[[FINALLY:.*]]
69+
; CHECK: [[ELSE]]:
70+
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <4 x half> [[VAL0]], <4 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
71+
; CHECK-NEXT: br label %[[FINALLY]]
72+
; CHECK: [[FINALLY]]:
73+
; CHECK-NEXT: [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
74+
; CHECK-NEXT: ret <8 x half> [[VAL3]]
75+
;
76+
entry:
77+
%val0 = load <4 x half>, ptr addrspace(1) %arg0, align 32
78+
br i1 %cond, label %then, label %else
79+
80+
then:
81+
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
82+
br label %finally
83+
84+
else:
85+
%val2 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
86+
br label %finally
87+
88+
finally:
89+
%val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
90+
ret <8 x half> %val3
91+
}
92+
93+
define <4 x half> @shuffle_v4_v4f16_cond_r1_2(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
94+
; CHECK-LABEL: define <4 x half> @shuffle_v4_v4f16_cond_r1_2(
95+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
96+
; CHECK-NEXT: [[ENTRY:.*:]]
97+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x half>, ptr addrspace(1) [[ARG0]], align 32
98+
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
99+
; CHECK: [[THEN]]:
100+
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <4 x half> [[VAL0]], <4 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
101+
; CHECK-NEXT: br label %[[FINALLY:.*]]
102+
; CHECK: [[ELSE]]:
103+
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <4 x half> [[VAL0]], <4 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
104+
; CHECK-NEXT: br label %[[FINALLY]]
105+
; CHECK: [[FINALLY]]:
106+
; CHECK-NEXT: [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
107+
; CHECK-NEXT: ret <4 x half> [[VAL3]]
108+
;
109+
entry:
110+
%val0 = load <4 x half>, ptr addrspace(1) %arg0, align 32
111+
br i1 %cond, label %then, label %else
112+
113+
then:
114+
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
115+
br label %finally
116+
117+
else:
118+
%val2 = shufflevector <4 x half> %val0, <4 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
119+
br label %finally
120+
121+
finally:
122+
%val3 = phi <4 x half> [ %val1, %then ], [ %val2, %else ]
123+
ret <4 x half> %val3
124+
}
125+
126+
define <8 x half> @shuffle_v4_v8f16_cond_r1_2(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
127+
; CHECK-LABEL: define <8 x half> @shuffle_v4_v8f16_cond_r1_2(
128+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
129+
; CHECK-NEXT: [[ENTRY:.*:]]
130+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x half>, ptr addrspace(1) [[ARG0]], align 32
131+
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
132+
; CHECK: [[THEN]]:
133+
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <4 x half> [[VAL0]], <4 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
134+
; CHECK-NEXT: br label %[[FINALLY:.*]]
135+
; CHECK: [[ELSE]]:
136+
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <4 x half> [[VAL0]], <4 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
137+
; CHECK-NEXT: br label %[[FINALLY]]
138+
; CHECK: [[FINALLY]]:
139+
; CHECK-NEXT: [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
140+
; CHECK-NEXT: ret <8 x half> [[VAL3]]
141+
;
142+
entry:
143+
%val0 = load <4 x half>, ptr addrspace(1) %arg0, align 32
144+
br i1 %cond, label %then, label %else
145+
146+
then:
147+
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
148+
br label %finally
149+
150+
else:
151+
%val2 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
152+
br label %finally
153+
154+
finally:
155+
%val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
156+
ret <8 x half> %val3
157+
}
158+
159+
define <8 x i32> @shuffle_v4_v8i32_r0_1(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
160+
; CHECK-LABEL: define <8 x i32> @shuffle_v4_v8i32_r0_1(
161+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
162+
; CHECK-NEXT: [[ENTRY:.*:]]
163+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x i32>, ptr addrspace(1) [[ARG0]], align 32
164+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[VAL0]], <4 x i32> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>
165+
; CHECK-NEXT: ret <8 x i32> [[TMP1]]
166+
;
167+
entry:
168+
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
169+
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>
170+
ret <8 x i32> %val1
171+
}
172+
173+
define <8 x i32> @shuffle_v4_v8i32_r0_2(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
174+
; CHECK-LABEL: define <8 x i32> @shuffle_v4_v8i32_r0_2(
175+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
176+
; CHECK-NEXT: [[ENTRY:.*:]]
177+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x i32>, ptr addrspace(1) [[ARG0]], align 32
178+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[VAL0]], <4 x i32> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 2, i32 2, i32 2, i32 2>
179+
; CHECK-NEXT: ret <8 x i32> [[TMP1]]
180+
;
181+
entry:
182+
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
183+
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 2, i32 2, i32 2, i32 2>
184+
ret <8 x i32> %val1
185+
}
186+
187+
define <4 x i32> @shuffle_v4_v4i32_r1_2(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
188+
; CHECK-LABEL: define <4 x i32> @shuffle_v4_v4i32_r1_2(
189+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
190+
; CHECK-NEXT: [[ENTRY:.*:]]
191+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x i32>, ptr addrspace(1) [[ARG0]], align 32
192+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[VAL0]], <4 x i32> poison, <4 x i32> <i32 1, i32 1, i32 2, i32 2>
193+
; CHECK-NEXT: ret <4 x i32> [[TMP1]]
194+
;
195+
entry:
196+
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
197+
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <4 x i32> <i32 1, i32 1, i32 2, i32 2>
198+
ret <4 x i32> %val1
199+
}
200+
201+
define <8 x i32> @shuffle_v4_v8i32_r1_2(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
202+
; CHECK-LABEL: define <8 x i32> @shuffle_v4_v8i32_r1_2(
203+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
204+
; CHECK-NEXT: [[ENTRY:.*:]]
205+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x i32>, ptr addrspace(1) [[ARG0]], align 32
206+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[VAL0]], <4 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2>
207+
; CHECK-NEXT: ret <8 x i32> [[TMP1]]
208+
;
209+
entry:
210+
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
211+
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2>
212+
ret <8 x i32> %val1
213+
}
214+
215+
define <8 x i32> @shuffle_v4_v8i32_cond_r0_1(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
216+
; CHECK-LABEL: define <8 x i32> @shuffle_v4_v8i32_cond_r0_1(
217+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
218+
; CHECK-NEXT: [[ENTRY:.*:]]
219+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x i32>, ptr addrspace(1) [[ARG0]], align 32
220+
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
221+
; CHECK: [[THEN]]:
222+
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <4 x i32> [[VAL0]], <4 x i32> poison, <8 x i32> zeroinitializer
223+
; CHECK-NEXT: br label %[[FINALLY:.*]]
224+
; CHECK: [[ELSE]]:
225+
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <4 x i32> [[VAL0]], <4 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
226+
; CHECK-NEXT: br label %[[FINALLY]]
227+
; CHECK: [[FINALLY]]:
228+
; CHECK-NEXT: [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
229+
; CHECK-NEXT: ret <8 x i32> [[VAL3]]
230+
;
231+
entry:
232+
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
233+
br i1 %cond, label %then, label %else
234+
235+
then:
236+
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
237+
br label %finally
238+
239+
else:
240+
%val2 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
241+
br label %finally
242+
243+
finally:
244+
%val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
245+
ret <8 x i32> %val3
246+
}
247+
248+
define <8 x i32> @shuffle_v4_v8i32_cond_r0_2(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
249+
; CHECK-LABEL: define <8 x i32> @shuffle_v4_v8i32_cond_r0_2(
250+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
251+
; CHECK-NEXT: [[ENTRY:.*:]]
252+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x i32>, ptr addrspace(1) [[ARG0]], align 32
253+
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
254+
; CHECK: [[THEN]]:
255+
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <4 x i32> [[VAL0]], <4 x i32> poison, <8 x i32> zeroinitializer
256+
; CHECK-NEXT: br label %[[FINALLY:.*]]
257+
; CHECK: [[ELSE]]:
258+
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <4 x i32> [[VAL0]], <4 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
259+
; CHECK-NEXT: br label %[[FINALLY]]
260+
; CHECK: [[FINALLY]]:
261+
; CHECK-NEXT: [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
262+
; CHECK-NEXT: ret <8 x i32> [[VAL3]]
263+
;
264+
entry:
265+
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
266+
br i1 %cond, label %then, label %else
267+
268+
then:
269+
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
270+
br label %finally
271+
272+
else:
273+
%val2 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
274+
br label %finally
275+
276+
finally:
277+
%val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
278+
ret <8 x i32> %val3
279+
}
280+
281+
define <4 x i32> @shuffle_v4_v4i32_cond_r1_2(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
282+
; CHECK-LABEL: define <4 x i32> @shuffle_v4_v4i32_cond_r1_2(
283+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
284+
; CHECK-NEXT: [[ENTRY:.*:]]
285+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x i32>, ptr addrspace(1) [[ARG0]], align 32
286+
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
287+
; CHECK: [[THEN]]:
288+
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <4 x i32> [[VAL0]], <4 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
289+
; CHECK-NEXT: br label %[[FINALLY:.*]]
290+
; CHECK: [[ELSE]]:
291+
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <4 x i32> [[VAL0]], <4 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
292+
; CHECK-NEXT: br label %[[FINALLY]]
293+
; CHECK: [[FINALLY]]:
294+
; CHECK-NEXT: [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
295+
; CHECK-NEXT: ret <4 x i32> [[VAL3]]
296+
;
297+
entry:
298+
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
299+
br i1 %cond, label %then, label %else
300+
301+
then:
302+
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
303+
br label %finally
304+
305+
else:
306+
%val2 = shufflevector <4 x i32> %val0, <4 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
307+
br label %finally
308+
309+
finally:
310+
%val3 = phi <4 x i32> [ %val1, %then ], [ %val2, %else ]
311+
ret <4 x i32> %val3
312+
}
313+
314+
define <8 x i32> @shuffle_v4_v8i32_cond_r1_2(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
315+
; CHECK-LABEL: define <8 x i32> @shuffle_v4_v8i32_cond_r1_2(
316+
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
317+
; CHECK-NEXT: [[ENTRY:.*:]]
318+
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x i32>, ptr addrspace(1) [[ARG0]], align 32
319+
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
320+
; CHECK: [[THEN]]:
321+
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <4 x i32> [[VAL0]], <4 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
322+
; CHECK-NEXT: br label %[[FINALLY:.*]]
323+
; CHECK: [[ELSE]]:
324+
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <4 x i32> [[VAL0]], <4 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
325+
; CHECK-NEXT: br label %[[FINALLY]]
326+
; CHECK: [[FINALLY]]:
327+
; CHECK-NEXT: [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
328+
; CHECK-NEXT: ret <8 x i32> [[VAL3]]
329+
;
330+
entry:
331+
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
332+
br i1 %cond, label %then, label %else
333+
334+
then:
335+
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
336+
br label %finally
337+
338+
else:
339+
%val2 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
340+
br label %finally
341+
342+
finally:
343+
%val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
344+
ret <8 x i32> %val3
345+
}

0 commit comments

Comments
 (0)