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