xref: /llvm-project/llvm/test/Transforms/VectorCombine/X86/scalarize-vector-gep.ll (revision 1650f1b3d7f97ca95eb930984e74bdfd91b02b4e)
16526fa35SRoman Lebedev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
25e4dbd7aSBjorn Pettersson; RUN: opt < %s -passes=vector-combine -S -mtriple=x86_64-- -mattr=SSE2 | FileCheck %s --check-prefixes=CHECK
35e4dbd7aSBjorn Pettersson; RUN: opt < %s -passes=vector-combine -S -mtriple=x86_64-- -mattr=AVX2 | FileCheck %s --check-prefixes=CHECK
46526fa35SRoman Lebedev
56526fa35SRoman Lebedevtarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
66526fa35SRoman Lebedev
7c00ffbe0SNikita Popovdeclare void @use(ptr)
86526fa35SRoman Lebedev
96526fa35SRoman Lebedev;-------------------------------------------------------------------------------
106526fa35SRoman Lebedev
11c00ffbe0SNikita Popovdefine void @both_operands_need_extraction.2elts(<2 x ptr> %baseptrs, <2 x i64> %indices) {
126526fa35SRoman Lebedev; CHECK-LABEL: @both_operands_need_extraction.2elts(
13c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <2 x ptr> [[BASEPTRS:%.*]], <2 x i64> [[INDICES:%.*]]
14c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
15c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
16c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
17c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
186526fa35SRoman Lebedev; CHECK-NEXT:    ret void
196526fa35SRoman Lebedev;
20c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <2 x ptr> %baseptrs, <2 x i64> %indices
216526fa35SRoman Lebedev
22c00ffbe0SNikita Popov  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
23c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
246526fa35SRoman Lebedev
25c00ffbe0SNikita Popov  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
26c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
276526fa35SRoman Lebedev
286526fa35SRoman Lebedev  ret void
296526fa35SRoman Lebedev}
306526fa35SRoman Lebedev
31c00ffbe0SNikita Popovdefine void @both_operands_need_extraction.3elts(<3 x ptr> %baseptrs, <3 x i64> %indices) {
326526fa35SRoman Lebedev; CHECK-LABEL: @both_operands_need_extraction.3elts(
33c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS:%.*]], <3 x i64> [[INDICES:%.*]]
34c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
35c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
36c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
37c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
38c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
39c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
406526fa35SRoman Lebedev; CHECK-NEXT:    ret void
416526fa35SRoman Lebedev;
42c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs, <3 x i64> %indices
436526fa35SRoman Lebedev
44c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
45c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
466526fa35SRoman Lebedev
47c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
48c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
496526fa35SRoman Lebedev
50c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
51c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
526526fa35SRoman Lebedev
536526fa35SRoman Lebedev  ret void
546526fa35SRoman Lebedev}
556526fa35SRoman Lebedev
56c00ffbe0SNikita Popovdefine void @both_operands_need_extraction.4elts(<4 x ptr> %baseptrs, <4 x i64> %indices) {
576526fa35SRoman Lebedev; CHECK-LABEL: @both_operands_need_extraction.4elts(
58c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <4 x ptr> [[BASEPTRS:%.*]], <4 x i64> [[INDICES:%.*]]
59c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 0
60c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
61c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 1
62c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
63c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 2
64c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
65c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_3:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 3
66c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_3]])
676526fa35SRoman Lebedev; CHECK-NEXT:    ret void
686526fa35SRoman Lebedev;
69c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <4 x ptr> %baseptrs, <4 x i64> %indices
706526fa35SRoman Lebedev
71c00ffbe0SNikita Popov  %ptr.0 = extractelement <4 x ptr> %ptrs, i64 0
72c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
736526fa35SRoman Lebedev
74c00ffbe0SNikita Popov  %ptr.1 = extractelement <4 x ptr> %ptrs, i64 1
75c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
766526fa35SRoman Lebedev
77c00ffbe0SNikita Popov  %ptr.2 = extractelement <4 x ptr> %ptrs, i64 2
78c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
796526fa35SRoman Lebedev
80c00ffbe0SNikita Popov  %ptr.3 = extractelement <4 x ptr> %ptrs, i64 3
81c00ffbe0SNikita Popov  call void @use(ptr %ptr.3)
826526fa35SRoman Lebedev
836526fa35SRoman Lebedev  ret void
846526fa35SRoman Lebedev}
856526fa35SRoman Lebedev
866526fa35SRoman Lebedev;-------------------------------------------------------------------------------
876526fa35SRoman Lebedev
88*1650f1b3SJay Foaddefine void @indices_need_extraction.2elts(ptr %baseptr, <2 x i64> %indices) {
89*1650f1b3SJay Foad; CHECK-LABEL: @indices_need_extraction.2elts(
90c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, ptr [[BASEPTR:%.*]], <2 x i64> [[INDICES:%.*]]
91c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
92c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
93c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
94c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
956526fa35SRoman Lebedev; CHECK-NEXT:    ret void
966526fa35SRoman Lebedev;
97c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, ptr %baseptr, <2 x i64> %indices
986526fa35SRoman Lebedev
99c00ffbe0SNikita Popov  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
100c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
1016526fa35SRoman Lebedev
102c00ffbe0SNikita Popov  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
103c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
1046526fa35SRoman Lebedev
1056526fa35SRoman Lebedev  ret void
1066526fa35SRoman Lebedev}
1076526fa35SRoman Lebedev
108*1650f1b3SJay Foaddefine void @indices_need_extraction.3elts(ptr %baseptr, <3 x i64> %indices) {
109*1650f1b3SJay Foad; CHECK-LABEL: @indices_need_extraction.3elts(
110c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, ptr [[BASEPTR:%.*]], <3 x i64> [[INDICES:%.*]]
111c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
112c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
113c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
114c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
115c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
116c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
1176526fa35SRoman Lebedev; CHECK-NEXT:    ret void
1186526fa35SRoman Lebedev;
119c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, ptr %baseptr, <3 x i64> %indices
1206526fa35SRoman Lebedev
121c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
122c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
1236526fa35SRoman Lebedev
124c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
125c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
1266526fa35SRoman Lebedev
127c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
128c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
1296526fa35SRoman Lebedev
1306526fa35SRoman Lebedev  ret void
1316526fa35SRoman Lebedev}
1326526fa35SRoman Lebedev
133*1650f1b3SJay Foaddefine void @indices_need_extraction.4elts(ptr %baseptr, <4 x i64> %indices) {
134*1650f1b3SJay Foad; CHECK-LABEL: @indices_need_extraction.4elts(
135c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, ptr [[BASEPTR:%.*]], <4 x i64> [[INDICES:%.*]]
136c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 0
137c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
138c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 1
139c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
140c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 2
141c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
142c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_3:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 3
143c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_3]])
1446526fa35SRoman Lebedev; CHECK-NEXT:    ret void
1456526fa35SRoman Lebedev;
146c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, ptr %baseptr, <4 x i64> %indices
1476526fa35SRoman Lebedev
148c00ffbe0SNikita Popov  %ptr.0 = extractelement <4 x ptr> %ptrs, i64 0
149c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
1506526fa35SRoman Lebedev
151c00ffbe0SNikita Popov  %ptr.1 = extractelement <4 x ptr> %ptrs, i64 1
152c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
1536526fa35SRoman Lebedev
154c00ffbe0SNikita Popov  %ptr.2 = extractelement <4 x ptr> %ptrs, i64 2
155c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
1566526fa35SRoman Lebedev
157c00ffbe0SNikita Popov  %ptr.3 = extractelement <4 x ptr> %ptrs, i64 3
158c00ffbe0SNikita Popov  call void @use(ptr %ptr.3)
1596526fa35SRoman Lebedev
1606526fa35SRoman Lebedev  ret void
1616526fa35SRoman Lebedev}
1626526fa35SRoman Lebedev
1636526fa35SRoman Lebedev;-------------------------------------------------------------------------------
1646526fa35SRoman Lebedev
165c00ffbe0SNikita Popovdefine void @baseptrs_need_extraction.2elts(<2 x ptr> %baseptrs, i64 %indice) {
1666526fa35SRoman Lebedev; CHECK-LABEL: @baseptrs_need_extraction.2elts(
167c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <2 x ptr> [[BASEPTRS:%.*]], i64 [[INDICE:%.*]]
168c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
169c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
170c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
171c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
1726526fa35SRoman Lebedev; CHECK-NEXT:    ret void
1736526fa35SRoman Lebedev;
174c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <2 x ptr> %baseptrs, i64 %indice
1756526fa35SRoman Lebedev
176c00ffbe0SNikita Popov  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
177c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
1786526fa35SRoman Lebedev
179c00ffbe0SNikita Popov  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
180c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
1816526fa35SRoman Lebedev
1826526fa35SRoman Lebedev  ret void
1836526fa35SRoman Lebedev}
1846526fa35SRoman Lebedev
185c00ffbe0SNikita Popovdefine void @baseptrs_need_extraction.3elts(<3 x ptr> %baseptrs, i64 %indice) {
1866526fa35SRoman Lebedev; CHECK-LABEL: @baseptrs_need_extraction.3elts(
187c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS:%.*]], i64 [[INDICE:%.*]]
188c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
189c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
190c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
191c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
192c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
193c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
1946526fa35SRoman Lebedev; CHECK-NEXT:    ret void
1956526fa35SRoman Lebedev;
196c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs, i64 %indice
1976526fa35SRoman Lebedev
198c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
199c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
2006526fa35SRoman Lebedev
201c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
202c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
2036526fa35SRoman Lebedev
204c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
205c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
2066526fa35SRoman Lebedev
2076526fa35SRoman Lebedev  ret void
2086526fa35SRoman Lebedev}
2096526fa35SRoman Lebedev
210c00ffbe0SNikita Popovdefine void @baseptrs_need_extraction.4elts(<4 x ptr> %baseptrs, i64 %indice) {
2116526fa35SRoman Lebedev; CHECK-LABEL: @baseptrs_need_extraction.4elts(
212c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <4 x ptr> [[BASEPTRS:%.*]], i64 [[INDICE:%.*]]
213c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 0
214c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
215c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 1
216c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
217c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 2
218c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
219c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_3:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 3
220c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_3]])
2216526fa35SRoman Lebedev; CHECK-NEXT:    ret void
2226526fa35SRoman Lebedev;
223c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <4 x ptr> %baseptrs, i64 %indice
2246526fa35SRoman Lebedev
225c00ffbe0SNikita Popov  %ptr.0 = extractelement <4 x ptr> %ptrs, i64 0
226c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
2276526fa35SRoman Lebedev
228c00ffbe0SNikita Popov  %ptr.1 = extractelement <4 x ptr> %ptrs, i64 1
229c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
2306526fa35SRoman Lebedev
231c00ffbe0SNikita Popov  %ptr.2 = extractelement <4 x ptr> %ptrs, i64 2
232c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
2336526fa35SRoman Lebedev
234c00ffbe0SNikita Popov  %ptr.3 = extractelement <4 x ptr> %ptrs, i64 3
235c00ffbe0SNikita Popov  call void @use(ptr %ptr.3)
2366526fa35SRoman Lebedev
2376526fa35SRoman Lebedev  ret void
2386526fa35SRoman Lebedev}
2396526fa35SRoman Lebedev
2406526fa35SRoman Lebedev;-------------------------------------------------------------------------------
2416526fa35SRoman Lebedev
242c00ffbe0SNikita Popovdefine void @first_baseptr_is_known.2elts(<2 x ptr> %baseptrs, ptr %second_baseptr, <2 x i64> %indices) {
2436526fa35SRoman Lebedev; CHECK-LABEL: @first_baseptr_is_known.2elts(
244c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <2 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
245c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <2 x ptr> [[BASEPTRS_NEW]], <2 x i64> [[INDICES:%.*]]
246c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
247c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
248c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
249c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
2506526fa35SRoman Lebedev; CHECK-NEXT:    ret void
2516526fa35SRoman Lebedev;
252c00ffbe0SNikita Popov  %baseptrs.new = insertelement <2 x ptr> %baseptrs, ptr %second_baseptr, i64 0
253c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <2 x ptr> %baseptrs.new, <2 x i64> %indices
2546526fa35SRoman Lebedev
255c00ffbe0SNikita Popov  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
256c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
2576526fa35SRoman Lebedev
258c00ffbe0SNikita Popov  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
259c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
2606526fa35SRoman Lebedev
2616526fa35SRoman Lebedev  ret void
2626526fa35SRoman Lebedev}
2636526fa35SRoman Lebedev
264c00ffbe0SNikita Popovdefine void @first_indice_is_known.2elts(<2 x ptr> %baseptrs, <2 x i64> %indices, i64 %second_indice) {
2656526fa35SRoman Lebedev; CHECK-LABEL: @first_indice_is_known.2elts(
2666526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <2 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
267c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <2 x ptr> [[BASEPTRS:%.*]], <2 x i64> [[INDICES_NEW]]
268c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
269c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
270c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
271c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
2726526fa35SRoman Lebedev; CHECK-NEXT:    ret void
2736526fa35SRoman Lebedev;
2746526fa35SRoman Lebedev  %indices.new = insertelement <2 x i64> %indices, i64 %second_indice, i64 0
275c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <2 x ptr> %baseptrs, <2 x i64> %indices.new
2766526fa35SRoman Lebedev
277c00ffbe0SNikita Popov  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
278c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
2796526fa35SRoman Lebedev
280c00ffbe0SNikita Popov  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
281c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
2826526fa35SRoman Lebedev
2836526fa35SRoman Lebedev  ret void
2846526fa35SRoman Lebedev}
2856526fa35SRoman Lebedev
286c00ffbe0SNikita Popovdefine void @first_indice_and_baseptr_are_known.2elts(<2 x ptr> %baseptrs, ptr %second_baseptr, <2 x i64> %indices, i64 %second_indice) {
2876526fa35SRoman Lebedev; CHECK-LABEL: @first_indice_and_baseptr_are_known.2elts(
288c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <2 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
2896526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <2 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
290c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <2 x ptr> [[BASEPTRS_NEW]], <2 x i64> [[INDICES_NEW]]
291c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
292c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
293c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
294c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
2956526fa35SRoman Lebedev; CHECK-NEXT:    ret void
2966526fa35SRoman Lebedev;
297c00ffbe0SNikita Popov  %baseptrs.new = insertelement <2 x ptr> %baseptrs, ptr %second_baseptr, i64 0
2986526fa35SRoman Lebedev  %indices.new = insertelement <2 x i64> %indices, i64 %second_indice, i64 0
299c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <2 x ptr> %baseptrs.new, <2 x i64> %indices.new
3006526fa35SRoman Lebedev
301c00ffbe0SNikita Popov  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
302c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
3036526fa35SRoman Lebedev
304c00ffbe0SNikita Popov  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
305c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
3066526fa35SRoman Lebedev
3076526fa35SRoman Lebedev  ret void
3086526fa35SRoman Lebedev}
3096526fa35SRoman Lebedev
3106526fa35SRoman Lebedev;-------------------------------------------------------------------------------
3116526fa35SRoman Lebedev
312c00ffbe0SNikita Popovdefine void @first_baseptr_is_known.3elts(<3 x ptr> %baseptrs, ptr %second_baseptr, <3 x i64> %indices) {
3136526fa35SRoman Lebedev; CHECK-LABEL: @first_baseptr_is_known.3elts(
314c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
315c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES:%.*]]
316c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
317c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
318c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
319c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
320c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
321c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
3226526fa35SRoman Lebedev; CHECK-NEXT:    ret void
3236526fa35SRoman Lebedev;
324c00ffbe0SNikita Popov  %baseptrs.new = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
325c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices
3266526fa35SRoman Lebedev
327c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
328c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
3296526fa35SRoman Lebedev
330c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
331c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
3326526fa35SRoman Lebedev
333c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
334c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
3356526fa35SRoman Lebedev
3366526fa35SRoman Lebedev  ret void
3376526fa35SRoman Lebedev}
3386526fa35SRoman Lebedev
339c00ffbe0SNikita Popovdefine void @first_indice_is_known.3elts(<3 x ptr> %baseptrs, <3 x i64> %indices, i64 %second_indice) {
3406526fa35SRoman Lebedev; CHECK-LABEL: @first_indice_is_known.3elts(
3416526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
342c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS:%.*]], <3 x i64> [[INDICES_NEW]]
343c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
344c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
345c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
346c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
347c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
348c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
3496526fa35SRoman Lebedev; CHECK-NEXT:    ret void
3506526fa35SRoman Lebedev;
3516526fa35SRoman Lebedev  %indices.new = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
352c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs, <3 x i64> %indices.new
3536526fa35SRoman Lebedev
354c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
355c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
3566526fa35SRoman Lebedev
357c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
358c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
3596526fa35SRoman Lebedev
360c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
361c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
3626526fa35SRoman Lebedev
3636526fa35SRoman Lebedev  ret void
3646526fa35SRoman Lebedev}
3656526fa35SRoman Lebedev
366c00ffbe0SNikita Popovdefine void @first_indice_and_baseptr_are_known.3elts(<3 x ptr> %baseptrs, ptr %second_baseptr, <3 x i64> %indices, i64 %second_indice) {
3676526fa35SRoman Lebedev; CHECK-LABEL: @first_indice_and_baseptr_are_known.3elts(
368c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
3696526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
370c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES_NEW]]
371c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
372c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
373c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
374c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
375c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
376c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
3776526fa35SRoman Lebedev; CHECK-NEXT:    ret void
3786526fa35SRoman Lebedev;
379c00ffbe0SNikita Popov  %baseptrs.new = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
3806526fa35SRoman Lebedev  %indices.new = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
381c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices.new
3826526fa35SRoman Lebedev
383c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
384c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
3856526fa35SRoman Lebedev
386c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
387c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
3886526fa35SRoman Lebedev
389c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
390c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
3916526fa35SRoman Lebedev
3926526fa35SRoman Lebedev  ret void
3936526fa35SRoman Lebedev}
3946526fa35SRoman Lebedev
3956526fa35SRoman Lebedev;-------------------------------------------------------------------------------
3966526fa35SRoman Lebedev
397c00ffbe0SNikita Popovdefine void @first_two_baseptrs_is_known.3elts(<3 x ptr> %baseptrs, ptr %second_baseptr, ptr %third_baseptr, <3 x i64> %indices) {
3986526fa35SRoman Lebedev; CHECK-LABEL: @first_two_baseptrs_is_known.3elts(
399c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW_TMP:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
400c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS_NEW_TMP]], ptr [[THIRD_BASEPTR:%.*]], i64 1
401c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES:%.*]]
402c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
403c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
404c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
405c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
406c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
407c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
4086526fa35SRoman Lebedev; CHECK-NEXT:    ret void
4096526fa35SRoman Lebedev;
410c00ffbe0SNikita Popov  %baseptrs.new.tmp = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
411c00ffbe0SNikita Popov  %baseptrs.new = insertelement <3 x ptr> %baseptrs.new.tmp, ptr %third_baseptr, i64 1
412c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices
4136526fa35SRoman Lebedev
414c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
415c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
4166526fa35SRoman Lebedev
417c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
418c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
4196526fa35SRoman Lebedev
420c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
421c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
4226526fa35SRoman Lebedev
4236526fa35SRoman Lebedev  ret void
4246526fa35SRoman Lebedev}
4256526fa35SRoman Lebedev
426c00ffbe0SNikita Popovdefine void @first_two_indices_is_known.3elts(<3 x ptr> %baseptrs, <3 x i64> %indices, i64 %second_indice, i64 %third_indice) {
4276526fa35SRoman Lebedev; CHECK-LABEL: @first_two_indices_is_known.3elts(
4286526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW_TMP:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
4296526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES_NEW_TMP]], i64 [[THIRD_INDICE:%.*]], i64 1
430c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS:%.*]], <3 x i64> [[INDICES_NEW]]
431c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
432c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
433c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
434c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
435c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
436c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
4376526fa35SRoman Lebedev; CHECK-NEXT:    ret void
4386526fa35SRoman Lebedev;
4396526fa35SRoman Lebedev  %indices.new.tmp = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
4406526fa35SRoman Lebedev  %indices.new = insertelement <3 x i64> %indices.new.tmp, i64 %third_indice, i64 1
441c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs, <3 x i64> %indices.new
4426526fa35SRoman Lebedev
443c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
444c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
4456526fa35SRoman Lebedev
446c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
447c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
4486526fa35SRoman Lebedev
449c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
450c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
4516526fa35SRoman Lebedev
4526526fa35SRoman Lebedev  ret void
4536526fa35SRoman Lebedev}
4546526fa35SRoman Lebedev
455c00ffbe0SNikita Popovdefine 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) {
4566526fa35SRoman Lebedev; CHECK-LABEL: @first_two_indices_and_first_two_baseptrs_are_known.3elts(
457c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW_TMP:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
458c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS_NEW_TMP]], ptr [[THIRD_BASEPTR:%.*]], i64 1
4596526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW_TMP:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
4606526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES_NEW_TMP]], i64 [[THIRD_INDICE:%.*]], i64 1
461c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES_NEW]]
462c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
463c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
464c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
465c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
466c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
467c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
4686526fa35SRoman Lebedev; CHECK-NEXT:    ret void
4696526fa35SRoman Lebedev;
470c00ffbe0SNikita Popov  %baseptrs.new.tmp = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
471c00ffbe0SNikita Popov  %baseptrs.new = insertelement <3 x ptr> %baseptrs.new.tmp, ptr %third_baseptr, i64 1
4726526fa35SRoman Lebedev  %indices.new.tmp = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
4736526fa35SRoman Lebedev  %indices.new = insertelement <3 x i64> %indices.new.tmp, i64 %third_indice, i64 1
474c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices.new
4756526fa35SRoman Lebedev
476c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
477c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
4786526fa35SRoman Lebedev
479c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
480c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
4816526fa35SRoman Lebedev
482c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
483c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
4846526fa35SRoman Lebedev
4856526fa35SRoman Lebedev  ret void
4866526fa35SRoman Lebedev}
4876526fa35SRoman Lebedev
4886526fa35SRoman Lebedev;-------------------------------------------------------------------------------
4896526fa35SRoman Lebedev
490c00ffbe0SNikita Popovdefine void @first_two_baseptrs_is_knownequal.3elts(<3 x ptr> %baseptrs, ptr %second_baseptr, <3 x i64> %indices) {
4916526fa35SRoman Lebedev; CHECK-LABEL: @first_two_baseptrs_is_knownequal.3elts(
492c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW_TMP:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
493c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS_NEW_TMP]], ptr [[SECOND_BASEPTR]], i64 1
494c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES:%.*]]
495c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
496c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
497c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
498c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
499c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
500c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
5016526fa35SRoman Lebedev; CHECK-NEXT:    ret void
5026526fa35SRoman Lebedev;
503c00ffbe0SNikita Popov  %baseptrs.new.tmp = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
504c00ffbe0SNikita Popov  %baseptrs.new = insertelement <3 x ptr> %baseptrs.new.tmp, ptr %second_baseptr, i64 1
505c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices
5066526fa35SRoman Lebedev
507c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
508c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
5096526fa35SRoman Lebedev
510c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
511c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
5126526fa35SRoman Lebedev
513c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
514c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
5156526fa35SRoman Lebedev
5166526fa35SRoman Lebedev  ret void
5176526fa35SRoman Lebedev}
5186526fa35SRoman Lebedev
519c00ffbe0SNikita Popovdefine void @first_two_indices_is_knownequal.3elts(<3 x ptr> %baseptrs, <3 x i64> %indices, i64 %second_indice) {
5206526fa35SRoman Lebedev; CHECK-LABEL: @first_two_indices_is_knownequal.3elts(
5216526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW_TMP:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
5226526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES_NEW_TMP]], i64 [[SECOND_INDICE]], i64 1
523c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS:%.*]], <3 x i64> [[INDICES_NEW]]
524c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
525c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
526c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
527c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
528c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
529c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
5306526fa35SRoman Lebedev; CHECK-NEXT:    ret void
5316526fa35SRoman Lebedev;
5326526fa35SRoman Lebedev  %indices.new.tmp = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
5336526fa35SRoman Lebedev  %indices.new = insertelement <3 x i64> %indices.new.tmp, i64 %second_indice, i64 1
534c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs, <3 x i64> %indices.new
5356526fa35SRoman Lebedev
536c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
537c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
5386526fa35SRoman Lebedev
539c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
540c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
5416526fa35SRoman Lebedev
542c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
543c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
5446526fa35SRoman Lebedev
5456526fa35SRoman Lebedev  ret void
5466526fa35SRoman Lebedev}
5476526fa35SRoman Lebedev
548c00ffbe0SNikita Popovdefine 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) {
5496526fa35SRoman Lebedev; CHECK-LABEL: @first_two_indices_and_first_two_baseptrs_are_knownequal.3elts(
550c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW_TMP:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
551c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS_NEW_TMP]], ptr [[SECOND_BASEPTR]], i64 1
5526526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW_TMP:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
5536526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES_NEW_TMP]], i64 [[SECOND_INDICE]], i64 1
554c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES_NEW]]
555c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
556c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
557c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
558c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
559c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
560c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
5616526fa35SRoman Lebedev; CHECK-NEXT:    ret void
5626526fa35SRoman Lebedev;
563c00ffbe0SNikita Popov  %baseptrs.new.tmp = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
564c00ffbe0SNikita Popov  %baseptrs.new = insertelement <3 x ptr> %baseptrs.new.tmp, ptr %second_baseptr, i64 1
5656526fa35SRoman Lebedev  %indices.new.tmp = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
5666526fa35SRoman Lebedev  %indices.new = insertelement <3 x i64> %indices.new.tmp, i64 %second_indice, i64 1
567c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices.new
5686526fa35SRoman Lebedev
569c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
570c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
5716526fa35SRoman Lebedev
572c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
573c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
5746526fa35SRoman Lebedev
575c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
576c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
5776526fa35SRoman Lebedev
5786526fa35SRoman Lebedev  ret void
5796526fa35SRoman Lebedev}
5806526fa35SRoman Lebedev
5816526fa35SRoman Lebedev;-------------------------------------------------------------------------------
5826526fa35SRoman Lebedev
583c00ffbe0SNikita Popovdefine void @first_baseptr_is_known.4elts(<4 x ptr> %baseptrs, ptr %second_baseptr, <4 x i64> %indices) {
5846526fa35SRoman Lebedev; CHECK-LABEL: @first_baseptr_is_known.4elts(
585c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <4 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
586c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <4 x ptr> [[BASEPTRS_NEW]], <4 x i64> [[INDICES:%.*]]
587c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 0
588c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
589c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 1
590c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
591c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 2
592c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
593c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_3:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 3
594c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_3]])
5956526fa35SRoman Lebedev; CHECK-NEXT:    ret void
5966526fa35SRoman Lebedev;
597c00ffbe0SNikita Popov  %baseptrs.new = insertelement <4 x ptr> %baseptrs, ptr %second_baseptr, i64 0
598c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <4 x ptr> %baseptrs.new, <4 x i64> %indices
5996526fa35SRoman Lebedev
600c00ffbe0SNikita Popov  %ptr.0 = extractelement <4 x ptr> %ptrs, i64 0
601c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
6026526fa35SRoman Lebedev
603c00ffbe0SNikita Popov  %ptr.1 = extractelement <4 x ptr> %ptrs, i64 1
604c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
6056526fa35SRoman Lebedev
606c00ffbe0SNikita Popov  %ptr.2 = extractelement <4 x ptr> %ptrs, i64 2
607c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
6086526fa35SRoman Lebedev
609c00ffbe0SNikita Popov  %ptr.3 = extractelement <4 x ptr> %ptrs, i64 3
610c00ffbe0SNikita Popov  call void @use(ptr %ptr.3)
6116526fa35SRoman Lebedev
6126526fa35SRoman Lebedev  ret void
6136526fa35SRoman Lebedev}
6146526fa35SRoman Lebedev
615c00ffbe0SNikita Popovdefine void @first_indice_is_known.4elts(<4 x ptr> %baseptrs, <4 x i64> %indices, i64 %second_indice) {
6166526fa35SRoman Lebedev; CHECK-LABEL: @first_indice_is_known.4elts(
6176526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <4 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
618c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <4 x ptr> [[BASEPTRS:%.*]], <4 x i64> [[INDICES_NEW]]
619c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 0
620c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
621c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 1
622c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
623c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 2
624c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
625c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_3:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 3
626c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_3]])
6276526fa35SRoman Lebedev; CHECK-NEXT:    ret void
6286526fa35SRoman Lebedev;
6296526fa35SRoman Lebedev  %indices.new = insertelement <4 x i64> %indices, i64 %second_indice, i64 0
630c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <4 x ptr> %baseptrs, <4 x i64> %indices.new
6316526fa35SRoman Lebedev
632c00ffbe0SNikita Popov  %ptr.0 = extractelement <4 x ptr> %ptrs, i64 0
633c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
6346526fa35SRoman Lebedev
635c00ffbe0SNikita Popov  %ptr.1 = extractelement <4 x ptr> %ptrs, i64 1
636c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
6376526fa35SRoman Lebedev
638c00ffbe0SNikita Popov  %ptr.2 = extractelement <4 x ptr> %ptrs, i64 2
639c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
6406526fa35SRoman Lebedev
641c00ffbe0SNikita Popov  %ptr.3 = extractelement <4 x ptr> %ptrs, i64 3
642c00ffbe0SNikita Popov  call void @use(ptr %ptr.3)
6436526fa35SRoman Lebedev
6446526fa35SRoman Lebedev  ret void
6456526fa35SRoman Lebedev}
6466526fa35SRoman Lebedev
647c00ffbe0SNikita Popovdefine void @first_indice_and_first_baseptr_are_known.4elts(<4 x ptr> %baseptrs, ptr %second_baseptr, <4 x i64> %indices, i64 %second_indice) {
6486526fa35SRoman Lebedev; CHECK-LABEL: @first_indice_and_first_baseptr_are_known.4elts(
649c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <4 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
6506526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <4 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
651c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <4 x ptr> [[BASEPTRS_NEW]], <4 x i64> [[INDICES_NEW]]
652c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 0
653c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
654c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 1
655c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
656c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 2
657c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
658c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_3:%.*]] = extractelement <4 x ptr> [[PTRS]], i64 3
659c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_3]])
6606526fa35SRoman Lebedev; CHECK-NEXT:    ret void
6616526fa35SRoman Lebedev;
662c00ffbe0SNikita Popov  %baseptrs.new = insertelement <4 x ptr> %baseptrs, ptr %second_baseptr, i64 0
6636526fa35SRoman Lebedev  %indices.new = insertelement <4 x i64> %indices, i64 %second_indice, i64 0
664c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <4 x ptr> %baseptrs.new, <4 x i64> %indices.new
6656526fa35SRoman Lebedev
666c00ffbe0SNikita Popov  %ptr.0 = extractelement <4 x ptr> %ptrs, i64 0
667c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
6686526fa35SRoman Lebedev
669c00ffbe0SNikita Popov  %ptr.1 = extractelement <4 x ptr> %ptrs, i64 1
670c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
6716526fa35SRoman Lebedev
672c00ffbe0SNikita Popov  %ptr.2 = extractelement <4 x ptr> %ptrs, i64 2
673c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
6746526fa35SRoman Lebedev
675c00ffbe0SNikita Popov  %ptr.3 = extractelement <4 x ptr> %ptrs, i64 3
676c00ffbe0SNikita Popov  call void @use(ptr %ptr.3)
6776526fa35SRoman Lebedev
6786526fa35SRoman Lebedev  ret void
6796526fa35SRoman Lebedev}
6806526fa35SRoman Lebedev
6816526fa35SRoman Lebedev;-------------------------------------------------------------------------------
6826526fa35SRoman Lebedev
683c00ffbe0SNikita Popovdefine void @first_two_baseptrs_is_knownequal.4elts(<3 x ptr> %baseptrs, ptr %second_baseptr, <3 x i64> %indices) {
6846526fa35SRoman Lebedev; CHECK-LABEL: @first_two_baseptrs_is_knownequal.4elts(
685c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW_TMP:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
686c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS_NEW_TMP]], ptr [[SECOND_BASEPTR]], i64 1
687c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES:%.*]]
688c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
689c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
690c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
691c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
692c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
693c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
6946526fa35SRoman Lebedev; CHECK-NEXT:    ret void
6956526fa35SRoman Lebedev;
696c00ffbe0SNikita Popov  %baseptrs.new.tmp = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
697c00ffbe0SNikita Popov  %baseptrs.new = insertelement <3 x ptr> %baseptrs.new.tmp, ptr %second_baseptr, i64 1
698c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices
6996526fa35SRoman Lebedev
700c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
701c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
7026526fa35SRoman Lebedev
703c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
704c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
7056526fa35SRoman Lebedev
706c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
707c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
7086526fa35SRoman Lebedev
7096526fa35SRoman Lebedev  ret void
7106526fa35SRoman Lebedev}
7116526fa35SRoman Lebedev
712c00ffbe0SNikita Popovdefine void @first_two_indices_is_knownequal.4elts(<3 x ptr> %baseptrs, <3 x i64> %indices, i64 %second_indice) {
7136526fa35SRoman Lebedev; CHECK-LABEL: @first_two_indices_is_knownequal.4elts(
7146526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW_TMP:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
7156526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES_NEW_TMP]], i64 [[SECOND_INDICE]], i64 1
716c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS:%.*]], <3 x i64> [[INDICES_NEW]]
717c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
718c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
719c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
720c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
721c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
722c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
7236526fa35SRoman Lebedev; CHECK-NEXT:    ret void
7246526fa35SRoman Lebedev;
7256526fa35SRoman Lebedev  %indices.new.tmp = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
7266526fa35SRoman Lebedev  %indices.new = insertelement <3 x i64> %indices.new.tmp, i64 %second_indice, i64 1
727c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs, <3 x i64> %indices.new
7286526fa35SRoman Lebedev
729c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
730c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
7316526fa35SRoman Lebedev
732c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
733c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
7346526fa35SRoman Lebedev
735c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
736c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
7376526fa35SRoman Lebedev
7386526fa35SRoman Lebedev  ret void
7396526fa35SRoman Lebedev}
7406526fa35SRoman Lebedev
741c00ffbe0SNikita Popovdefine 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) {
7426526fa35SRoman Lebedev; CHECK-LABEL: @first_two_indices_and_first_two_baseptrs_are_knownequal.4elts(
743c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW_TMP:%.*]] = insertelement <3 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
744c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <3 x ptr> [[BASEPTRS_NEW_TMP]], ptr [[SECOND_BASEPTR]], i64 1
7456526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW_TMP:%.*]] = insertelement <3 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
7466526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <3 x i64> [[INDICES_NEW_TMP]], i64 [[SECOND_INDICE]], i64 1
747c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <3 x ptr> [[BASEPTRS_NEW]], <3 x i64> [[INDICES_NEW]]
748c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 0
749c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
750c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 1
751c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
752c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_2:%.*]] = extractelement <3 x ptr> [[PTRS]], i64 2
753c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_2]])
7546526fa35SRoman Lebedev; CHECK-NEXT:    ret void
7556526fa35SRoman Lebedev;
756c00ffbe0SNikita Popov  %baseptrs.new.tmp = insertelement <3 x ptr> %baseptrs, ptr %second_baseptr, i64 0
757c00ffbe0SNikita Popov  %baseptrs.new = insertelement <3 x ptr> %baseptrs.new.tmp, ptr %second_baseptr, i64 1
7586526fa35SRoman Lebedev  %indices.new.tmp = insertelement <3 x i64> %indices, i64 %second_indice, i64 0
7596526fa35SRoman Lebedev  %indices.new = insertelement <3 x i64> %indices.new.tmp, i64 %second_indice, i64 1
760c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <3 x ptr> %baseptrs.new, <3 x i64> %indices.new
7616526fa35SRoman Lebedev
762c00ffbe0SNikita Popov  %ptr.0 = extractelement <3 x ptr> %ptrs, i64 0
763c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
7646526fa35SRoman Lebedev
765c00ffbe0SNikita Popov  %ptr.1 = extractelement <3 x ptr> %ptrs, i64 1
766c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
7676526fa35SRoman Lebedev
768c00ffbe0SNikita Popov  %ptr.2 = extractelement <3 x ptr> %ptrs, i64 2
769c00ffbe0SNikita Popov  call void @use(ptr %ptr.2)
7706526fa35SRoman Lebedev
7716526fa35SRoman Lebedev  ret void
7726526fa35SRoman Lebedev}
7736526fa35SRoman Lebedev
7746526fa35SRoman Lebedev;===============================================================================
7756526fa35SRoman Lebedev
776c00ffbe0SNikita Popovdefine <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) {
7776526fa35SRoman Lebedev; CHECK-LABEL: @first_indice_and_baseptr_need_extraction.2elts.extrause(
778c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <2 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
7796526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <2 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
780c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <2 x ptr> [[BASEPTRS_NEW]], <2 x i64> [[INDICES_NEW]]
781c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
782c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
783c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
784c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
785c00ffbe0SNikita Popov; CHECK-NEXT:    ret <2 x ptr> [[PTRS]]
7866526fa35SRoman Lebedev;
787c00ffbe0SNikita Popov  %baseptrs.new = insertelement <2 x ptr> %baseptrs, ptr %second_baseptr, i64 0
7886526fa35SRoman Lebedev  %indices.new = insertelement <2 x i64> %indices, i64 %second_indice, i64 0
789c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <2 x ptr> %baseptrs.new, <2 x i64> %indices.new
7906526fa35SRoman Lebedev
791c00ffbe0SNikita Popov  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
792c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
7936526fa35SRoman Lebedev
794c00ffbe0SNikita Popov  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
795c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
7966526fa35SRoman Lebedev
797c00ffbe0SNikita Popov  ret <2 x ptr> %ptrs
7986526fa35SRoman Lebedev}
7996526fa35SRoman Lebedev
800c00ffbe0SNikita Popovdefine 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) {
8016526fa35SRoman Lebedev; CHECK-LABEL: @first_indice_and_baseptr_need_extraction.2elts.variable_extraction(
802c00ffbe0SNikita Popov; CHECK-NEXT:    [[BASEPTRS_NEW:%.*]] = insertelement <2 x ptr> [[BASEPTRS:%.*]], ptr [[SECOND_BASEPTR:%.*]], i64 0
8036526fa35SRoman Lebedev; CHECK-NEXT:    [[INDICES_NEW:%.*]] = insertelement <2 x i64> [[INDICES:%.*]], i64 [[SECOND_INDICE:%.*]], i64 0
804c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTRS:%.*]] = getelementptr inbounds i64, <2 x ptr> [[BASEPTRS_NEW]], <2 x i64> [[INDICES_NEW]]
805c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_0:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 0
806c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_0]])
807c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_1:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 1
808c00ffbe0SNikita Popov; CHECK-NEXT:    call void @use(ptr [[PTR_1]])
809c00ffbe0SNikita Popov; CHECK-NEXT:    [[PTR_VAR:%.*]] = extractelement <2 x ptr> [[PTRS]], i64 [[VARIABLE_EXTRACT_IDX:%.*]]
810c00ffbe0SNikita Popov; CHECK-NEXT:    ret ptr [[PTR_VAR]]
8116526fa35SRoman Lebedev;
812c00ffbe0SNikita Popov  %baseptrs.new = insertelement <2 x ptr> %baseptrs, ptr %second_baseptr, i64 0
8136526fa35SRoman Lebedev  %indices.new = insertelement <2 x i64> %indices, i64 %second_indice, i64 0
814c00ffbe0SNikita Popov  %ptrs = getelementptr inbounds i64, <2 x ptr> %baseptrs.new, <2 x i64> %indices.new
8156526fa35SRoman Lebedev
816c00ffbe0SNikita Popov  %ptr.0 = extractelement <2 x ptr> %ptrs, i64 0
817c00ffbe0SNikita Popov  call void @use(ptr %ptr.0)
8186526fa35SRoman Lebedev
819c00ffbe0SNikita Popov  %ptr.1 = extractelement <2 x ptr> %ptrs, i64 1
820c00ffbe0SNikita Popov  call void @use(ptr %ptr.1)
8216526fa35SRoman Lebedev
822c00ffbe0SNikita Popov  %ptr.var = extractelement <2 x ptr> %ptrs, i64 %variable_extract_idx
8236526fa35SRoman Lebedev
824c00ffbe0SNikita Popov  ret ptr %ptr.var
8256526fa35SRoman Lebedev}
826