xref: /llvm-project/llvm/test/Transforms/VectorCombine/X86/scalarize-vector-gep.ll (revision 1650f1b3d7f97ca95eb930984e74bdfd91b02b4e)
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
3; RUN: opt < %s -passes=vector-combine -S -mtriple=x86_64-- -mattr=AVX2 | FileCheck %s --check-prefixes=CHECK
4
5target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
6
7declare void @use(ptr)
8
9;-------------------------------------------------------------------------------
10
11define void @both_operands_need_extraction.2elts(<2 x ptr> %baseptrs, <2 x i64> %indices) {
12; CHECK-LABEL: @both_operands_need_extraction.2elts(
13; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <2 x ptr> [[BASEPTRS:%.*]], <2 x i64> [[INDICES:%.*]]
14; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
15; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
16; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
17; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
18; CHECK-NEXT:    ret void
19;
20  %ptrs = getelementptr inbounds i64, <2 x ptr> %baseptrs, <2 x i64> %indices
21
22  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
23  call void @use(ptr %ptr.0)
24
25  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
26  call void @use(ptr %ptr.1)
27
28  ret void
29}
30
31define void @both_operands_need_extraction.3elts(<3 x ptr> %baseptrs, <3 x i64> %indices) {
32; CHECK-LABEL: @both_operands_need_extraction.3elts(
33; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS:%.*]], <3 x i64> [[INDICES:%.*]]
34; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
35; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
36; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
37; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
38; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
39; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
40; CHECK-NEXT:    ret void
41;
42  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs, <3 x i64> %indices
43
44  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
45  call void @use(ptr %ptr.0)
46
47  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
48  call void @use(ptr %ptr.1)
49
50  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
51  call void @use(ptr %ptr.2)
52
53  ret void
54}
55
56define void @both_operands_need_extraction.4elts(<4 x ptr> %baseptrs, <4 x i64> %indices) {
57; CHECK-LABEL: @both_operands_need_extraction.4elts(
58; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <4 x ptr> [[BASEPTRS:%.*]], <4 x i64> [[INDICES:%.*]]
59; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 0
60; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
61; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 1
62; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
63; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 2
64; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
65; CHECK-NEXT:    [[PTR_3:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 3
66; CHECK-NEXT:    call void @use(ptr [[PTR_3]])
67; CHECK-NEXT:    ret void
68;
69  %ptrs = getelementptr inbounds i64, <4 x ptr> %baseptrs, <4 x i64> %indices
70
71  %ptr.0 = extractelement <4 x ptr> %ptrs, i64 0
72  call void @use(ptr %ptr.0)
73
74  %ptr.1 = extractelement <4 x ptr> %ptrs, i64 1
75  call void @use(ptr %ptr.1)
76
77  %ptr.2 = extractelement <4 x ptr> %ptrs, i64 2
78  call void @use(ptr %ptr.2)
79
80  %ptr.3 = extractelement <4 x ptr> %ptrs, i64 3
81  call void @use(ptr %ptr.3)
82
83  ret void
84}
85
86;-------------------------------------------------------------------------------
87
88define void @indices_need_extraction.2elts(ptr %baseptr, <2 x i64> %indices) {
89; CHECK-LABEL: @indices_need_extraction.2elts(
90; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, ptr [[BASEPTR:%.*]], <2 x i64> [[INDICES:%.*]]
91; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
92; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
93; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
94; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
95; CHECK-NEXT:    ret void
96;
97  %ptrs = getelementptr inbounds i64, ptr %baseptr, <2 x i64> %indices
98
99  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
100  call void @use(ptr %ptr.0)
101
102  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
103  call void @use(ptr %ptr.1)
104
105  ret void
106}
107
108define void @indices_need_extraction.3elts(ptr %baseptr, <3 x i64> %indices) {
109; CHECK-LABEL: @indices_need_extraction.3elts(
110; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, ptr [[BASEPTR:%.*]], <3 x i64> [[INDICES:%.*]]
111; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
112; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
113; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
114; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
115; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
116; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
117; CHECK-NEXT:    ret void
118;
119  %ptrs = getelementptr inbounds i64, ptr %baseptr, <3 x i64> %indices
120
121  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
122  call void @use(ptr %ptr.0)
123
124  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
125  call void @use(ptr %ptr.1)
126
127  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
128  call void @use(ptr %ptr.2)
129
130  ret void
131}
132
133define void @indices_need_extraction.4elts(ptr %baseptr, <4 x i64> %indices) {
134; CHECK-LABEL: @indices_need_extraction.4elts(
135; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, ptr [[BASEPTR:%.*]], <4 x i64> [[INDICES:%.*]]
136; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 0
137; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
138; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 1
139; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
140; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 2
141; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
142; CHECK-NEXT:    [[PTR_3:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 3
143; CHECK-NEXT:    call void @use(ptr [[PTR_3]])
144; CHECK-NEXT:    ret void
145;
146  %ptrs = getelementptr inbounds i64, ptr %baseptr, <4 x i64> %indices
147
148  %ptr.0 = extractelement <4 x ptr> %ptrs, i64 0
149  call void @use(ptr %ptr.0)
150
151  %ptr.1 = extractelement <4 x ptr> %ptrs, i64 1
152  call void @use(ptr %ptr.1)
153
154  %ptr.2 = extractelement <4 x ptr> %ptrs, i64 2
155  call void @use(ptr %ptr.2)
156
157  %ptr.3 = extractelement <4 x ptr> %ptrs, i64 3
158  call void @use(ptr %ptr.3)
159
160  ret void
161}
162
163;-------------------------------------------------------------------------------
164
165define void @baseptrs_need_extraction.2elts(<2 x ptr> %baseptrs, i64 %indice) {
166; CHECK-LABEL: @baseptrs_need_extraction.2elts(
167; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <2 x ptr> [[BASEPTRS:%.*]], i64 [[INDICE:%.*]]
168; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
169; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
170; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
171; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
172; CHECK-NEXT:    ret void
173;
174  %ptrs = getelementptr inbounds i64, <2 x ptr> %baseptrs, i64 %indice
175
176  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
177  call void @use(ptr %ptr.0)
178
179  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
180  call void @use(ptr %ptr.1)
181
182  ret void
183}
184
185define void @baseptrs_need_extraction.3elts(<3 x ptr> %baseptrs, i64 %indice) {
186; CHECK-LABEL: @baseptrs_need_extraction.3elts(
187; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS:%.*]], i64 [[INDICE:%.*]]
188; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
189; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
190; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
191; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
192; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
193; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
194; CHECK-NEXT:    ret void
195;
196  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs, i64 %indice
197
198  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
199  call void @use(ptr %ptr.0)
200
201  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
202  call void @use(ptr %ptr.1)
203
204  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
205  call void @use(ptr %ptr.2)
206
207  ret void
208}
209
210define void @baseptrs_need_extraction.4elts(<4 x ptr> %baseptrs, i64 %indice) {
211; CHECK-LABEL: @baseptrs_need_extraction.4elts(
212; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <4 x ptr> [[BASEPTRS:%.*]], i64 [[INDICE:%.*]]
213; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 0
214; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
215; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 1
216; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
217; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 2
218; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
219; CHECK-NEXT:    [[PTR_3:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 3
220; CHECK-NEXT:    call void @use(ptr [[PTR_3]])
221; CHECK-NEXT:    ret void
222;
223  %ptrs = getelementptr inbounds i64, <4 x ptr> %baseptrs, i64 %indice
224
225  %ptr.0 = extractelement <4 x ptr> %ptrs, i64 0
226  call void @use(ptr %ptr.0)
227
228  %ptr.1 = extractelement <4 x ptr> %ptrs, i64 1
229  call void @use(ptr %ptr.1)
230
231  %ptr.2 = extractelement <4 x ptr> %ptrs, i64 2
232  call void @use(ptr %ptr.2)
233
234  %ptr.3 = extractelement <4 x ptr> %ptrs, i64 3
235  call void @use(ptr %ptr.3)
236
237  ret void
238}
239
240;-------------------------------------------------------------------------------
241
242define void @first_baseptr_is_known.2elts(<2 x ptr> %baseptrs, ptr %second_baseptr, <2 x i64> %indices) {
243; CHECK-LABEL: @first_baseptr_is_known.2elts(
244; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <2 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
245; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <2 x ptr> [[BASEPTRS_NEW]], <2 x i64> [[INDICES:%.*]]
246; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
247; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
248; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
249; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
250; CHECK-NEXT:    ret void
251;
252  %baseptrs.new = insertelement <2 x ptr> %baseptrs, ptr %second_baseptr, i64 0
253  %ptrs = getelementptr inbounds i64, <2 x ptr> %baseptrs.new, <2 x i64> %indices
254
255  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
256  call void @use(ptr %ptr.0)
257
258  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
259  call void @use(ptr %ptr.1)
260
261  ret void
262}
263
264define void @first_indice_is_known.2elts(<2 x ptr> %baseptrs, <2 x i64> %indices, i64 %second_indice) {
265; CHECK-LABEL: @first_indice_is_known.2elts(
266; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <2 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
267; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <2 x ptr> [[BASEPTRS:%.*]], <2 x i64> [[INDICES_NEW]]
268; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
269; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
270; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
271; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
272; CHECK-NEXT:    ret void
273;
274  %indices.new = insertelement <2 x i64> %indices, i64 %second_indice, i64 0
275  %ptrs = getelementptr inbounds i64, <2 x ptr> %baseptrs, <2 x i64> %indices.new
276
277  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
278  call void @use(ptr %ptr.0)
279
280  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
281  call void @use(ptr %ptr.1)
282
283  ret void
284}
285
286define void @first_indice_and_baseptr_are_known.2elts(<2 x ptr> %baseptrs, ptr %second_baseptr, <2 x i64> %indices, i64 %second_indice) {
287; CHECK-LABEL: @first_indice_and_baseptr_are_known.2elts(
288; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <2 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
289; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <2 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
290; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <2 x ptr> [[BASEPTRS_NEW]], <2 x i64> [[INDICES_NEW]]
291; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
292; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
293; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
294; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
295; CHECK-NEXT:    ret void
296;
297  %baseptrs.new = insertelement <2 x ptr> %baseptrs, ptr %second_baseptr, i64 0
298  %indices.new = insertelement <2 x i64> %indices, i64 %second_indice, i64 0
299  %ptrs = getelementptr inbounds i64, <2 x ptr> %baseptrs.new, <2 x i64> %indices.new
300
301  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
302  call void @use(ptr %ptr.0)
303
304  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
305  call void @use(ptr %ptr.1)
306
307  ret void
308}
309
310;-------------------------------------------------------------------------------
311
312define void @first_baseptr_is_known.3elts(<3 x ptr> %baseptrs, ptr %second_baseptr, <3 x i64> %indices) {
313; CHECK-LABEL: @first_baseptr_is_known.3elts(
314; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
315; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES:%.*]]
316; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
317; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
318; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
319; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
320; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
321; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
322; CHECK-NEXT:    ret void
323;
324  %baseptrs.new = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
325  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices
326
327  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
328  call void @use(ptr %ptr.0)
329
330  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
331  call void @use(ptr %ptr.1)
332
333  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
334  call void @use(ptr %ptr.2)
335
336  ret void
337}
338
339define void @first_indice_is_known.3elts(<3 x ptr> %baseptrs, <3 x i64> %indices, i64 %second_indice) {
340; CHECK-LABEL: @first_indice_is_known.3elts(
341; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
342; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS:%.*]], <3 x i64> [[INDICES_NEW]]
343; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
344; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
345; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
346; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
347; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
348; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
349; CHECK-NEXT:    ret void
350;
351  %indices.new = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
352  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs, <3 x i64> %indices.new
353
354  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
355  call void @use(ptr %ptr.0)
356
357  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
358  call void @use(ptr %ptr.1)
359
360  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
361  call void @use(ptr %ptr.2)
362
363  ret void
364}
365
366define void @first_indice_and_baseptr_are_known.3elts(<3 x ptr> %baseptrs, ptr %second_baseptr, <3 x i64> %indices, i64 %second_indice) {
367; CHECK-LABEL: @first_indice_and_baseptr_are_known.3elts(
368; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
369; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
370; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES_NEW]]
371; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
372; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
373; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
374; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
375; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
376; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
377; CHECK-NEXT:    ret void
378;
379  %baseptrs.new = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
380  %indices.new = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
381  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices.new
382
383  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
384  call void @use(ptr %ptr.0)
385
386  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
387  call void @use(ptr %ptr.1)
388
389  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
390  call void @use(ptr %ptr.2)
391
392  ret void
393}
394
395;-------------------------------------------------------------------------------
396
397define void @first_two_baseptrs_is_known.3elts(<3 x ptr> %baseptrs, ptr %second_baseptr, ptr %third_baseptr, <3 x i64> %indices) {
398; CHECK-LABEL: @first_two_baseptrs_is_known.3elts(
399; CHECK-NEXT:    [[BASEPTRS_NEW_TMP:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
400; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS_NEW_TMP]], ptr [[THIRD_BASEPTR:%.*]], i64 1
401; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES:%.*]]
402; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
403; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
404; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
405; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
406; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
407; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
408; CHECK-NEXT:    ret void
409;
410  %baseptrs.new.tmp = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
411  %baseptrs.new = insertelement <3 x ptr> %baseptrs.new.tmp, ptr %third_baseptr, i64 1
412  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices
413
414  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
415  call void @use(ptr %ptr.0)
416
417  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
418  call void @use(ptr %ptr.1)
419
420  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
421  call void @use(ptr %ptr.2)
422
423  ret void
424}
425
426define void @first_two_indices_is_known.3elts(<3 x ptr> %baseptrs, <3 x i64> %indices, i64 %second_indice, i64 %third_indice) {
427; CHECK-LABEL: @first_two_indices_is_known.3elts(
428; CHECK-NEXT:    [[INDICES_NEW_TMP:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
429; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES_NEW_TMP]], i64 [[THIRD_INDICE:%.*]], i64 1
430; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS:%.*]], <3 x i64> [[INDICES_NEW]]
431; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
432; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
433; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
434; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
435; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
436; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
437; CHECK-NEXT:    ret void
438;
439  %indices.new.tmp = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
440  %indices.new = insertelement <3 x i64> %indices.new.tmp, i64 %third_indice, i64 1
441  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs, <3 x i64> %indices.new
442
443  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
444  call void @use(ptr %ptr.0)
445
446  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
447  call void @use(ptr %ptr.1)
448
449  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
450  call void @use(ptr %ptr.2)
451
452  ret void
453}
454
455define void @first_two_indices_and_first_two_baseptrs_are_known.3elts(<3 x ptr> %baseptrs, ptr %second_baseptr, ptr %third_baseptr, <3 x i64> %indices, i64 %second_indice, i64 %third_indice) {
456; CHECK-LABEL: @first_two_indices_and_first_two_baseptrs_are_known.3elts(
457; CHECK-NEXT:    [[BASEPTRS_NEW_TMP:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
458; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS_NEW_TMP]], ptr [[THIRD_BASEPTR:%.*]], i64 1
459; CHECK-NEXT:    [[INDICES_NEW_TMP:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
460; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES_NEW_TMP]], i64 [[THIRD_INDICE:%.*]], i64 1
461; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES_NEW]]
462; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
463; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
464; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
465; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
466; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
467; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
468; CHECK-NEXT:    ret void
469;
470  %baseptrs.new.tmp = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
471  %baseptrs.new = insertelement <3 x ptr> %baseptrs.new.tmp, ptr %third_baseptr, i64 1
472  %indices.new.tmp = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
473  %indices.new = insertelement <3 x i64> %indices.new.tmp, i64 %third_indice, i64 1
474  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices.new
475
476  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
477  call void @use(ptr %ptr.0)
478
479  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
480  call void @use(ptr %ptr.1)
481
482  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
483  call void @use(ptr %ptr.2)
484
485  ret void
486}
487
488;-------------------------------------------------------------------------------
489
490define void @first_two_baseptrs_is_knownequal.3elts(<3 x ptr> %baseptrs, ptr %second_baseptr, <3 x i64> %indices) {
491; CHECK-LABEL: @first_two_baseptrs_is_knownequal.3elts(
492; CHECK-NEXT:    [[BASEPTRS_NEW_TMP:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
493; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS_NEW_TMP]], ptr [[SECOND_BASEPTR]], i64 1
494; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES:%.*]]
495; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
496; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
497; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
498; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
499; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
500; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
501; CHECK-NEXT:    ret void
502;
503  %baseptrs.new.tmp = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
504  %baseptrs.new = insertelement <3 x ptr> %baseptrs.new.tmp, ptr %second_baseptr, i64 1
505  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices
506
507  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
508  call void @use(ptr %ptr.0)
509
510  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
511  call void @use(ptr %ptr.1)
512
513  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
514  call void @use(ptr %ptr.2)
515
516  ret void
517}
518
519define void @first_two_indices_is_knownequal.3elts(<3 x ptr> %baseptrs, <3 x i64> %indices, i64 %second_indice) {
520; CHECK-LABEL: @first_two_indices_is_knownequal.3elts(
521; CHECK-NEXT:    [[INDICES_NEW_TMP:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
522; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES_NEW_TMP]], i64 [[SECOND_INDICE]], i64 1
523; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS:%.*]], <3 x i64> [[INDICES_NEW]]
524; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
525; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
526; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
527; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
528; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
529; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
530; CHECK-NEXT:    ret void
531;
532  %indices.new.tmp = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
533  %indices.new = insertelement <3 x i64> %indices.new.tmp, i64 %second_indice, i64 1
534  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs, <3 x i64> %indices.new
535
536  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
537  call void @use(ptr %ptr.0)
538
539  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
540  call void @use(ptr %ptr.1)
541
542  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
543  call void @use(ptr %ptr.2)
544
545  ret void
546}
547
548define void @first_two_indices_and_first_two_baseptrs_are_knownequal.3elts(<3 x ptr> %baseptrs, ptr %second_baseptr, <3 x i64> %indices, i64 %second_indice) {
549; CHECK-LABEL: @first_two_indices_and_first_two_baseptrs_are_knownequal.3elts(
550; CHECK-NEXT:    [[BASEPTRS_NEW_TMP:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
551; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS_NEW_TMP]], ptr [[SECOND_BASEPTR]], i64 1
552; CHECK-NEXT:    [[INDICES_NEW_TMP:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
553; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES_NEW_TMP]], i64 [[SECOND_INDICE]], i64 1
554; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES_NEW]]
555; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
556; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
557; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
558; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
559; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
560; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
561; CHECK-NEXT:    ret void
562;
563  %baseptrs.new.tmp = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
564  %baseptrs.new = insertelement <3 x ptr> %baseptrs.new.tmp, ptr %second_baseptr, i64 1
565  %indices.new.tmp = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
566  %indices.new = insertelement <3 x i64> %indices.new.tmp, i64 %second_indice, i64 1
567  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices.new
568
569  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
570  call void @use(ptr %ptr.0)
571
572  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
573  call void @use(ptr %ptr.1)
574
575  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
576  call void @use(ptr %ptr.2)
577
578  ret void
579}
580
581;-------------------------------------------------------------------------------
582
583define void @first_baseptr_is_known.4elts(<4 x ptr> %baseptrs, ptr %second_baseptr, <4 x i64> %indices) {
584; CHECK-LABEL: @first_baseptr_is_known.4elts(
585; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <4 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
586; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <4 x ptr> [[BASEPTRS_NEW]], <4 x i64> [[INDICES:%.*]]
587; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 0
588; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
589; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 1
590; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
591; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 2
592; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
593; CHECK-NEXT:    [[PTR_3:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 3
594; CHECK-NEXT:    call void @use(ptr [[PTR_3]])
595; CHECK-NEXT:    ret void
596;
597  %baseptrs.new = insertelement <4 x ptr> %baseptrs, ptr %second_baseptr, i64 0
598  %ptrs = getelementptr inbounds i64, <4 x ptr> %baseptrs.new, <4 x i64> %indices
599
600  %ptr.0 = extractelement <4 x ptr> %ptrs, i64 0
601  call void @use(ptr %ptr.0)
602
603  %ptr.1 = extractelement <4 x ptr> %ptrs, i64 1
604  call void @use(ptr %ptr.1)
605
606  %ptr.2 = extractelement <4 x ptr> %ptrs, i64 2
607  call void @use(ptr %ptr.2)
608
609  %ptr.3 = extractelement <4 x ptr> %ptrs, i64 3
610  call void @use(ptr %ptr.3)
611
612  ret void
613}
614
615define void @first_indice_is_known.4elts(<4 x ptr> %baseptrs, <4 x i64> %indices, i64 %second_indice) {
616; CHECK-LABEL: @first_indice_is_known.4elts(
617; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <4 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
618; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <4 x ptr> [[BASEPTRS:%.*]], <4 x i64> [[INDICES_NEW]]
619; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 0
620; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
621; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 1
622; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
623; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 2
624; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
625; CHECK-NEXT:    [[PTR_3:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 3
626; CHECK-NEXT:    call void @use(ptr [[PTR_3]])
627; CHECK-NEXT:    ret void
628;
629  %indices.new = insertelement <4 x i64> %indices, i64 %second_indice, i64 0
630  %ptrs = getelementptr inbounds i64, <4 x ptr> %baseptrs, <4 x i64> %indices.new
631
632  %ptr.0 = extractelement <4 x ptr> %ptrs, i64 0
633  call void @use(ptr %ptr.0)
634
635  %ptr.1 = extractelement <4 x ptr> %ptrs, i64 1
636  call void @use(ptr %ptr.1)
637
638  %ptr.2 = extractelement <4 x ptr> %ptrs, i64 2
639  call void @use(ptr %ptr.2)
640
641  %ptr.3 = extractelement <4 x ptr> %ptrs, i64 3
642  call void @use(ptr %ptr.3)
643
644  ret void
645}
646
647define void @first_indice_and_first_baseptr_are_known.4elts(<4 x ptr> %baseptrs, ptr %second_baseptr, <4 x i64> %indices, i64 %second_indice) {
648; CHECK-LABEL: @first_indice_and_first_baseptr_are_known.4elts(
649; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <4 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
650; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <4 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
651; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <4 x ptr> [[BASEPTRS_NEW]], <4 x i64> [[INDICES_NEW]]
652; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 0
653; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
654; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 1
655; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
656; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 2
657; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
658; CHECK-NEXT:    [[PTR_3:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 3
659; CHECK-NEXT:    call void @use(ptr [[PTR_3]])
660; CHECK-NEXT:    ret void
661;
662  %baseptrs.new = insertelement <4 x ptr> %baseptrs, ptr %second_baseptr, i64 0
663  %indices.new = insertelement <4 x i64> %indices, i64 %second_indice, i64 0
664  %ptrs = getelementptr inbounds i64, <4 x ptr> %baseptrs.new, <4 x i64> %indices.new
665
666  %ptr.0 = extractelement <4 x ptr> %ptrs, i64 0
667  call void @use(ptr %ptr.0)
668
669  %ptr.1 = extractelement <4 x ptr> %ptrs, i64 1
670  call void @use(ptr %ptr.1)
671
672  %ptr.2 = extractelement <4 x ptr> %ptrs, i64 2
673  call void @use(ptr %ptr.2)
674
675  %ptr.3 = extractelement <4 x ptr> %ptrs, i64 3
676  call void @use(ptr %ptr.3)
677
678  ret void
679}
680
681;-------------------------------------------------------------------------------
682
683define void @first_two_baseptrs_is_knownequal.4elts(<3 x ptr> %baseptrs, ptr %second_baseptr, <3 x i64> %indices) {
684; CHECK-LABEL: @first_two_baseptrs_is_knownequal.4elts(
685; CHECK-NEXT:    [[BASEPTRS_NEW_TMP:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
686; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS_NEW_TMP]], ptr [[SECOND_BASEPTR]], i64 1
687; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES:%.*]]
688; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
689; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
690; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
691; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
692; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
693; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
694; CHECK-NEXT:    ret void
695;
696  %baseptrs.new.tmp = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
697  %baseptrs.new = insertelement <3 x ptr> %baseptrs.new.tmp, ptr %second_baseptr, i64 1
698  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices
699
700  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
701  call void @use(ptr %ptr.0)
702
703  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
704  call void @use(ptr %ptr.1)
705
706  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
707  call void @use(ptr %ptr.2)
708
709  ret void
710}
711
712define void @first_two_indices_is_knownequal.4elts(<3 x ptr> %baseptrs, <3 x i64> %indices, i64 %second_indice) {
713; CHECK-LABEL: @first_two_indices_is_knownequal.4elts(
714; CHECK-NEXT:    [[INDICES_NEW_TMP:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
715; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES_NEW_TMP]], i64 [[SECOND_INDICE]], i64 1
716; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS:%.*]], <3 x i64> [[INDICES_NEW]]
717; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
718; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
719; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
720; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
721; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
722; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
723; CHECK-NEXT:    ret void
724;
725  %indices.new.tmp = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
726  %indices.new = insertelement <3 x i64> %indices.new.tmp, i64 %second_indice, i64 1
727  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs, <3 x i64> %indices.new
728
729  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
730  call void @use(ptr %ptr.0)
731
732  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
733  call void @use(ptr %ptr.1)
734
735  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
736  call void @use(ptr %ptr.2)
737
738  ret void
739}
740
741define void @first_two_indices_and_first_two_baseptrs_are_knownequal.4elts(<3 x ptr> %baseptrs, ptr %second_baseptr, <3 x i64> %indices, i64 %second_indice) {
742; CHECK-LABEL: @first_two_indices_and_first_two_baseptrs_are_knownequal.4elts(
743; CHECK-NEXT:    [[BASEPTRS_NEW_TMP:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
744; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS_NEW_TMP]], ptr [[SECOND_BASEPTR]], i64 1
745; CHECK-NEXT:    [[INDICES_NEW_TMP:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
746; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES_NEW_TMP]], i64 [[SECOND_INDICE]], i64 1
747; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES_NEW]]
748; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
749; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
750; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
751; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
752; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
753; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
754; CHECK-NEXT:    ret void
755;
756  %baseptrs.new.tmp = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
757  %baseptrs.new = insertelement <3 x ptr> %baseptrs.new.tmp, ptr %second_baseptr, i64 1
758  %indices.new.tmp = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
759  %indices.new = insertelement <3 x i64> %indices.new.tmp, i64 %second_indice, i64 1
760  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices.new
761
762  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
763  call void @use(ptr %ptr.0)
764
765  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
766  call void @use(ptr %ptr.1)
767
768  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
769  call void @use(ptr %ptr.2)
770
771  ret void
772}
773
774;===============================================================================
775
776define <2 x ptr> @first_indice_and_baseptr_need_extraction.2elts.extrause(<2 x ptr> %baseptrs, ptr %second_baseptr, <2 x i64> %indices, i64 %second_indice) {
777; CHECK-LABEL: @first_indice_and_baseptr_need_extraction.2elts.extrause(
778; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <2 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
779; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <2 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
780; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <2 x ptr> [[BASEPTRS_NEW]], <2 x i64> [[INDICES_NEW]]
781; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
782; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
783; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
784; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
785; CHECK-NEXT:    ret <2 x ptr> [[PTRS]]
786;
787  %baseptrs.new = insertelement <2 x ptr> %baseptrs, ptr %second_baseptr, i64 0
788  %indices.new = insertelement <2 x i64> %indices, i64 %second_indice, i64 0
789  %ptrs = getelementptr inbounds i64, <2 x ptr> %baseptrs.new, <2 x i64> %indices.new
790
791  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
792  call void @use(ptr %ptr.0)
793
794  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
795  call void @use(ptr %ptr.1)
796
797  ret <2 x ptr> %ptrs
798}
799
800define ptr @first_indice_and_baseptr_need_extraction.2elts.variable_extraction(<2 x ptr> %baseptrs, ptr %second_baseptr, <2 x i64> %indices, i64 %second_indice, i64 %variable_extract_idx) {
801; CHECK-LABEL: @first_indice_and_baseptr_need_extraction.2elts.variable_extraction(
802; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <2 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
803; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <2 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
804; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <2 x ptr> [[BASEPTRS_NEW]], <2 x i64> [[INDICES_NEW]]
805; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
806; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
807; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
808; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
809; CHECK-NEXT:    [[PTR_VAR:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 [[VARIABLE_EXTRACT_IDX:%.*]]
810; CHECK-NEXT:    ret ptr [[PTR_VAR]]
811;
812  %baseptrs.new = insertelement <2 x ptr> %baseptrs, ptr %second_baseptr, i64 0
813  %indices.new = insertelement <2 x i64> %indices, i64 %second_indice, i64 0
814  %ptrs = getelementptr inbounds i64, <2 x ptr> %baseptrs.new, <2 x i64> %indices.new
815
816  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
817  call void @use(ptr %ptr.0)
818
819  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
820  call void @use(ptr %ptr.1)
821
822  %ptr.var = extractelement <2 x ptr> %ptrs, i64 %variable_extract_idx
823
824  ret ptr %ptr.var
825}
826