1413 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=slp-vectorizer -slp-threshold=-2 -S -pass-remarks-output=%t < %s | FileCheck %s3; RUN: cat %t | FileCheck -check-prefix=COST %s4 5target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"6target triple = "aarch64"7 8; COST-LABEL: Function: sext_v4i8_i169; COST: Cost: '-2'10define i16 @sext_v4i8_i16(ptr %x) {11; CHECK-LABEL: @sext_v4i8_i16(12; CHECK-NEXT: entry:13; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i8>, ptr [[X:%.*]], align 114; CHECK-NEXT: [[TMP1:%.*]] = sext <4 x i8> [[TMP0]] to <4 x i16>15; CHECK-NEXT: [[TMP2:%.*]] = call i16 @llvm.vector.reduce.add.v4i16(<4 x i16> [[TMP1]])16; CHECK-NEXT: ret i16 [[TMP2]]17;18entry:19 %0 = load i8, ptr %x20 %conv = sext i8 %0 to i1621 %arrayidx.1 = getelementptr inbounds nuw i8, ptr %x, i64 122 %1 = load i8, ptr %arrayidx.123 %conv.1 = sext i8 %1 to i1624 %add.1 = add nsw i16 %conv, %conv.125 %arrayidx.2 = getelementptr inbounds nuw i8, ptr %x, i64 226 %2 = load i8, ptr %arrayidx.227 %conv.2 = sext i8 %2 to i1628 %add.2 = add nsw i16 %add.1, %conv.229 %arrayidx.3 = getelementptr inbounds nuw i8, ptr %x, i64 330 %3 = load i8, ptr %arrayidx.331 %conv.3 = sext i8 %3 to i1632 %add.3 = add nsw i16 %add.2, %conv.333 ret i16 %add.334}35 36; COST-LABEL: Function: sext_v8i8_i1637; COST: Cost: '-12'38define i16 @sext_v8i8_i16(ptr %x) {39; CHECK-LABEL: @sext_v8i8_i16(40; CHECK-NEXT: entry:41; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[X:%.*]], align 142; CHECK-NEXT: [[TMP1:%.*]] = sext <8 x i8> [[TMP0]] to <8 x i16>43; CHECK-NEXT: [[TMP2:%.*]] = call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> [[TMP1]])44; CHECK-NEXT: ret i16 [[TMP2]]45;46entry:47 %0 = load i8, ptr %x48 %conv = sext i8 %0 to i1649 %arrayidx.1 = getelementptr inbounds nuw i8, ptr %x, i64 150 %1 = load i8, ptr %arrayidx.151 %conv.1 = sext i8 %1 to i1652 %add.1 = add nsw i16 %conv, %conv.153 %arrayidx.2 = getelementptr inbounds nuw i8, ptr %x, i64 254 %2 = load i8, ptr %arrayidx.255 %conv.2 = sext i8 %2 to i1656 %add.2 = add nsw i16 %add.1, %conv.257 %arrayidx.3 = getelementptr inbounds nuw i8, ptr %x, i64 358 %3 = load i8, ptr %arrayidx.359 %conv.3 = sext i8 %3 to i1660 %add.3 = add nsw i16 %add.2, %conv.361 %arrayidx.4 = getelementptr inbounds nuw i8, ptr %x, i64 462 %4 = load i8, ptr %arrayidx.463 %conv.4 = sext i8 %4 to i1664 %add.4 = add nsw i16 %add.3, %conv.465 %arrayidx.5 = getelementptr inbounds nuw i8, ptr %x, i64 566 %5 = load i8, ptr %arrayidx.567 %conv.5 = sext i8 %5 to i1668 %add.5 = add nsw i16 %add.4, %conv.569 %arrayidx.6 = getelementptr inbounds nuw i8, ptr %x, i64 670 %6 = load i8, ptr %arrayidx.671 %conv.6 = sext i8 %6 to i1672 %add.6 = add nsw i16 %add.5, %conv.673 %arrayidx.7 = getelementptr inbounds nuw i8, ptr %x, i64 774 %7 = load i8, ptr %arrayidx.775 %conv.7 = sext i8 %7 to i1676 %add.7 = add nsw i16 %add.6, %conv.777 ret i16 %add.778}79 80; COST-LABEL: Function: sext_v16i8_i1681; COST: Cost: '-28'82define i16 @sext_v16i8_i16(ptr %x) {83; CHECK-LABEL: @sext_v16i8_i16(84; CHECK-NEXT: entry:85; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr [[X:%.*]], align 186; CHECK-NEXT: [[TMP1:%.*]] = sext <16 x i8> [[TMP0]] to <16 x i16>87; CHECK-NEXT: [[TMP2:%.*]] = call i16 @llvm.vector.reduce.add.v16i16(<16 x i16> [[TMP1]])88; CHECK-NEXT: ret i16 [[TMP2]]89;90entry:91 %0 = load i8, ptr %x92 %conv = sext i8 %0 to i1693 %arrayidx.1 = getelementptr inbounds nuw i8, ptr %x, i64 194 %1 = load i8, ptr %arrayidx.195 %conv.1 = sext i8 %1 to i1696 %add.1 = add nsw i16 %conv, %conv.197 %arrayidx.2 = getelementptr inbounds nuw i8, ptr %x, i64 298 %2 = load i8, ptr %arrayidx.299 %conv.2 = sext i8 %2 to i16100 %add.2 = add nsw i16 %add.1, %conv.2101 %arrayidx.3 = getelementptr inbounds nuw i8, ptr %x, i64 3102 %3 = load i8, ptr %arrayidx.3103 %conv.3 = sext i8 %3 to i16104 %add.3 = add nsw i16 %add.2, %conv.3105 %arrayidx.4 = getelementptr inbounds nuw i8, ptr %x, i64 4106 %4 = load i8, ptr %arrayidx.4107 %conv.4 = sext i8 %4 to i16108 %add.4 = add nsw i16 %add.3, %conv.4109 %arrayidx.5 = getelementptr inbounds nuw i8, ptr %x, i64 5110 %5 = load i8, ptr %arrayidx.5111 %conv.5 = sext i8 %5 to i16112 %add.5 = add nsw i16 %add.4, %conv.5113 %arrayidx.6 = getelementptr inbounds nuw i8, ptr %x, i64 6114 %6 = load i8, ptr %arrayidx.6115 %conv.6 = sext i8 %6 to i16116 %add.6 = add nsw i16 %add.5, %conv.6117 %arrayidx.7 = getelementptr inbounds nuw i8, ptr %x, i64 7118 %7 = load i8, ptr %arrayidx.7119 %conv.7 = sext i8 %7 to i16120 %add.7 = add nsw i16 %add.6, %conv.7121 %arrayidx.8 = getelementptr inbounds nuw i8, ptr %x, i64 8122 %8 = load i8, ptr %arrayidx.8123 %conv.8 = sext i8 %8 to i16124 %add.8 = add nsw i16 %add.7, %conv.8125 %arrayidx.9 = getelementptr inbounds nuw i8, ptr %x, i64 9126 %9 = load i8, ptr %arrayidx.9127 %conv.9 = sext i8 %9 to i16128 %add.9 = add nsw i16 %add.8, %conv.9129 %arrayidx.10 = getelementptr inbounds nuw i8, ptr %x, i64 10130 %10 = load i8, ptr %arrayidx.10131 %conv.10 = sext i8 %10 to i16132 %add.10 = add nsw i16 %add.9, %conv.10133 %arrayidx.11 = getelementptr inbounds nuw i8, ptr %x, i64 11134 %11 = load i8, ptr %arrayidx.11135 %conv.11 = sext i8 %11 to i16136 %add.11 = add nsw i16 %add.10, %conv.11137 %arrayidx.12 = getelementptr inbounds nuw i8, ptr %x, i64 12138 %12 = load i8, ptr %arrayidx.12139 %conv.12 = sext i8 %12 to i16140 %add.12 = add nsw i16 %add.11, %conv.12141 %arrayidx.13 = getelementptr inbounds nuw i8, ptr %x, i64 13142 %13 = load i8, ptr %arrayidx.13143 %conv.13 = sext i8 %13 to i16144 %add.13 = add nsw i16 %add.12, %conv.13145 %arrayidx.14 = getelementptr inbounds nuw i8, ptr %x, i64 14146 %14 = load i8, ptr %arrayidx.14147 %conv.14 = sext i8 %14 to i16148 %add.14 = add nsw i16 %add.13, %conv.14149 %arrayidx.15 = getelementptr inbounds nuw i8, ptr %x, i64 15150 %15 = load i8, ptr %arrayidx.15151 %conv.15 = sext i8 %15 to i16152 %add.15 = add nsw i16 %add.14, %conv.15153 ret i16 %add.15154}155 156; COST-LABEL: Function: sext_v32i8_i16157; COST: Cost: '-57'158define i16 @sext_v32i8_i16(ptr %x) {159; CHECK-LABEL: @sext_v32i8_i16(160; CHECK-NEXT: entry:161; CHECK-NEXT: [[TMP0:%.*]] = load <32 x i8>, ptr [[X:%.*]], align 1162; CHECK-NEXT: [[TMP1:%.*]] = sext <32 x i8> [[TMP0]] to <32 x i16>163; CHECK-NEXT: [[TMP2:%.*]] = call i16 @llvm.vector.reduce.add.v32i16(<32 x i16> [[TMP1]])164; CHECK-NEXT: ret i16 [[TMP2]]165;166entry:167 %0 = load i8, ptr %x168 %conv = sext i8 %0 to i16169 %arrayidx.1 = getelementptr inbounds nuw i8, ptr %x, i64 1170 %1 = load i8, ptr %arrayidx.1171 %conv.1 = sext i8 %1 to i16172 %add.1 = add nsw i16 %conv, %conv.1173 %arrayidx.2 = getelementptr inbounds nuw i8, ptr %x, i64 2174 %2 = load i8, ptr %arrayidx.2175 %conv.2 = sext i8 %2 to i16176 %add.2 = add nsw i16 %add.1, %conv.2177 %arrayidx.3 = getelementptr inbounds nuw i8, ptr %x, i64 3178 %3 = load i8, ptr %arrayidx.3179 %conv.3 = sext i8 %3 to i16180 %add.3 = add nsw i16 %add.2, %conv.3181 %arrayidx.4 = getelementptr inbounds nuw i8, ptr %x, i64 4182 %4 = load i8, ptr %arrayidx.4183 %conv.4 = sext i8 %4 to i16184 %add.4 = add nsw i16 %add.3, %conv.4185 %arrayidx.5 = getelementptr inbounds nuw i8, ptr %x, i64 5186 %5 = load i8, ptr %arrayidx.5187 %conv.5 = sext i8 %5 to i16188 %add.5 = add nsw i16 %add.4, %conv.5189 %arrayidx.6 = getelementptr inbounds nuw i8, ptr %x, i64 6190 %6 = load i8, ptr %arrayidx.6191 %conv.6 = sext i8 %6 to i16192 %add.6 = add nsw i16 %add.5, %conv.6193 %arrayidx.7 = getelementptr inbounds nuw i8, ptr %x, i64 7194 %7 = load i8, ptr %arrayidx.7195 %conv.7 = sext i8 %7 to i16196 %add.7 = add nsw i16 %add.6, %conv.7197 %arrayidx.8 = getelementptr inbounds nuw i8, ptr %x, i64 8198 %8 = load i8, ptr %arrayidx.8199 %conv.8 = sext i8 %8 to i16200 %add.8 = add nsw i16 %add.7, %conv.8201 %arrayidx.9 = getelementptr inbounds nuw i8, ptr %x, i64 9202 %9 = load i8, ptr %arrayidx.9203 %conv.9 = sext i8 %9 to i16204 %add.9 = add nsw i16 %add.8, %conv.9205 %arrayidx.10 = getelementptr inbounds nuw i8, ptr %x, i64 10206 %10 = load i8, ptr %arrayidx.10207 %conv.10 = sext i8 %10 to i16208 %add.10 = add nsw i16 %add.9, %conv.10209 %arrayidx.11 = getelementptr inbounds nuw i8, ptr %x, i64 11210 %11 = load i8, ptr %arrayidx.11211 %conv.11 = sext i8 %11 to i16212 %add.11 = add nsw i16 %add.10, %conv.11213 %arrayidx.12 = getelementptr inbounds nuw i8, ptr %x, i64 12214 %12 = load i8, ptr %arrayidx.12215 %conv.12 = sext i8 %12 to i16216 %add.12 = add nsw i16 %add.11, %conv.12217 %arrayidx.13 = getelementptr inbounds nuw i8, ptr %x, i64 13218 %13 = load i8, ptr %arrayidx.13219 %conv.13 = sext i8 %13 to i16220 %add.13 = add nsw i16 %add.12, %conv.13221 %arrayidx.14 = getelementptr inbounds nuw i8, ptr %x, i64 14222 %14 = load i8, ptr %arrayidx.14223 %conv.14 = sext i8 %14 to i16224 %add.14 = add nsw i16 %add.13, %conv.14225 %arrayidx.15 = getelementptr inbounds nuw i8, ptr %x, i64 15226 %15 = load i8, ptr %arrayidx.15227 %conv.15 = sext i8 %15 to i16228 %add.15 = add nsw i16 %add.14, %conv.15229 %arrayidx.16 = getelementptr inbounds nuw i8, ptr %x, i64 16230 %16 = load i8, ptr %arrayidx.16231 %conv.16 = sext i8 %16 to i16232 %add.16 = add nsw i16 %add.15, %conv.16233 %arrayidx.17 = getelementptr inbounds nuw i8, ptr %x, i64 17234 %17 = load i8, ptr %arrayidx.17235 %conv.17 = sext i8 %17 to i16236 %add.17 = add nsw i16 %add.16, %conv.17237 %arrayidx.18 = getelementptr inbounds nuw i8, ptr %x, i64 18238 %18 = load i8, ptr %arrayidx.18239 %conv.18 = sext i8 %18 to i16240 %add.18 = add nsw i16 %add.17, %conv.18241 %arrayidx.19 = getelementptr inbounds nuw i8, ptr %x, i64 19242 %19 = load i8, ptr %arrayidx.19243 %conv.19 = sext i8 %19 to i16244 %add.19 = add nsw i16 %add.18, %conv.19245 %arrayidx.20 = getelementptr inbounds nuw i8, ptr %x, i64 20246 %20 = load i8, ptr %arrayidx.20247 %conv.20 = sext i8 %20 to i16248 %add.20 = add nsw i16 %add.19, %conv.20249 %arrayidx.21 = getelementptr inbounds nuw i8, ptr %x, i64 21250 %21 = load i8, ptr %arrayidx.21251 %conv.21 = sext i8 %21 to i16252 %add.21 = add nsw i16 %add.20, %conv.21253 %arrayidx.22 = getelementptr inbounds nuw i8, ptr %x, i64 22254 %22 = load i8, ptr %arrayidx.22255 %conv.22 = sext i8 %22 to i16256 %add.22 = add nsw i16 %add.21, %conv.22257 %arrayidx.23 = getelementptr inbounds nuw i8, ptr %x, i64 23258 %23 = load i8, ptr %arrayidx.23259 %conv.23 = sext i8 %23 to i16260 %add.23 = add nsw i16 %add.22, %conv.23261 %arrayidx.24 = getelementptr inbounds nuw i8, ptr %x, i64 24262 %24 = load i8, ptr %arrayidx.24263 %conv.24 = sext i8 %24 to i16264 %add.24 = add nsw i16 %add.23, %conv.24265 %arrayidx.25 = getelementptr inbounds nuw i8, ptr %x, i64 25266 %25 = load i8, ptr %arrayidx.25267 %conv.25 = sext i8 %25 to i16268 %add.25 = add nsw i16 %add.24, %conv.25269 %arrayidx.26 = getelementptr inbounds nuw i8, ptr %x, i64 26270 %26 = load i8, ptr %arrayidx.26271 %conv.26 = sext i8 %26 to i16272 %add.26 = add nsw i16 %add.25, %conv.26273 %arrayidx.27 = getelementptr inbounds nuw i8, ptr %x, i64 27274 %27 = load i8, ptr %arrayidx.27275 %conv.27 = sext i8 %27 to i16276 %add.27 = add nsw i16 %add.26, %conv.27277 %arrayidx.28 = getelementptr inbounds nuw i8, ptr %x, i64 28278 %28 = load i8, ptr %arrayidx.28279 %conv.28 = sext i8 %28 to i16280 %add.28 = add nsw i16 %add.27, %conv.28281 %arrayidx.29 = getelementptr inbounds nuw i8, ptr %x, i64 29282 %29 = load i8, ptr %arrayidx.29283 %conv.29 = sext i8 %29 to i16284 %add.29 = add nsw i16 %add.28, %conv.29285 %arrayidx.30 = getelementptr inbounds nuw i8, ptr %x, i64 30286 %30 = load i8, ptr %arrayidx.30287 %conv.30 = sext i8 %30 to i16288 %add.30 = add nsw i16 %add.29, %conv.30289 %arrayidx.31 = getelementptr inbounds nuw i8, ptr %x, i64 31290 %31 = load i8, ptr %arrayidx.31291 %conv.31 = sext i8 %31 to i16292 %add.31 = add nsw i16 %add.30, %conv.31293 ret i16 %add.31294}295 296 297 298 299 300 301; COST-LABEL: Function: sext_v4i16_i32302; COST: Cost: '-4'303define i32 @sext_v4i16_i32(ptr %x) {304; CHECK-LABEL: @sext_v4i16_i32(305; CHECK-NEXT: entry:306; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i16>, ptr [[X:%.*]], align 2307; CHECK-NEXT: [[TMP1:%.*]] = sext <4 x i16> [[TMP0]] to <4 x i32>308; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP1]])309; CHECK-NEXT: ret i32 [[TMP2]]310;311entry:312 %0 = load i16, ptr %x313 %conv = sext i16 %0 to i32314 %arrayidx.1 = getelementptr inbounds nuw i8, ptr %x, i64 2315 %1 = load i16, ptr %arrayidx.1316 %conv.1 = sext i16 %1 to i32317 %add.1 = add nsw i32 %conv, %conv.1318 %arrayidx.2 = getelementptr inbounds nuw i8, ptr %x, i64 4319 %2 = load i16, ptr %arrayidx.2320 %conv.2 = sext i16 %2 to i32321 %add.2 = add nsw i32 %add.1, %conv.2322 %arrayidx.3 = getelementptr inbounds nuw i8, ptr %x, i64 6323 %3 = load i16, ptr %arrayidx.3324 %conv.3 = sext i16 %3 to i32325 %add.3 = add nsw i32 %add.2, %conv.3326 ret i32 %add.3327}328 329; COST-LABEL: Function: sext_v8i16_i32330; COST: Cost: '-12'331define i32 @sext_v8i16_i32(ptr %x) {332; CHECK-LABEL: @sext_v8i16_i32(333; CHECK-NEXT: entry:334; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i16>, ptr [[X:%.*]], align 2335; CHECK-NEXT: [[TMP1:%.*]] = sext <8 x i16> [[TMP0]] to <8 x i32>336; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> [[TMP1]])337; CHECK-NEXT: ret i32 [[TMP2]]338;339entry:340 %0 = load i16, ptr %x341 %conv = sext i16 %0 to i32342 %arrayidx.1 = getelementptr inbounds nuw i8, ptr %x, i64 2343 %1 = load i16, ptr %arrayidx.1344 %conv.1 = sext i16 %1 to i32345 %add.1 = add nsw i32 %conv, %conv.1346 %arrayidx.2 = getelementptr inbounds nuw i8, ptr %x, i64 4347 %2 = load i16, ptr %arrayidx.2348 %conv.2 = sext i16 %2 to i32349 %add.2 = add nsw i32 %add.1, %conv.2350 %arrayidx.3 = getelementptr inbounds nuw i8, ptr %x, i64 6351 %3 = load i16, ptr %arrayidx.3352 %conv.3 = sext i16 %3 to i32353 %add.3 = add nsw i32 %add.2, %conv.3354 %arrayidx.4 = getelementptr inbounds nuw i8, ptr %x, i64 8355 %4 = load i16, ptr %arrayidx.4356 %conv.4 = sext i16 %4 to i32357 %add.4 = add nsw i32 %add.3, %conv.4358 %arrayidx.5 = getelementptr inbounds nuw i8, ptr %x, i64 10359 %5 = load i16, ptr %arrayidx.5360 %conv.5 = sext i16 %5 to i32361 %add.5 = add nsw i32 %add.4, %conv.5362 %arrayidx.6 = getelementptr inbounds nuw i8, ptr %x, i64 12363 %6 = load i16, ptr %arrayidx.6364 %conv.6 = sext i16 %6 to i32365 %add.6 = add nsw i32 %add.5, %conv.6366 %arrayidx.7 = getelementptr inbounds nuw i8, ptr %x, i64 14367 %7 = load i16, ptr %arrayidx.7368 %conv.7 = sext i16 %7 to i32369 %add.7 = add nsw i32 %add.6, %conv.7370 ret i32 %add.7371}372 373; COST-LABEL: Function: sext_v16i16_i32374; COST: Cost: '-25'375define i32 @sext_v16i16_i32(ptr %x) {376; CHECK-LABEL: @sext_v16i16_i32(377; CHECK-NEXT: entry:378; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i16>, ptr [[X:%.*]], align 2379; CHECK-NEXT: [[TMP1:%.*]] = sext <16 x i16> [[TMP0]] to <16 x i32>380; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> [[TMP1]])381; CHECK-NEXT: ret i32 [[TMP2]]382;383entry:384 %0 = load i16, ptr %x385 %conv = sext i16 %0 to i32386 %arrayidx.1 = getelementptr inbounds nuw i8, ptr %x, i64 2387 %1 = load i16, ptr %arrayidx.1388 %conv.1 = sext i16 %1 to i32389 %add.1 = add nsw i32 %conv, %conv.1390 %arrayidx.2 = getelementptr inbounds nuw i8, ptr %x, i64 4391 %2 = load i16, ptr %arrayidx.2392 %conv.2 = sext i16 %2 to i32393 %add.2 = add nsw i32 %add.1, %conv.2394 %arrayidx.3 = getelementptr inbounds nuw i8, ptr %x, i64 6395 %3 = load i16, ptr %arrayidx.3396 %conv.3 = sext i16 %3 to i32397 %add.3 = add nsw i32 %add.2, %conv.3398 %arrayidx.4 = getelementptr inbounds nuw i8, ptr %x, i64 8399 %4 = load i16, ptr %arrayidx.4400 %conv.4 = sext i16 %4 to i32401 %add.4 = add nsw i32 %add.3, %conv.4402 %arrayidx.5 = getelementptr inbounds nuw i8, ptr %x, i64 10403 %5 = load i16, ptr %arrayidx.5404 %conv.5 = sext i16 %5 to i32405 %add.5 = add nsw i32 %add.4, %conv.5406 %arrayidx.6 = getelementptr inbounds nuw i8, ptr %x, i64 12407 %6 = load i16, ptr %arrayidx.6408 %conv.6 = sext i16 %6 to i32409 %add.6 = add nsw i32 %add.5, %conv.6410 %arrayidx.7 = getelementptr inbounds nuw i8, ptr %x, i64 14411 %7 = load i16, ptr %arrayidx.7412 %conv.7 = sext i16 %7 to i32413 %add.7 = add nsw i32 %add.6, %conv.7414 %arrayidx.8 = getelementptr inbounds nuw i8, ptr %x, i64 16415 %8 = load i16, ptr %arrayidx.8416 %conv.8 = sext i16 %8 to i32417 %add.8 = add nsw i32 %add.7, %conv.8418 %arrayidx.9 = getelementptr inbounds nuw i8, ptr %x, i64 18419 %9 = load i16, ptr %arrayidx.9420 %conv.9 = sext i16 %9 to i32421 %add.9 = add nsw i32 %add.8, %conv.9422 %arrayidx.10 = getelementptr inbounds nuw i8, ptr %x, i64 20423 %10 = load i16, ptr %arrayidx.10424 %conv.10 = sext i16 %10 to i32425 %add.10 = add nsw i32 %add.9, %conv.10426 %arrayidx.11 = getelementptr inbounds nuw i8, ptr %x, i64 22427 %11 = load i16, ptr %arrayidx.11428 %conv.11 = sext i16 %11 to i32429 %add.11 = add nsw i32 %add.10, %conv.11430 %arrayidx.12 = getelementptr inbounds nuw i8, ptr %x, i64 24431 %12 = load i16, ptr %arrayidx.12432 %conv.12 = sext i16 %12 to i32433 %add.12 = add nsw i32 %add.11, %conv.12434 %arrayidx.13 = getelementptr inbounds nuw i8, ptr %x, i64 26435 %13 = load i16, ptr %arrayidx.13436 %conv.13 = sext i16 %13 to i32437 %add.13 = add nsw i32 %add.12, %conv.13438 %arrayidx.14 = getelementptr inbounds nuw i8, ptr %x, i64 28439 %14 = load i16, ptr %arrayidx.14440 %conv.14 = sext i16 %14 to i32441 %add.14 = add nsw i32 %add.13, %conv.14442 %arrayidx.15 = getelementptr inbounds nuw i8, ptr %x, i64 30443 %15 = load i16, ptr %arrayidx.15444 %conv.15 = sext i16 %15 to i32445 %add.15 = add nsw i32 %add.14, %conv.15446 ret i32 %add.15447}448 449; COST-LABEL: Function: sext_v32i16_i32450; COST: Cost: '-51'451define i32 @sext_v32i16_i32(ptr %x) {452; CHECK-LABEL: @sext_v32i16_i32(453; CHECK-NEXT: entry:454; CHECK-NEXT: [[TMP0:%.*]] = load <32 x i16>, ptr [[X:%.*]], align 2455; CHECK-NEXT: [[TMP1:%.*]] = sext <32 x i16> [[TMP0]] to <32 x i32>456; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.add.v32i32(<32 x i32> [[TMP1]])457; CHECK-NEXT: ret i32 [[TMP2]]458;459entry:460 %0 = load i16, ptr %x461 %conv = sext i16 %0 to i32462 %arrayidx.1 = getelementptr inbounds nuw i8, ptr %x, i64 2463 %1 = load i16, ptr %arrayidx.1464 %conv.1 = sext i16 %1 to i32465 %add.1 = add nsw i32 %conv, %conv.1466 %arrayidx.2 = getelementptr inbounds nuw i8, ptr %x, i64 4467 %2 = load i16, ptr %arrayidx.2468 %conv.2 = sext i16 %2 to i32469 %add.2 = add nsw i32 %add.1, %conv.2470 %arrayidx.3 = getelementptr inbounds nuw i8, ptr %x, i64 6471 %3 = load i16, ptr %arrayidx.3472 %conv.3 = sext i16 %3 to i32473 %add.3 = add nsw i32 %add.2, %conv.3474 %arrayidx.4 = getelementptr inbounds nuw i8, ptr %x, i64 8475 %4 = load i16, ptr %arrayidx.4476 %conv.4 = sext i16 %4 to i32477 %add.4 = add nsw i32 %add.3, %conv.4478 %arrayidx.5 = getelementptr inbounds nuw i8, ptr %x, i64 10479 %5 = load i16, ptr %arrayidx.5480 %conv.5 = sext i16 %5 to i32481 %add.5 = add nsw i32 %add.4, %conv.5482 %arrayidx.6 = getelementptr inbounds nuw i8, ptr %x, i64 12483 %6 = load i16, ptr %arrayidx.6484 %conv.6 = sext i16 %6 to i32485 %add.6 = add nsw i32 %add.5, %conv.6486 %arrayidx.7 = getelementptr inbounds nuw i8, ptr %x, i64 14487 %7 = load i16, ptr %arrayidx.7488 %conv.7 = sext i16 %7 to i32489 %add.7 = add nsw i32 %add.6, %conv.7490 %arrayidx.8 = getelementptr inbounds nuw i8, ptr %x, i64 16491 %8 = load i16, ptr %arrayidx.8492 %conv.8 = sext i16 %8 to i32493 %add.8 = add nsw i32 %add.7, %conv.8494 %arrayidx.9 = getelementptr inbounds nuw i8, ptr %x, i64 18495 %9 = load i16, ptr %arrayidx.9496 %conv.9 = sext i16 %9 to i32497 %add.9 = add nsw i32 %add.8, %conv.9498 %arrayidx.10 = getelementptr inbounds nuw i8, ptr %x, i64 20499 %10 = load i16, ptr %arrayidx.10500 %conv.10 = sext i16 %10 to i32501 %add.10 = add nsw i32 %add.9, %conv.10502 %arrayidx.11 = getelementptr inbounds nuw i8, ptr %x, i64 22503 %11 = load i16, ptr %arrayidx.11504 %conv.11 = sext i16 %11 to i32505 %add.11 = add nsw i32 %add.10, %conv.11506 %arrayidx.12 = getelementptr inbounds nuw i8, ptr %x, i64 24507 %12 = load i16, ptr %arrayidx.12508 %conv.12 = sext i16 %12 to i32509 %add.12 = add nsw i32 %add.11, %conv.12510 %arrayidx.13 = getelementptr inbounds nuw i8, ptr %x, i64 26511 %13 = load i16, ptr %arrayidx.13512 %conv.13 = sext i16 %13 to i32513 %add.13 = add nsw i32 %add.12, %conv.13514 %arrayidx.14 = getelementptr inbounds nuw i8, ptr %x, i64 28515 %14 = load i16, ptr %arrayidx.14516 %conv.14 = sext i16 %14 to i32517 %add.14 = add nsw i32 %add.13, %conv.14518 %arrayidx.15 = getelementptr inbounds nuw i8, ptr %x, i64 30519 %15 = load i16, ptr %arrayidx.15520 %conv.15 = sext i16 %15 to i32521 %add.15 = add nsw i32 %add.14, %conv.15522 %arrayidx.16 = getelementptr inbounds nuw i8, ptr %x, i64 32523 %16 = load i16, ptr %arrayidx.16524 %conv.16 = sext i16 %16 to i32525 %add.16 = add nsw i32 %add.15, %conv.16526 %arrayidx.17 = getelementptr inbounds nuw i8, ptr %x, i64 34527 %17 = load i16, ptr %arrayidx.17528 %conv.17 = sext i16 %17 to i32529 %add.17 = add nsw i32 %add.16, %conv.17530 %arrayidx.18 = getelementptr inbounds nuw i8, ptr %x, i64 36531 %18 = load i16, ptr %arrayidx.18532 %conv.18 = sext i16 %18 to i32533 %add.18 = add nsw i32 %add.17, %conv.18534 %arrayidx.19 = getelementptr inbounds nuw i8, ptr %x, i64 38535 %19 = load i16, ptr %arrayidx.19536 %conv.19 = sext i16 %19 to i32537 %add.19 = add nsw i32 %add.18, %conv.19538 %arrayidx.20 = getelementptr inbounds nuw i8, ptr %x, i64 40539 %20 = load i16, ptr %arrayidx.20540 %conv.20 = sext i16 %20 to i32541 %add.20 = add nsw i32 %add.19, %conv.20542 %arrayidx.21 = getelementptr inbounds nuw i8, ptr %x, i64 42543 %21 = load i16, ptr %arrayidx.21544 %conv.21 = sext i16 %21 to i32545 %add.21 = add nsw i32 %add.20, %conv.21546 %arrayidx.22 = getelementptr inbounds nuw i8, ptr %x, i64 44547 %22 = load i16, ptr %arrayidx.22548 %conv.22 = sext i16 %22 to i32549 %add.22 = add nsw i32 %add.21, %conv.22550 %arrayidx.23 = getelementptr inbounds nuw i8, ptr %x, i64 46551 %23 = load i16, ptr %arrayidx.23552 %conv.23 = sext i16 %23 to i32553 %add.23 = add nsw i32 %add.22, %conv.23554 %arrayidx.24 = getelementptr inbounds nuw i8, ptr %x, i64 48555 %24 = load i16, ptr %arrayidx.24556 %conv.24 = sext i16 %24 to i32557 %add.24 = add nsw i32 %add.23, %conv.24558 %arrayidx.25 = getelementptr inbounds nuw i8, ptr %x, i64 50559 %25 = load i16, ptr %arrayidx.25560 %conv.25 = sext i16 %25 to i32561 %add.25 = add nsw i32 %add.24, %conv.25562 %arrayidx.26 = getelementptr inbounds nuw i8, ptr %x, i64 52563 %26 = load i16, ptr %arrayidx.26564 %conv.26 = sext i16 %26 to i32565 %add.26 = add nsw i32 %add.25, %conv.26566 %arrayidx.27 = getelementptr inbounds nuw i8, ptr %x, i64 54567 %27 = load i16, ptr %arrayidx.27568 %conv.27 = sext i16 %27 to i32569 %add.27 = add nsw i32 %add.26, %conv.27570 %arrayidx.28 = getelementptr inbounds nuw i8, ptr %x, i64 56571 %28 = load i16, ptr %arrayidx.28572 %conv.28 = sext i16 %28 to i32573 %add.28 = add nsw i32 %add.27, %conv.28574 %arrayidx.29 = getelementptr inbounds nuw i8, ptr %x, i64 58575 %29 = load i16, ptr %arrayidx.29576 %conv.29 = sext i16 %29 to i32577 %add.29 = add nsw i32 %add.28, %conv.29578 %arrayidx.30 = getelementptr inbounds nuw i8, ptr %x, i64 60579 %30 = load i16, ptr %arrayidx.30580 %conv.30 = sext i16 %30 to i32581 %add.30 = add nsw i32 %add.29, %conv.30582 %arrayidx.31 = getelementptr inbounds nuw i8, ptr %x, i64 62583 %31 = load i16, ptr %arrayidx.31584 %conv.31 = sext i16 %31 to i32585 %add.31 = add nsw i32 %add.30, %conv.31586 ret i32 %add.31587}588 589 590 591 592 593 594 595; COST-LABEL: Function: sext_v4i32_i64596; COST: Cost: '-4'597define i64 @sext_v4i32_i64(ptr %x) {598; CHECK-LABEL: @sext_v4i32_i64(599; CHECK-NEXT: entry:600; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i32>, ptr [[X:%.*]], align 4601; CHECK-NEXT: [[TMP1:%.*]] = sext <4 x i32> [[TMP0]] to <4 x i64>602; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> [[TMP1]])603; CHECK-NEXT: ret i64 [[TMP2]]604;605entry:606 %0 = load i32, ptr %x607 %conv = sext i32 %0 to i64608 %arrayidx.1 = getelementptr inbounds nuw i32, ptr %x, i64 1609 %1 = load i32, ptr %arrayidx.1610 %conv.1 = sext i32 %1 to i64611 %add.1 = add nsw i64 %conv, %conv.1612 %arrayidx.2 = getelementptr inbounds nuw i32, ptr %x, i64 2613 %2 = load i32, ptr %arrayidx.2614 %conv.2 = sext i32 %2 to i64615 %add.2 = add nsw i64 %add.1, %conv.2616 %arrayidx.3 = getelementptr inbounds nuw i32, ptr %x, i64 3617 %3 = load i32, ptr %arrayidx.3618 %conv.3 = sext i32 %3 to i64619 %add.3 = add nsw i64 %add.2, %conv.3620 ret i64 %add.3621}622 623; COST-LABEL: Function: sext_v8i32_i64624; COST: Cost: '-9'625define i64 @sext_v8i32_i64(ptr %x) {626; CHECK-LABEL: @sext_v8i32_i64(627; CHECK-NEXT: entry:628; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i32>, ptr [[X:%.*]], align 4629; CHECK-NEXT: [[TMP1:%.*]] = sext <8 x i32> [[TMP0]] to <8 x i64>630; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> [[TMP1]])631; CHECK-NEXT: ret i64 [[TMP2]]632;633entry:634 %0 = load i32, ptr %x635 %conv = sext i32 %0 to i64636 %arrayidx.1 = getelementptr inbounds nuw i32, ptr %x, i64 1637 %1 = load i32, ptr %arrayidx.1638 %conv.1 = sext i32 %1 to i64639 %add.1 = add nsw i64 %conv, %conv.1640 %arrayidx.2 = getelementptr inbounds nuw i32, ptr %x, i64 2641 %2 = load i32, ptr %arrayidx.2642 %conv.2 = sext i32 %2 to i64643 %add.2 = add nsw i64 %add.1, %conv.2644 %arrayidx.3 = getelementptr inbounds nuw i32, ptr %x, i64 3645 %3 = load i32, ptr %arrayidx.3646 %conv.3 = sext i32 %3 to i64647 %add.3 = add nsw i64 %add.2, %conv.3648 %arrayidx.4 = getelementptr inbounds nuw i32, ptr %x, i64 4649 %4 = load i32, ptr %arrayidx.4650 %conv.4 = sext i32 %4 to i64651 %add.4 = add nsw i64 %add.3, %conv.4652 %arrayidx.5 = getelementptr inbounds nuw i32, ptr %x, i64 5653 %5 = load i32, ptr %arrayidx.5654 %conv.5 = sext i32 %5 to i64655 %add.5 = add nsw i64 %add.4, %conv.5656 %arrayidx.6 = getelementptr inbounds nuw i32, ptr %x, i64 6657 %6 = load i32, ptr %arrayidx.6658 %conv.6 = sext i32 %6 to i64659 %add.6 = add nsw i64 %add.5, %conv.6660 %arrayidx.7 = getelementptr inbounds nuw i32, ptr %x, i64 7661 %7 = load i32, ptr %arrayidx.7662 %conv.7 = sext i32 %7 to i64663 %add.7 = add nsw i64 %add.6, %conv.7664 ret i64 %add.7665}666 667; COST-LABEL: Function: sext_v16i32_i64668; COST: Cost: '-19'669define i64 @sext_v16i32_i64(ptr %x) {670; CHECK-LABEL: @sext_v16i32_i64(671; CHECK-NEXT: entry:672; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i32>, ptr [[X:%.*]], align 4673; CHECK-NEXT: [[TMP1:%.*]] = sext <16 x i32> [[TMP0]] to <16 x i64>674; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.vector.reduce.add.v16i64(<16 x i64> [[TMP1]])675; CHECK-NEXT: ret i64 [[TMP2]]676;677entry:678 %0 = load i32, ptr %x679 %conv = sext i32 %0 to i64680 %arrayidx.1 = getelementptr inbounds nuw i32, ptr %x, i64 1681 %1 = load i32, ptr %arrayidx.1682 %conv.1 = sext i32 %1 to i64683 %add.1 = add nsw i64 %conv, %conv.1684 %arrayidx.2 = getelementptr inbounds nuw i32, ptr %x, i64 2685 %2 = load i32, ptr %arrayidx.2686 %conv.2 = sext i32 %2 to i64687 %add.2 = add nsw i64 %add.1, %conv.2688 %arrayidx.3 = getelementptr inbounds nuw i32, ptr %x, i64 3689 %3 = load i32, ptr %arrayidx.3690 %conv.3 = sext i32 %3 to i64691 %add.3 = add nsw i64 %add.2, %conv.3692 %arrayidx.4 = getelementptr inbounds nuw i32, ptr %x, i64 4693 %4 = load i32, ptr %arrayidx.4694 %conv.4 = sext i32 %4 to i64695 %add.4 = add nsw i64 %add.3, %conv.4696 %arrayidx.5 = getelementptr inbounds nuw i32, ptr %x, i64 5697 %5 = load i32, ptr %arrayidx.5698 %conv.5 = sext i32 %5 to i64699 %add.5 = add nsw i64 %add.4, %conv.5700 %arrayidx.6 = getelementptr inbounds nuw i32, ptr %x, i64 6701 %6 = load i32, ptr %arrayidx.6702 %conv.6 = sext i32 %6 to i64703 %add.6 = add nsw i64 %add.5, %conv.6704 %arrayidx.7 = getelementptr inbounds nuw i32, ptr %x, i64 7705 %7 = load i32, ptr %arrayidx.7706 %conv.7 = sext i32 %7 to i64707 %add.7 = add nsw i64 %add.6, %conv.7708 %arrayidx.8 = getelementptr inbounds nuw i32, ptr %x, i64 8709 %8 = load i32, ptr %arrayidx.8710 %conv.8 = sext i32 %8 to i64711 %add.8 = add nsw i64 %add.7, %conv.8712 %arrayidx.9 = getelementptr inbounds nuw i32, ptr %x, i64 9713 %9 = load i32, ptr %arrayidx.9714 %conv.9 = sext i32 %9 to i64715 %add.9 = add nsw i64 %add.8, %conv.9716 %arrayidx.10 = getelementptr inbounds nuw i32, ptr %x, i64 10717 %10 = load i32, ptr %arrayidx.10718 %conv.10 = sext i32 %10 to i64719 %add.10 = add nsw i64 %add.9, %conv.10720 %arrayidx.11 = getelementptr inbounds nuw i32, ptr %x, i64 11721 %11 = load i32, ptr %arrayidx.11722 %conv.11 = sext i32 %11 to i64723 %add.11 = add nsw i64 %add.10, %conv.11724 %arrayidx.12 = getelementptr inbounds nuw i32, ptr %x, i64 12725 %12 = load i32, ptr %arrayidx.12726 %conv.12 = sext i32 %12 to i64727 %add.12 = add nsw i64 %add.11, %conv.12728 %arrayidx.13 = getelementptr inbounds nuw i32, ptr %x, i64 13729 %13 = load i32, ptr %arrayidx.13730 %conv.13 = sext i32 %13 to i64731 %add.13 = add nsw i64 %add.12, %conv.13732 %arrayidx.14 = getelementptr inbounds nuw i32, ptr %x, i64 14733 %14 = load i32, ptr %arrayidx.14734 %conv.14 = sext i32 %14 to i64735 %add.14 = add nsw i64 %add.13, %conv.14736 %arrayidx.15 = getelementptr inbounds nuw i32, ptr %x, i64 15737 %15 = load i32, ptr %arrayidx.15738 %conv.15 = sext i32 %15 to i64739 %add.15 = add nsw i64 %add.14, %conv.15740 ret i64 %add.15741}742 743; COST-LABEL: Function: sext_v32i32_i64744; COST: Cost: '-39'745define i64 @sext_v32i32_i64(ptr %x) {746; CHECK-LABEL: @sext_v32i32_i64(747; CHECK-NEXT: entry:748; CHECK-NEXT: [[TMP0:%.*]] = load <32 x i32>, ptr [[X:%.*]], align 4749; CHECK-NEXT: [[TMP1:%.*]] = sext <32 x i32> [[TMP0]] to <32 x i64>750; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.vector.reduce.add.v32i64(<32 x i64> [[TMP1]])751; CHECK-NEXT: ret i64 [[TMP2]]752;753entry:754 %0 = load i32, ptr %x755 %conv = sext i32 %0 to i64756 %arrayidx.1 = getelementptr inbounds nuw i32, ptr %x, i64 1757 %1 = load i32, ptr %arrayidx.1758 %conv.1 = sext i32 %1 to i64759 %add.1 = add nsw i64 %conv, %conv.1760 %arrayidx.2 = getelementptr inbounds nuw i32, ptr %x, i64 2761 %2 = load i32, ptr %arrayidx.2762 %conv.2 = sext i32 %2 to i64763 %add.2 = add nsw i64 %add.1, %conv.2764 %arrayidx.3 = getelementptr inbounds nuw i32, ptr %x, i64 3765 %3 = load i32, ptr %arrayidx.3766 %conv.3 = sext i32 %3 to i64767 %add.3 = add nsw i64 %add.2, %conv.3768 %arrayidx.4 = getelementptr inbounds nuw i32, ptr %x, i64 4769 %4 = load i32, ptr %arrayidx.4770 %conv.4 = sext i32 %4 to i64771 %add.4 = add nsw i64 %add.3, %conv.4772 %arrayidx.5 = getelementptr inbounds nuw i32, ptr %x, i64 5773 %5 = load i32, ptr %arrayidx.5774 %conv.5 = sext i32 %5 to i64775 %add.5 = add nsw i64 %add.4, %conv.5776 %arrayidx.6 = getelementptr inbounds nuw i32, ptr %x, i64 6777 %6 = load i32, ptr %arrayidx.6778 %conv.6 = sext i32 %6 to i64779 %add.6 = add nsw i64 %add.5, %conv.6780 %arrayidx.7 = getelementptr inbounds nuw i32, ptr %x, i64 7781 %7 = load i32, ptr %arrayidx.7782 %conv.7 = sext i32 %7 to i64783 %add.7 = add nsw i64 %add.6, %conv.7784 %arrayidx.8 = getelementptr inbounds nuw i32, ptr %x, i64 8785 %8 = load i32, ptr %arrayidx.8786 %conv.8 = sext i32 %8 to i64787 %add.8 = add nsw i64 %add.7, %conv.8788 %arrayidx.9 = getelementptr inbounds nuw i32, ptr %x, i64 9789 %9 = load i32, ptr %arrayidx.9790 %conv.9 = sext i32 %9 to i64791 %add.9 = add nsw i64 %add.8, %conv.9792 %arrayidx.10 = getelementptr inbounds nuw i32, ptr %x, i64 10793 %10 = load i32, ptr %arrayidx.10794 %conv.10 = sext i32 %10 to i64795 %add.10 = add nsw i64 %add.9, %conv.10796 %arrayidx.11 = getelementptr inbounds nuw i32, ptr %x, i64 11797 %11 = load i32, ptr %arrayidx.11798 %conv.11 = sext i32 %11 to i64799 %add.11 = add nsw i64 %add.10, %conv.11800 %arrayidx.12 = getelementptr inbounds nuw i32, ptr %x, i64 12801 %12 = load i32, ptr %arrayidx.12802 %conv.12 = sext i32 %12 to i64803 %add.12 = add nsw i64 %add.11, %conv.12804 %arrayidx.13 = getelementptr inbounds nuw i32, ptr %x, i64 13805 %13 = load i32, ptr %arrayidx.13806 %conv.13 = sext i32 %13 to i64807 %add.13 = add nsw i64 %add.12, %conv.13808 %arrayidx.14 = getelementptr inbounds nuw i32, ptr %x, i64 14809 %14 = load i32, ptr %arrayidx.14810 %conv.14 = sext i32 %14 to i64811 %add.14 = add nsw i64 %add.13, %conv.14812 %arrayidx.15 = getelementptr inbounds nuw i32, ptr %x, i64 15813 %15 = load i32, ptr %arrayidx.15814 %conv.15 = sext i32 %15 to i64815 %add.15 = add nsw i64 %add.14, %conv.15816 %arrayidx.16 = getelementptr inbounds nuw i32, ptr %x, i64 16817 %16 = load i32, ptr %arrayidx.16818 %conv.16 = sext i32 %16 to i64819 %add.16 = add nsw i64 %add.15, %conv.16820 %arrayidx.17 = getelementptr inbounds nuw i32, ptr %x, i64 17821 %17 = load i32, ptr %arrayidx.17822 %conv.17 = sext i32 %17 to i64823 %add.17 = add nsw i64 %add.16, %conv.17824 %arrayidx.18 = getelementptr inbounds nuw i32, ptr %x, i64 18825 %18 = load i32, ptr %arrayidx.18826 %conv.18 = sext i32 %18 to i64827 %add.18 = add nsw i64 %add.17, %conv.18828 %arrayidx.19 = getelementptr inbounds nuw i32, ptr %x, i64 19829 %19 = load i32, ptr %arrayidx.19830 %conv.19 = sext i32 %19 to i64831 %add.19 = add nsw i64 %add.18, %conv.19832 %arrayidx.20 = getelementptr inbounds nuw i32, ptr %x, i64 20833 %20 = load i32, ptr %arrayidx.20834 %conv.20 = sext i32 %20 to i64835 %add.20 = add nsw i64 %add.19, %conv.20836 %arrayidx.21 = getelementptr inbounds nuw i32, ptr %x, i64 21837 %21 = load i32, ptr %arrayidx.21838 %conv.21 = sext i32 %21 to i64839 %add.21 = add nsw i64 %add.20, %conv.21840 %arrayidx.22 = getelementptr inbounds nuw i32, ptr %x, i64 22841 %22 = load i32, ptr %arrayidx.22842 %conv.22 = sext i32 %22 to i64843 %add.22 = add nsw i64 %add.21, %conv.22844 %arrayidx.23 = getelementptr inbounds nuw i32, ptr %x, i64 23845 %23 = load i32, ptr %arrayidx.23846 %conv.23 = sext i32 %23 to i64847 %add.23 = add nsw i64 %add.22, %conv.23848 %arrayidx.24 = getelementptr inbounds nuw i32, ptr %x, i64 24849 %24 = load i32, ptr %arrayidx.24850 %conv.24 = sext i32 %24 to i64851 %add.24 = add nsw i64 %add.23, %conv.24852 %arrayidx.25 = getelementptr inbounds nuw i32, ptr %x, i64 25853 %25 = load i32, ptr %arrayidx.25854 %conv.25 = sext i32 %25 to i64855 %add.25 = add nsw i64 %add.24, %conv.25856 %arrayidx.26 = getelementptr inbounds nuw i32, ptr %x, i64 26857 %26 = load i32, ptr %arrayidx.26858 %conv.26 = sext i32 %26 to i64859 %add.26 = add nsw i64 %add.25, %conv.26860 %arrayidx.27 = getelementptr inbounds nuw i32, ptr %x, i64 27861 %27 = load i32, ptr %arrayidx.27862 %conv.27 = sext i32 %27 to i64863 %add.27 = add nsw i64 %add.26, %conv.27864 %arrayidx.28 = getelementptr inbounds nuw i32, ptr %x, i64 28865 %28 = load i32, ptr %arrayidx.28866 %conv.28 = sext i32 %28 to i64867 %add.28 = add nsw i64 %add.27, %conv.28868 %arrayidx.29 = getelementptr inbounds nuw i32, ptr %x, i64 29869 %29 = load i32, ptr %arrayidx.29870 %conv.29 = sext i32 %29 to i64871 %add.29 = add nsw i64 %add.28, %conv.29872 %arrayidx.30 = getelementptr inbounds nuw i32, ptr %x, i64 30873 %30 = load i32, ptr %arrayidx.30874 %conv.30 = sext i32 %30 to i64875 %add.30 = add nsw i64 %add.29, %conv.30876 %arrayidx.31 = getelementptr inbounds nuw i32, ptr %x, i64 31877 %31 = load i32, ptr %arrayidx.31878 %conv.31 = sext i32 %31 to i64879 %add.31 = add nsw i64 %add.30, %conv.31880 ret i64 %add.31881}882 883 884 885; COST-LABEL: Function: mla_v4i8_i32886; COST: Cost: '-6'887define i32 @mla_v4i8_i32(ptr %x, ptr %y) "target-features"="+dotprod" {888; CHECK-LABEL: @mla_v4i8_i32(889; CHECK-NEXT: entry:890; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i8>, ptr [[X:%.*]], align 1891; CHECK-NEXT: [[TMP1:%.*]] = sext <4 x i8> [[TMP0]] to <4 x i32>892; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i8>, ptr [[Y:%.*]], align 1893; CHECK-NEXT: [[TMP3:%.*]] = sext <4 x i8> [[TMP2]] to <4 x i32>894; CHECK-NEXT: [[TMP4:%.*]] = mul nsw <4 x i32> [[TMP3]], [[TMP1]]895; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP4]])896; CHECK-NEXT: ret i32 [[TMP5]]897;898entry:899 %0 = load i8, ptr %x900 %conv = sext i8 %0 to i32901 %1 = load i8, ptr %y902 %conv3 = sext i8 %1 to i32903 %mul = mul nsw i32 %conv3, %conv904 %arrayidx.1 = getelementptr inbounds nuw i8, ptr %x, i64 1905 %2 = load i8, ptr %arrayidx.1906 %conv.1 = sext i8 %2 to i32907 %arrayidx2.1 = getelementptr inbounds nuw i8, ptr %y, i64 1908 %3 = load i8, ptr %arrayidx2.1909 %conv3.1 = sext i8 %3 to i32910 %mul.1 = mul nsw i32 %conv3.1, %conv.1911 %add.1 = add nsw i32 %mul.1, %mul912 %arrayidx.2 = getelementptr inbounds nuw i8, ptr %x, i64 2913 %4 = load i8, ptr %arrayidx.2914 %conv.2 = sext i8 %4 to i32915 %arrayidx2.2 = getelementptr inbounds nuw i8, ptr %y, i64 2916 %5 = load i8, ptr %arrayidx2.2917 %conv3.2 = sext i8 %5 to i32918 %mul.2 = mul nsw i32 %conv3.2, %conv.2919 %add.2 = add nsw i32 %mul.2, %add.1920 %arrayidx.3 = getelementptr inbounds nuw i8, ptr %x, i64 3921 %6 = load i8, ptr %arrayidx.3922 %conv.3 = sext i8 %6 to i32923 %arrayidx2.3 = getelementptr inbounds nuw i8, ptr %y, i64 3924 %7 = load i8, ptr %arrayidx2.3925 %conv3.3 = sext i8 %7 to i32926 %mul.3 = mul nsw i32 %conv3.3, %conv.3927 %add.3 = add nsw i32 %mul.3, %add.2928 ret i32 %add.3929}930 931 932; COST-LABEL: Function: mla_v8i8_i32933; COST: Cost: '-24'934define i32 @mla_v8i8_i32(ptr %x, ptr %y) "target-features"="+dotprod" {935; CHECK-LABEL: @mla_v8i8_i32(936; CHECK-NEXT: entry:937; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[X:%.*]], align 1938; CHECK-NEXT: [[TMP1:%.*]] = sext <8 x i8> [[TMP0]] to <8 x i32>939; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i8>, ptr [[Y:%.*]], align 1940; CHECK-NEXT: [[TMP3:%.*]] = sext <8 x i8> [[TMP2]] to <8 x i32>941; CHECK-NEXT: [[TMP4:%.*]] = mul nsw <8 x i32> [[TMP3]], [[TMP1]]942; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> [[TMP4]])943; CHECK-NEXT: ret i32 [[TMP5]]944;945entry:946 %0 = load i8, ptr %x947 %conv = sext i8 %0 to i32948 %1 = load i8, ptr %y949 %conv3 = sext i8 %1 to i32950 %mul = mul nsw i32 %conv3, %conv951 %arrayidx.1 = getelementptr inbounds nuw i8, ptr %x, i64 1952 %2 = load i8, ptr %arrayidx.1953 %conv.1 = sext i8 %2 to i32954 %arrayidx2.1 = getelementptr inbounds nuw i8, ptr %y, i64 1955 %3 = load i8, ptr %arrayidx2.1956 %conv3.1 = sext i8 %3 to i32957 %mul.1 = mul nsw i32 %conv3.1, %conv.1958 %add.1 = add nsw i32 %mul.1, %mul959 %arrayidx.2 = getelementptr inbounds nuw i8, ptr %x, i64 2960 %4 = load i8, ptr %arrayidx.2961 %conv.2 = sext i8 %4 to i32962 %arrayidx2.2 = getelementptr inbounds nuw i8, ptr %y, i64 2963 %5 = load i8, ptr %arrayidx2.2964 %conv3.2 = sext i8 %5 to i32965 %mul.2 = mul nsw i32 %conv3.2, %conv.2966 %add.2 = add nsw i32 %mul.2, %add.1967 %arrayidx.3 = getelementptr inbounds nuw i8, ptr %x, i64 3968 %6 = load i8, ptr %arrayidx.3969 %conv.3 = sext i8 %6 to i32970 %arrayidx2.3 = getelementptr inbounds nuw i8, ptr %y, i64 3971 %7 = load i8, ptr %arrayidx2.3972 %conv3.3 = sext i8 %7 to i32973 %mul.3 = mul nsw i32 %conv3.3, %conv.3974 %add.3 = add nsw i32 %mul.3, %add.2975 %arrayidx.4 = getelementptr inbounds nuw i8, ptr %x, i64 4976 %8 = load i8, ptr %arrayidx.4977 %conv.4 = sext i8 %8 to i32978 %arrayidx2.4 = getelementptr inbounds nuw i8, ptr %y, i64 4979 %9 = load i8, ptr %arrayidx2.4980 %conv3.4 = sext i8 %9 to i32981 %mul.4 = mul nsw i32 %conv3.4, %conv.4982 %add.4 = add nsw i32 %mul.4, %add.3983 %arrayidx.5 = getelementptr inbounds nuw i8, ptr %x, i64 5984 %10 = load i8, ptr %arrayidx.5985 %conv.5 = sext i8 %10 to i32986 %arrayidx2.5 = getelementptr inbounds nuw i8, ptr %y, i64 5987 %11 = load i8, ptr %arrayidx2.5988 %conv3.5 = sext i8 %11 to i32989 %mul.5 = mul nsw i32 %conv3.5, %conv.5990 %add.5 = add nsw i32 %mul.5, %add.4991 %arrayidx.6 = getelementptr inbounds nuw i8, ptr %x, i64 6992 %12 = load i8, ptr %arrayidx.6993 %conv.6 = sext i8 %12 to i32994 %arrayidx2.6 = getelementptr inbounds nuw i8, ptr %y, i64 6995 %13 = load i8, ptr %arrayidx2.6996 %conv3.6 = sext i8 %13 to i32997 %mul.6 = mul nsw i32 %conv3.6, %conv.6998 %add.6 = add nsw i32 %mul.6, %add.5999 %arrayidx.7 = getelementptr inbounds nuw i8, ptr %x, i64 71000 %14 = load i8, ptr %arrayidx.71001 %conv.7 = sext i8 %14 to i321002 %arrayidx2.7 = getelementptr inbounds nuw i8, ptr %y, i64 71003 %15 = load i8, ptr %arrayidx2.71004 %conv3.7 = sext i8 %15 to i321005 %mul.7 = mul nsw i32 %conv3.7, %conv.71006 %add.7 = add nsw i32 %mul.7, %add.61007 ret i32 %add.71008}1009 1010 1011; COST-LABEL: Function: mla_v16i8_i321012; COST: Cost: '-52'1013define i32 @mla_v16i8_i32(ptr %x, ptr %y) "target-features"="+dotprod" {1014; CHECK-LABEL: @mla_v16i8_i32(1015; CHECK-NEXT: entry:1016; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr [[X:%.*]], align 11017; CHECK-NEXT: [[TMP1:%.*]] = sext <16 x i8> [[TMP0]] to <16 x i32>1018; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr [[Y:%.*]], align 11019; CHECK-NEXT: [[TMP3:%.*]] = sext <16 x i8> [[TMP2]] to <16 x i32>1020; CHECK-NEXT: [[TMP4:%.*]] = mul nsw <16 x i32> [[TMP3]], [[TMP1]]1021; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> [[TMP4]])1022; CHECK-NEXT: ret i32 [[TMP5]]1023;1024entry:1025 %0 = load i8, ptr %x1026 %conv = sext i8 %0 to i321027 %1 = load i8, ptr %y1028 %conv3 = sext i8 %1 to i321029 %mul = mul nsw i32 %conv3, %conv1030 %arrayidx.1 = getelementptr inbounds nuw i8, ptr %x, i64 11031 %2 = load i8, ptr %arrayidx.11032 %conv.1 = sext i8 %2 to i321033 %arrayidx2.1 = getelementptr inbounds nuw i8, ptr %y, i64 11034 %3 = load i8, ptr %arrayidx2.11035 %conv3.1 = sext i8 %3 to i321036 %mul.1 = mul nsw i32 %conv3.1, %conv.11037 %add.1 = add nsw i32 %mul.1, %mul1038 %arrayidx.2 = getelementptr inbounds nuw i8, ptr %x, i64 21039 %4 = load i8, ptr %arrayidx.21040 %conv.2 = sext i8 %4 to i321041 %arrayidx2.2 = getelementptr inbounds nuw i8, ptr %y, i64 21042 %5 = load i8, ptr %arrayidx2.21043 %conv3.2 = sext i8 %5 to i321044 %mul.2 = mul nsw i32 %conv3.2, %conv.21045 %add.2 = add nsw i32 %mul.2, %add.11046 %arrayidx.3 = getelementptr inbounds nuw i8, ptr %x, i64 31047 %6 = load i8, ptr %arrayidx.31048 %conv.3 = sext i8 %6 to i321049 %arrayidx2.3 = getelementptr inbounds nuw i8, ptr %y, i64 31050 %7 = load i8, ptr %arrayidx2.31051 %conv3.3 = sext i8 %7 to i321052 %mul.3 = mul nsw i32 %conv3.3, %conv.31053 %add.3 = add nsw i32 %mul.3, %add.21054 %arrayidx.4 = getelementptr inbounds nuw i8, ptr %x, i64 41055 %8 = load i8, ptr %arrayidx.41056 %conv.4 = sext i8 %8 to i321057 %arrayidx2.4 = getelementptr inbounds nuw i8, ptr %y, i64 41058 %9 = load i8, ptr %arrayidx2.41059 %conv3.4 = sext i8 %9 to i321060 %mul.4 = mul nsw i32 %conv3.4, %conv.41061 %add.4 = add nsw i32 %mul.4, %add.31062 %arrayidx.5 = getelementptr inbounds nuw i8, ptr %x, i64 51063 %10 = load i8, ptr %arrayidx.51064 %conv.5 = sext i8 %10 to i321065 %arrayidx2.5 = getelementptr inbounds nuw i8, ptr %y, i64 51066 %11 = load i8, ptr %arrayidx2.51067 %conv3.5 = sext i8 %11 to i321068 %mul.5 = mul nsw i32 %conv3.5, %conv.51069 %add.5 = add nsw i32 %mul.5, %add.41070 %arrayidx.6 = getelementptr inbounds nuw i8, ptr %x, i64 61071 %12 = load i8, ptr %arrayidx.61072 %conv.6 = sext i8 %12 to i321073 %arrayidx2.6 = getelementptr inbounds nuw i8, ptr %y, i64 61074 %13 = load i8, ptr %arrayidx2.61075 %conv3.6 = sext i8 %13 to i321076 %mul.6 = mul nsw i32 %conv3.6, %conv.61077 %add.6 = add nsw i32 %mul.6, %add.51078 %arrayidx.7 = getelementptr inbounds nuw i8, ptr %x, i64 71079 %14 = load i8, ptr %arrayidx.71080 %conv.7 = sext i8 %14 to i321081 %arrayidx2.7 = getelementptr inbounds nuw i8, ptr %y, i64 71082 %15 = load i8, ptr %arrayidx2.71083 %conv3.7 = sext i8 %15 to i321084 %mul.7 = mul nsw i32 %conv3.7, %conv.71085 %add.7 = add nsw i32 %mul.7, %add.61086 %arrayidx.8 = getelementptr inbounds nuw i8, ptr %x, i64 81087 %16 = load i8, ptr %arrayidx.81088 %conv.8 = sext i8 %16 to i321089 %arrayidx2.8 = getelementptr inbounds nuw i8, ptr %y, i64 81090 %17 = load i8, ptr %arrayidx2.81091 %conv3.8 = sext i8 %17 to i321092 %mul.8 = mul nsw i32 %conv3.8, %conv.81093 %add.8 = add nsw i32 %mul.8, %add.71094 %arrayidx.9 = getelementptr inbounds nuw i8, ptr %x, i64 91095 %18 = load i8, ptr %arrayidx.91096 %conv.9 = sext i8 %18 to i321097 %arrayidx2.9 = getelementptr inbounds nuw i8, ptr %y, i64 91098 %19 = load i8, ptr %arrayidx2.91099 %conv3.9 = sext i8 %19 to i321100 %mul.9 = mul nsw i32 %conv3.9, %conv.91101 %add.9 = add nsw i32 %mul.9, %add.81102 %arrayidx.10 = getelementptr inbounds nuw i8, ptr %x, i64 101103 %20 = load i8, ptr %arrayidx.101104 %conv.10 = sext i8 %20 to i321105 %arrayidx2.10 = getelementptr inbounds nuw i8, ptr %y, i64 101106 %21 = load i8, ptr %arrayidx2.101107 %conv3.10 = sext i8 %21 to i321108 %mul.10 = mul nsw i32 %conv3.10, %conv.101109 %add.10 = add nsw i32 %mul.10, %add.91110 %arrayidx.11 = getelementptr inbounds nuw i8, ptr %x, i64 111111 %22 = load i8, ptr %arrayidx.111112 %conv.11 = sext i8 %22 to i321113 %arrayidx2.11 = getelementptr inbounds nuw i8, ptr %y, i64 111114 %23 = load i8, ptr %arrayidx2.111115 %conv3.11 = sext i8 %23 to i321116 %mul.11 = mul nsw i32 %conv3.11, %conv.111117 %add.11 = add nsw i32 %mul.11, %add.101118 %arrayidx.12 = getelementptr inbounds nuw i8, ptr %x, i64 121119 %24 = load i8, ptr %arrayidx.121120 %conv.12 = sext i8 %24 to i321121 %arrayidx2.12 = getelementptr inbounds nuw i8, ptr %y, i64 121122 %25 = load i8, ptr %arrayidx2.121123 %conv3.12 = sext i8 %25 to i321124 %mul.12 = mul nsw i32 %conv3.12, %conv.121125 %add.12 = add nsw i32 %mul.12, %add.111126 %arrayidx.13 = getelementptr inbounds nuw i8, ptr %x, i64 131127 %26 = load i8, ptr %arrayidx.131128 %conv.13 = sext i8 %26 to i321129 %arrayidx2.13 = getelementptr inbounds nuw i8, ptr %y, i64 131130 %27 = load i8, ptr %arrayidx2.131131 %conv3.13 = sext i8 %27 to i321132 %mul.13 = mul nsw i32 %conv3.13, %conv.131133 %add.13 = add nsw i32 %mul.13, %add.121134 %arrayidx.14 = getelementptr inbounds nuw i8, ptr %x, i64 141135 %28 = load i8, ptr %arrayidx.141136 %conv.14 = sext i8 %28 to i321137 %arrayidx2.14 = getelementptr inbounds nuw i8, ptr %y, i64 141138 %29 = load i8, ptr %arrayidx2.141139 %conv3.14 = sext i8 %29 to i321140 %mul.14 = mul nsw i32 %conv3.14, %conv.141141 %add.14 = add nsw i32 %mul.14, %add.131142 %arrayidx.15 = getelementptr inbounds nuw i8, ptr %x, i64 151143 %30 = load i8, ptr %arrayidx.151144 %conv.15 = sext i8 %30 to i321145 %arrayidx2.15 = getelementptr inbounds nuw i8, ptr %y, i64 151146 %31 = load i8, ptr %arrayidx2.151147 %conv3.15 = sext i8 %31 to i321148 %mul.15 = mul nsw i32 %conv3.15, %conv.151149 %add.15 = add nsw i32 %mul.15, %add.141150 ret i32 %add.151151}1152 1153; COST-LABEL: Function: mla_v16i8_i32_sub1154; COST: Cost: '-2'1155define i32 @mla_v16i8_i32_sub(ptr %x, ptr %y) "target-features"="+dotprod" {1156; CHECK-LABEL: @mla_v16i8_i32_sub(1157; CHECK-NEXT: entry:1158; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[X:%.*]], align 11159; CHECK-NEXT: [[CONV:%.*]] = sext i8 [[TMP0]] to i321160; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[Y:%.*]], align 11161; CHECK-NEXT: [[CONV3:%.*]] = sext i8 [[TMP1]] to i321162; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[CONV3]], [[CONV]]1163; CHECK-NEXT: [[ARRAYIDX_1:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 11164; CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[ARRAYIDX_1]], align 11165; CHECK-NEXT: [[CONV_1:%.*]] = sext i8 [[TMP2]] to i321166; CHECK-NEXT: [[ARRAYIDX2_1:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 11167; CHECK-NEXT: [[TMP3:%.*]] = load i8, ptr [[ARRAYIDX2_1]], align 11168; CHECK-NEXT: [[CONV3_1:%.*]] = sext i8 [[TMP3]] to i321169; CHECK-NEXT: [[MUL_1:%.*]] = mul nsw i32 [[CONV3_1]], [[CONV_1]]1170; CHECK-NEXT: [[SUB_1:%.*]] = sub nsw i32 [[MUL_1]], [[MUL]]1171; CHECK-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 21172; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[ARRAYIDX_2]], align 11173; CHECK-NEXT: [[CONV_2:%.*]] = sext i8 [[TMP4]] to i321174; CHECK-NEXT: [[ARRAYIDX2_2:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 21175; CHECK-NEXT: [[TMP5:%.*]] = load i8, ptr [[ARRAYIDX2_2]], align 11176; CHECK-NEXT: [[CONV3_2:%.*]] = sext i8 [[TMP5]] to i321177; CHECK-NEXT: [[MUL_2:%.*]] = mul nsw i32 [[CONV3_2]], [[CONV_2]]1178; CHECK-NEXT: [[SUB_2:%.*]] = sub nsw i32 [[MUL_2]], [[SUB_1]]1179; CHECK-NEXT: [[ARRAYIDX_3:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 31180; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[ARRAYIDX_3]], align 11181; CHECK-NEXT: [[CONV_3:%.*]] = sext i8 [[TMP6]] to i321182; CHECK-NEXT: [[ARRAYIDX2_3:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 31183; CHECK-NEXT: [[TMP7:%.*]] = load i8, ptr [[ARRAYIDX2_3]], align 11184; CHECK-NEXT: [[CONV3_3:%.*]] = sext i8 [[TMP7]] to i321185; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i32 [[CONV3_3]], [[CONV_3]]1186; CHECK-NEXT: [[SUB_3:%.*]] = sub nsw i32 [[MUL_3]], [[SUB_2]]1187; CHECK-NEXT: [[ARRAYIDX_4:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 41188; CHECK-NEXT: [[TMP8:%.*]] = load i8, ptr [[ARRAYIDX_4]], align 11189; CHECK-NEXT: [[CONV_4:%.*]] = sext i8 [[TMP8]] to i321190; CHECK-NEXT: [[ARRAYIDX2_4:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 41191; CHECK-NEXT: [[TMP9:%.*]] = load i8, ptr [[ARRAYIDX2_4]], align 11192; CHECK-NEXT: [[CONV3_4:%.*]] = sext i8 [[TMP9]] to i321193; CHECK-NEXT: [[MUL_4:%.*]] = mul nsw i32 [[CONV3_4]], [[CONV_4]]1194; CHECK-NEXT: [[SUB_4:%.*]] = sub nsw i32 [[MUL_4]], [[SUB_3]]1195; CHECK-NEXT: [[ARRAYIDX_5:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 51196; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[ARRAYIDX_5]], align 11197; CHECK-NEXT: [[CONV_5:%.*]] = sext i8 [[TMP10]] to i321198; CHECK-NEXT: [[ARRAYIDX2_5:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 51199; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[ARRAYIDX2_5]], align 11200; CHECK-NEXT: [[CONV3_5:%.*]] = sext i8 [[TMP11]] to i321201; CHECK-NEXT: [[MUL_5:%.*]] = mul nsw i32 [[CONV3_5]], [[CONV_5]]1202; CHECK-NEXT: [[SUB_5:%.*]] = sub nsw i32 [[MUL_5]], [[SUB_4]]1203; CHECK-NEXT: [[ARRAYIDX_6:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 61204; CHECK-NEXT: [[TMP12:%.*]] = load i8, ptr [[ARRAYIDX_6]], align 11205; CHECK-NEXT: [[CONV_6:%.*]] = sext i8 [[TMP12]] to i321206; CHECK-NEXT: [[ARRAYIDX2_6:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 61207; CHECK-NEXT: [[TMP13:%.*]] = load i8, ptr [[ARRAYIDX2_6]], align 11208; CHECK-NEXT: [[CONV3_6:%.*]] = sext i8 [[TMP13]] to i321209; CHECK-NEXT: [[MUL_6:%.*]] = mul nsw i32 [[CONV3_6]], [[CONV_6]]1210; CHECK-NEXT: [[SUB_6:%.*]] = sub nsw i32 [[MUL_6]], [[SUB_5]]1211; CHECK-NEXT: [[ARRAYIDX_7:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 71212; CHECK-NEXT: [[TMP14:%.*]] = load i8, ptr [[ARRAYIDX_7]], align 11213; CHECK-NEXT: [[CONV_7:%.*]] = sext i8 [[TMP14]] to i321214; CHECK-NEXT: [[ARRAYIDX2_7:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 71215; CHECK-NEXT: [[TMP15:%.*]] = load i8, ptr [[ARRAYIDX2_7]], align 11216; CHECK-NEXT: [[CONV3_7:%.*]] = sext i8 [[TMP15]] to i321217; CHECK-NEXT: [[MUL_7:%.*]] = mul nsw i32 [[CONV3_7]], [[CONV_7]]1218; CHECK-NEXT: [[SUB_7:%.*]] = sub nsw i32 [[MUL_7]], [[SUB_6]]1219; CHECK-NEXT: [[ARRAYIDX_8:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 81220; CHECK-NEXT: [[TMP16:%.*]] = load i8, ptr [[ARRAYIDX_8]], align 11221; CHECK-NEXT: [[CONV_8:%.*]] = sext i8 [[TMP16]] to i321222; CHECK-NEXT: [[ARRAYIDX2_8:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 81223; CHECK-NEXT: [[TMP17:%.*]] = load i8, ptr [[ARRAYIDX2_8]], align 11224; CHECK-NEXT: [[CONV3_8:%.*]] = sext i8 [[TMP17]] to i321225; CHECK-NEXT: [[MUL_8:%.*]] = mul nsw i32 [[CONV3_8]], [[CONV_8]]1226; CHECK-NEXT: [[SUB_8:%.*]] = sub nsw i32 [[MUL_8]], [[SUB_7]]1227; CHECK-NEXT: [[ARRAYIDX_9:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 91228; CHECK-NEXT: [[TMP18:%.*]] = load i8, ptr [[ARRAYIDX_9]], align 11229; CHECK-NEXT: [[CONV_9:%.*]] = sext i8 [[TMP18]] to i321230; CHECK-NEXT: [[ARRAYIDX2_9:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 91231; CHECK-NEXT: [[TMP19:%.*]] = load i8, ptr [[ARRAYIDX2_9]], align 11232; CHECK-NEXT: [[CONV3_9:%.*]] = sext i8 [[TMP19]] to i321233; CHECK-NEXT: [[MUL_9:%.*]] = mul nsw i32 [[CONV3_9]], [[CONV_9]]1234; CHECK-NEXT: [[SUB_9:%.*]] = sub nsw i32 [[MUL_9]], [[SUB_8]]1235; CHECK-NEXT: [[ARRAYIDX_10:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 101236; CHECK-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX_10]], align 11237; CHECK-NEXT: [[CONV_10:%.*]] = sext i8 [[TMP20]] to i321238; CHECK-NEXT: [[ARRAYIDX2_10:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 101239; CHECK-NEXT: [[TMP21:%.*]] = load i8, ptr [[ARRAYIDX2_10]], align 11240; CHECK-NEXT: [[CONV3_10:%.*]] = sext i8 [[TMP21]] to i321241; CHECK-NEXT: [[MUL_10:%.*]] = mul nsw i32 [[CONV3_10]], [[CONV_10]]1242; CHECK-NEXT: [[SUB_10:%.*]] = sub nsw i32 [[MUL_10]], [[SUB_9]]1243; CHECK-NEXT: [[ARRAYIDX_11:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 111244; CHECK-NEXT: [[TMP22:%.*]] = load i8, ptr [[ARRAYIDX_11]], align 11245; CHECK-NEXT: [[CONV_11:%.*]] = sext i8 [[TMP22]] to i321246; CHECK-NEXT: [[ARRAYIDX2_11:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 111247; CHECK-NEXT: [[TMP23:%.*]] = load i8, ptr [[ARRAYIDX2_11]], align 11248; CHECK-NEXT: [[CONV3_11:%.*]] = sext i8 [[TMP23]] to i321249; CHECK-NEXT: [[MUL_11:%.*]] = mul nsw i32 [[CONV3_11]], [[CONV_11]]1250; CHECK-NEXT: [[SUB_11:%.*]] = sub nsw i32 [[MUL_11]], [[SUB_10]]1251; CHECK-NEXT: [[ARRAYIDX_12:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 121252; CHECK-NEXT: [[TMP24:%.*]] = load i8, ptr [[ARRAYIDX_12]], align 11253; CHECK-NEXT: [[CONV_12:%.*]] = sext i8 [[TMP24]] to i321254; CHECK-NEXT: [[ARRAYIDX2_12:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 121255; CHECK-NEXT: [[TMP25:%.*]] = load i8, ptr [[ARRAYIDX2_12]], align 11256; CHECK-NEXT: [[CONV3_12:%.*]] = sext i8 [[TMP25]] to i321257; CHECK-NEXT: [[MUL_12:%.*]] = mul nsw i32 [[CONV3_12]], [[CONV_12]]1258; CHECK-NEXT: [[SUB_12:%.*]] = sub nsw i32 [[MUL_12]], [[SUB_11]]1259; CHECK-NEXT: [[ARRAYIDX_13:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 131260; CHECK-NEXT: [[TMP26:%.*]] = load i8, ptr [[ARRAYIDX_13]], align 11261; CHECK-NEXT: [[CONV_13:%.*]] = sext i8 [[TMP26]] to i321262; CHECK-NEXT: [[ARRAYIDX2_13:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 131263; CHECK-NEXT: [[TMP27:%.*]] = load i8, ptr [[ARRAYIDX2_13]], align 11264; CHECK-NEXT: [[CONV3_13:%.*]] = sext i8 [[TMP27]] to i321265; CHECK-NEXT: [[MUL_13:%.*]] = mul nsw i32 [[CONV3_13]], [[CONV_13]]1266; CHECK-NEXT: [[SUB_13:%.*]] = sub nsw i32 [[MUL_13]], [[SUB_12]]1267; CHECK-NEXT: [[ARRAYIDX_14:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 141268; CHECK-NEXT: [[TMP28:%.*]] = load i8, ptr [[ARRAYIDX_14]], align 11269; CHECK-NEXT: [[CONV_14:%.*]] = sext i8 [[TMP28]] to i321270; CHECK-NEXT: [[ARRAYIDX2_14:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 141271; CHECK-NEXT: [[TMP29:%.*]] = load i8, ptr [[ARRAYIDX2_14]], align 11272; CHECK-NEXT: [[CONV3_14:%.*]] = sext i8 [[TMP29]] to i321273; CHECK-NEXT: [[MUL_14:%.*]] = mul nsw i32 [[CONV3_14]], [[CONV_14]]1274; CHECK-NEXT: [[SUB_14:%.*]] = sub nsw i32 [[MUL_14]], [[SUB_13]]1275; CHECK-NEXT: [[ARRAYIDX_15:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 151276; CHECK-NEXT: [[TMP30:%.*]] = load i8, ptr [[ARRAYIDX_15]], align 11277; CHECK-NEXT: [[CONV_15:%.*]] = sext i8 [[TMP30]] to i321278; CHECK-NEXT: [[ARRAYIDX2_15:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 151279; CHECK-NEXT: [[TMP31:%.*]] = load i8, ptr [[ARRAYIDX2_15]], align 11280; CHECK-NEXT: [[CONV3_15:%.*]] = sext i8 [[TMP31]] to i321281; CHECK-NEXT: [[MUL_15:%.*]] = mul nsw i32 [[CONV3_15]], [[CONV_15]]1282; CHECK-NEXT: [[SUB_15:%.*]] = sub nsw i32 [[MUL_15]], [[SUB_14]]1283; CHECK-NEXT: ret i32 [[SUB_15]]1284;1285entry:1286 %0 = load i8, ptr %x1287 %conv = sext i8 %0 to i321288 %1 = load i8, ptr %y1289 %conv3 = sext i8 %1 to i321290 %mul = mul nsw i32 %conv3, %conv1291 %arrayidx.1 = getelementptr inbounds nuw i8, ptr %x, i64 11292 %2 = load i8, ptr %arrayidx.11293 %conv.1 = sext i8 %2 to i321294 %arrayidx2.1 = getelementptr inbounds nuw i8, ptr %y, i64 11295 %3 = load i8, ptr %arrayidx2.11296 %conv3.1 = sext i8 %3 to i321297 %mul.1 = mul nsw i32 %conv3.1, %conv.11298 %sub.1 = sub nsw i32 %mul.1, %mul1299 %arrayidx.2 = getelementptr inbounds nuw i8, ptr %x, i64 21300 %4 = load i8, ptr %arrayidx.21301 %conv.2 = sext i8 %4 to i321302 %arrayidx2.2 = getelementptr inbounds nuw i8, ptr %y, i64 21303 %5 = load i8, ptr %arrayidx2.21304 %conv3.2 = sext i8 %5 to i321305 %mul.2 = mul nsw i32 %conv3.2, %conv.21306 %sub.2 = sub nsw i32 %mul.2, %sub.11307 %arrayidx.3 = getelementptr inbounds nuw i8, ptr %x, i64 31308 %6 = load i8, ptr %arrayidx.31309 %conv.3 = sext i8 %6 to i321310 %arrayidx2.3 = getelementptr inbounds nuw i8, ptr %y, i64 31311 %7 = load i8, ptr %arrayidx2.31312 %conv3.3 = sext i8 %7 to i321313 %mul.3 = mul nsw i32 %conv3.3, %conv.31314 %sub.3 = sub nsw i32 %mul.3, %sub.21315 %arrayidx.4 = getelementptr inbounds nuw i8, ptr %x, i64 41316 %8 = load i8, ptr %arrayidx.41317 %conv.4 = sext i8 %8 to i321318 %arrayidx2.4 = getelementptr inbounds nuw i8, ptr %y, i64 41319 %9 = load i8, ptr %arrayidx2.41320 %conv3.4 = sext i8 %9 to i321321 %mul.4 = mul nsw i32 %conv3.4, %conv.41322 %sub.4 = sub nsw i32 %mul.4, %sub.31323 %arrayidx.5 = getelementptr inbounds nuw i8, ptr %x, i64 51324 %10 = load i8, ptr %arrayidx.51325 %conv.5 = sext i8 %10 to i321326 %arrayidx2.5 = getelementptr inbounds nuw i8, ptr %y, i64 51327 %11 = load i8, ptr %arrayidx2.51328 %conv3.5 = sext i8 %11 to i321329 %mul.5 = mul nsw i32 %conv3.5, %conv.51330 %sub.5 = sub nsw i32 %mul.5, %sub.41331 %arrayidx.6 = getelementptr inbounds nuw i8, ptr %x, i64 61332 %12 = load i8, ptr %arrayidx.61333 %conv.6 = sext i8 %12 to i321334 %arrayidx2.6 = getelementptr inbounds nuw i8, ptr %y, i64 61335 %13 = load i8, ptr %arrayidx2.61336 %conv3.6 = sext i8 %13 to i321337 %mul.6 = mul nsw i32 %conv3.6, %conv.61338 %sub.6 = sub nsw i32 %mul.6, %sub.51339 %arrayidx.7 = getelementptr inbounds nuw i8, ptr %x, i64 71340 %14 = load i8, ptr %arrayidx.71341 %conv.7 = sext i8 %14 to i321342 %arrayidx2.7 = getelementptr inbounds nuw i8, ptr %y, i64 71343 %15 = load i8, ptr %arrayidx2.71344 %conv3.7 = sext i8 %15 to i321345 %mul.7 = mul nsw i32 %conv3.7, %conv.71346 %sub.7 = sub nsw i32 %mul.7, %sub.61347 %arrayidx.8 = getelementptr inbounds nuw i8, ptr %x, i64 81348 %16 = load i8, ptr %arrayidx.81349 %conv.8 = sext i8 %16 to i321350 %arrayidx2.8 = getelementptr inbounds nuw i8, ptr %y, i64 81351 %17 = load i8, ptr %arrayidx2.81352 %conv3.8 = sext i8 %17 to i321353 %mul.8 = mul nsw i32 %conv3.8, %conv.81354 %sub.8 = sub nsw i32 %mul.8, %sub.71355 %arrayidx.9 = getelementptr inbounds nuw i8, ptr %x, i64 91356 %18 = load i8, ptr %arrayidx.91357 %conv.9 = sext i8 %18 to i321358 %arrayidx2.9 = getelementptr inbounds nuw i8, ptr %y, i64 91359 %19 = load i8, ptr %arrayidx2.91360 %conv3.9 = sext i8 %19 to i321361 %mul.9 = mul nsw i32 %conv3.9, %conv.91362 %sub.9 = sub nsw i32 %mul.9, %sub.81363 %arrayidx.10 = getelementptr inbounds nuw i8, ptr %x, i64 101364 %20 = load i8, ptr %arrayidx.101365 %conv.10 = sext i8 %20 to i321366 %arrayidx2.10 = getelementptr inbounds nuw i8, ptr %y, i64 101367 %21 = load i8, ptr %arrayidx2.101368 %conv3.10 = sext i8 %21 to i321369 %mul.10 = mul nsw i32 %conv3.10, %conv.101370 %sub.10 = sub nsw i32 %mul.10, %sub.91371 %arrayidx.11 = getelementptr inbounds nuw i8, ptr %x, i64 111372 %22 = load i8, ptr %arrayidx.111373 %conv.11 = sext i8 %22 to i321374 %arrayidx2.11 = getelementptr inbounds nuw i8, ptr %y, i64 111375 %23 = load i8, ptr %arrayidx2.111376 %conv3.11 = sext i8 %23 to i321377 %mul.11 = mul nsw i32 %conv3.11, %conv.111378 %sub.11 = sub nsw i32 %mul.11, %sub.101379 %arrayidx.12 = getelementptr inbounds nuw i8, ptr %x, i64 121380 %24 = load i8, ptr %arrayidx.121381 %conv.12 = sext i8 %24 to i321382 %arrayidx2.12 = getelementptr inbounds nuw i8, ptr %y, i64 121383 %25 = load i8, ptr %arrayidx2.121384 %conv3.12 = sext i8 %25 to i321385 %mul.12 = mul nsw i32 %conv3.12, %conv.121386 %sub.12 = sub nsw i32 %mul.12, %sub.111387 %arrayidx.13 = getelementptr inbounds nuw i8, ptr %x, i64 131388 %26 = load i8, ptr %arrayidx.131389 %conv.13 = sext i8 %26 to i321390 %arrayidx2.13 = getelementptr inbounds nuw i8, ptr %y, i64 131391 %27 = load i8, ptr %arrayidx2.131392 %conv3.13 = sext i8 %27 to i321393 %mul.13 = mul nsw i32 %conv3.13, %conv.131394 %sub.13 = sub nsw i32 %mul.13, %sub.121395 %arrayidx.14 = getelementptr inbounds nuw i8, ptr %x, i64 141396 %28 = load i8, ptr %arrayidx.141397 %conv.14 = sext i8 %28 to i321398 %arrayidx2.14 = getelementptr inbounds nuw i8, ptr %y, i64 141399 %29 = load i8, ptr %arrayidx2.141400 %conv3.14 = sext i8 %29 to i321401 %mul.14 = mul nsw i32 %conv3.14, %conv.141402 %sub.14 = sub nsw i32 %mul.14, %sub.131403 %arrayidx.15 = getelementptr inbounds nuw i8, ptr %x, i64 151404 %30 = load i8, ptr %arrayidx.151405 %conv.15 = sext i8 %30 to i321406 %arrayidx2.15 = getelementptr inbounds nuw i8, ptr %y, i64 151407 %31 = load i8, ptr %arrayidx2.151408 %conv3.15 = sext i8 %31 to i321409 %mul.15 = mul nsw i32 %conv3.15, %conv.151410 %sub.15 = sub nsw i32 %mul.15, %sub.141411 ret i32 %sub.151412}1413