365 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=x86_64-unknown -mcpu=x86-64 -S | FileCheck %s --check-prefixes=CHECK,SSE3; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=x86_64-unknown -mcpu=x86-64-v2 -S | FileCheck %s --check-prefixes=CHECK,SSE4; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=x86_64-unknown -mcpu=x86-64-v3 -S | FileCheck %s --check-prefixes=CHECK,AVX5; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=x86_64-unknown -mcpu=x86-64-v4 -S | FileCheck %s --check-prefixes=CHECK,AVX6 7; // PR499348; void baz(unsigned char *dst, unsigned char *src) {9; for( int x = 0; x < 8; x++ ) {10; dst[x] = src[x]&(~63);11; }12; }13 14define void @and4(ptr noalias nocapture noundef writeonly %dst, ptr noalias nocapture noundef readonly %src) {15; CHECK-LABEL: @and4(16; CHECK-NEXT: entry:17; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i8>, ptr [[SRC:%.*]], align 118; CHECK-NEXT: [[TMP1:%.*]] = and <4 x i8> [[TMP0]], splat (i8 -64)19; CHECK-NEXT: store <4 x i8> [[TMP1]], ptr [[DST:%.*]], align 120; CHECK-NEXT: ret void21;22entry:23 %0 = load i8, ptr %src, align 124 %1 = and i8 %0, -6425 store i8 %1, ptr %dst, align 126 %arrayidx.1 = getelementptr inbounds i8, ptr %src, i64 127 %2 = load i8, ptr %arrayidx.1, align 128 %3 = and i8 %2, -6429 %arrayidx3.1 = getelementptr inbounds i8, ptr %dst, i64 130 store i8 %3, ptr %arrayidx3.1, align 131 %arrayidx.2 = getelementptr inbounds i8, ptr %src, i64 232 %4 = load i8, ptr %arrayidx.2, align 133 %5 = and i8 %4, -6434 %arrayidx3.2 = getelementptr inbounds i8, ptr %dst, i64 235 store i8 %5, ptr %arrayidx3.2, align 136 %arrayidx.3 = getelementptr inbounds i8, ptr %src, i64 337 %6 = load i8, ptr %arrayidx.3, align 138 %7 = and i8 %6, -6439 %arrayidx3.3 = getelementptr inbounds i8, ptr %dst, i64 340 store i8 %7, ptr %arrayidx3.3, align 141 ret void42}43 44define void @and8(ptr noalias nocapture noundef writeonly %dst, ptr noalias nocapture noundef readonly %src) {45; CHECK-LABEL: @and8(46; CHECK-NEXT: entry:47; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[SRC:%.*]], align 148; CHECK-NEXT: [[TMP1:%.*]] = and <8 x i8> [[TMP0]], splat (i8 -64)49; CHECK-NEXT: store <8 x i8> [[TMP1]], ptr [[DST:%.*]], align 150; CHECK-NEXT: ret void51;52entry:53 %0 = load i8, ptr %src, align 154 %1 = and i8 %0, -6455 store i8 %1, ptr %dst, align 156 %arrayidx.1 = getelementptr inbounds i8, ptr %src, i64 157 %2 = load i8, ptr %arrayidx.1, align 158 %3 = and i8 %2, -6459 %arrayidx3.1 = getelementptr inbounds i8, ptr %dst, i64 160 store i8 %3, ptr %arrayidx3.1, align 161 %arrayidx.2 = getelementptr inbounds i8, ptr %src, i64 262 %4 = load i8, ptr %arrayidx.2, align 163 %5 = and i8 %4, -6464 %arrayidx3.2 = getelementptr inbounds i8, ptr %dst, i64 265 store i8 %5, ptr %arrayidx3.2, align 166 %arrayidx.3 = getelementptr inbounds i8, ptr %src, i64 367 %6 = load i8, ptr %arrayidx.3, align 168 %7 = and i8 %6, -6469 %arrayidx3.3 = getelementptr inbounds i8, ptr %dst, i64 370 store i8 %7, ptr %arrayidx3.3, align 171 %arrayidx.4 = getelementptr inbounds i8, ptr %src, i64 472 %8 = load i8, ptr %arrayidx.4, align 173 %9 = and i8 %8, -6474 %arrayidx3.4 = getelementptr inbounds i8, ptr %dst, i64 475 store i8 %9, ptr %arrayidx3.4, align 176 %arrayidx.5 = getelementptr inbounds i8, ptr %src, i64 577 %10 = load i8, ptr %arrayidx.5, align 178 %11 = and i8 %10, -6479 %arrayidx3.5 = getelementptr inbounds i8, ptr %dst, i64 580 store i8 %11, ptr %arrayidx3.5, align 181 %arrayidx.6 = getelementptr inbounds i8, ptr %src, i64 682 %12 = load i8, ptr %arrayidx.6, align 183 %13 = and i8 %12, -6484 %arrayidx3.6 = getelementptr inbounds i8, ptr %dst, i64 685 store i8 %13, ptr %arrayidx3.6, align 186 %arrayidx.7 = getelementptr inbounds i8, ptr %src, i64 787 %14 = load i8, ptr %arrayidx.7, align 188 %15 = and i8 %14, -6489 %arrayidx3.7 = getelementptr inbounds i8, ptr %dst, i64 790 store i8 %15, ptr %arrayidx3.7, align 191 ret void92}93 94define void @and16(ptr noalias nocapture noundef writeonly %dst, ptr noalias nocapture noundef readonly %src) {95; CHECK-LABEL: @and16(96; CHECK-NEXT: entry:97; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr [[SRC:%.*]], align 198; CHECK-NEXT: [[TMP1:%.*]] = and <16 x i8> [[TMP0]], splat (i8 -64)99; CHECK-NEXT: store <16 x i8> [[TMP1]], ptr [[DST:%.*]], align 1100; CHECK-NEXT: ret void101;102entry:103 %0 = load i8, ptr %src, align 1104 %1 = and i8 %0, -64105 store i8 %1, ptr %dst, align 1106 %arrayidx.1 = getelementptr inbounds i8, ptr %src, i64 1107 %2 = load i8, ptr %arrayidx.1, align 1108 %3 = and i8 %2, -64109 %arrayidx3.1 = getelementptr inbounds i8, ptr %dst, i64 1110 store i8 %3, ptr %arrayidx3.1, align 1111 %arrayidx.2 = getelementptr inbounds i8, ptr %src, i64 2112 %4 = load i8, ptr %arrayidx.2, align 1113 %5 = and i8 %4, -64114 %arrayidx3.2 = getelementptr inbounds i8, ptr %dst, i64 2115 store i8 %5, ptr %arrayidx3.2, align 1116 %arrayidx.3 = getelementptr inbounds i8, ptr %src, i64 3117 %6 = load i8, ptr %arrayidx.3, align 1118 %7 = and i8 %6, -64119 %arrayidx3.3 = getelementptr inbounds i8, ptr %dst, i64 3120 store i8 %7, ptr %arrayidx3.3, align 1121 %arrayidx.4 = getelementptr inbounds i8, ptr %src, i64 4122 %8 = load i8, ptr %arrayidx.4, align 1123 %9 = and i8 %8, -64124 %arrayidx3.4 = getelementptr inbounds i8, ptr %dst, i64 4125 store i8 %9, ptr %arrayidx3.4, align 1126 %arrayidx.5 = getelementptr inbounds i8, ptr %src, i64 5127 %10 = load i8, ptr %arrayidx.5, align 1128 %11 = and i8 %10, -64129 %arrayidx3.5 = getelementptr inbounds i8, ptr %dst, i64 5130 store i8 %11, ptr %arrayidx3.5, align 1131 %arrayidx.6 = getelementptr inbounds i8, ptr %src, i64 6132 %12 = load i8, ptr %arrayidx.6, align 1133 %13 = and i8 %12, -64134 %arrayidx3.6 = getelementptr inbounds i8, ptr %dst, i64 6135 store i8 %13, ptr %arrayidx3.6, align 1136 %arrayidx.7 = getelementptr inbounds i8, ptr %src, i64 7137 %14 = load i8, ptr %arrayidx.7, align 1138 %15 = and i8 %14, -64139 %arrayidx3.7 = getelementptr inbounds i8, ptr %dst, i64 7140 store i8 %15, ptr %arrayidx3.7, align 1141 %arrayidx.8 = getelementptr inbounds i8, ptr %src, i64 8142 %16 = load i8, ptr %arrayidx.8, align 1143 %17 = and i8 %16, -64144 %arrayidx3.8 = getelementptr inbounds i8, ptr %dst, i64 8145 store i8 %17, ptr %arrayidx3.8, align 1146 %arrayidx.9 = getelementptr inbounds i8, ptr %src, i64 9147 %18 = load i8, ptr %arrayidx.9, align 1148 %19 = and i8 %18, -64149 %arrayidx3.9 = getelementptr inbounds i8, ptr %dst, i64 9150 store i8 %19, ptr %arrayidx3.9, align 1151 %arrayidx.10 = getelementptr inbounds i8, ptr %src, i64 10152 %20 = load i8, ptr %arrayidx.10, align 1153 %21 = and i8 %20, -64154 %arrayidx3.10 = getelementptr inbounds i8, ptr %dst, i64 10155 store i8 %21, ptr %arrayidx3.10, align 1156 %arrayidx.11 = getelementptr inbounds i8, ptr %src, i64 11157 %22 = load i8, ptr %arrayidx.11, align 1158 %23 = and i8 %22, -64159 %arrayidx3.11 = getelementptr inbounds i8, ptr %dst, i64 11160 store i8 %23, ptr %arrayidx3.11, align 1161 %arrayidx.12 = getelementptr inbounds i8, ptr %src, i64 12162 %24 = load i8, ptr %arrayidx.12, align 1163 %25 = and i8 %24, -64164 %arrayidx3.12 = getelementptr inbounds i8, ptr %dst, i64 12165 store i8 %25, ptr %arrayidx3.12, align 1166 %arrayidx.13 = getelementptr inbounds i8, ptr %src, i64 13167 %26 = load i8, ptr %arrayidx.13, align 1168 %27 = and i8 %26, -64169 %arrayidx3.13 = getelementptr inbounds i8, ptr %dst, i64 13170 store i8 %27, ptr %arrayidx3.13, align 1171 %arrayidx.14 = getelementptr inbounds i8, ptr %src, i64 14172 %28 = load i8, ptr %arrayidx.14, align 1173 %29 = and i8 %28, -64174 %arrayidx3.14 = getelementptr inbounds i8, ptr %dst, i64 14175 store i8 %29, ptr %arrayidx3.14, align 1176 %arrayidx.15 = getelementptr inbounds i8, ptr %src, i64 15177 %30 = load i8, ptr %arrayidx.15, align 1178 %31 = and i8 %30, -64179 %arrayidx3.15 = getelementptr inbounds i8, ptr %dst, i64 15180 store i8 %31, ptr %arrayidx3.15, align 1181 ret void182}183 184define void @and32(ptr noalias nocapture noundef writeonly %dst, ptr noalias nocapture noundef readonly %src) {185; SSE-LABEL: @and32(186; SSE-NEXT: entry:187; SSE-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr [[SRC:%.*]], align 1188; SSE-NEXT: [[TMP1:%.*]] = and <16 x i8> [[TMP0]], splat (i8 -64)189; SSE-NEXT: store <16 x i8> [[TMP1]], ptr [[DST:%.*]], align 1190; SSE-NEXT: [[ARRAYIDX_16:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i64 16191; SSE-NEXT: [[ARRAYIDX3_16:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 16192; SSE-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr [[ARRAYIDX_16]], align 1193; SSE-NEXT: [[TMP3:%.*]] = and <16 x i8> [[TMP2]], splat (i8 -64)194; SSE-NEXT: store <16 x i8> [[TMP3]], ptr [[ARRAYIDX3_16]], align 1195; SSE-NEXT: ret void196;197; AVX-LABEL: @and32(198; AVX-NEXT: entry:199; AVX-NEXT: [[TMP0:%.*]] = load <32 x i8>, ptr [[SRC:%.*]], align 1200; AVX-NEXT: [[TMP1:%.*]] = and <32 x i8> [[TMP0]], splat (i8 -64)201; AVX-NEXT: store <32 x i8> [[TMP1]], ptr [[DST:%.*]], align 1202; AVX-NEXT: ret void203;204entry:205 %0 = load i8, ptr %src, align 1206 %1 = and i8 %0, -64207 store i8 %1, ptr %dst, align 1208 %arrayidx.1 = getelementptr inbounds i8, ptr %src, i64 1209 %2 = load i8, ptr %arrayidx.1, align 1210 %3 = and i8 %2, -64211 %arrayidx3.1 = getelementptr inbounds i8, ptr %dst, i64 1212 store i8 %3, ptr %arrayidx3.1, align 1213 %arrayidx.2 = getelementptr inbounds i8, ptr %src, i64 2214 %4 = load i8, ptr %arrayidx.2, align 1215 %5 = and i8 %4, -64216 %arrayidx3.2 = getelementptr inbounds i8, ptr %dst, i64 2217 store i8 %5, ptr %arrayidx3.2, align 1218 %arrayidx.3 = getelementptr inbounds i8, ptr %src, i64 3219 %6 = load i8, ptr %arrayidx.3, align 1220 %7 = and i8 %6, -64221 %arrayidx3.3 = getelementptr inbounds i8, ptr %dst, i64 3222 store i8 %7, ptr %arrayidx3.3, align 1223 %arrayidx.4 = getelementptr inbounds i8, ptr %src, i64 4224 %8 = load i8, ptr %arrayidx.4, align 1225 %9 = and i8 %8, -64226 %arrayidx3.4 = getelementptr inbounds i8, ptr %dst, i64 4227 store i8 %9, ptr %arrayidx3.4, align 1228 %arrayidx.5 = getelementptr inbounds i8, ptr %src, i64 5229 %10 = load i8, ptr %arrayidx.5, align 1230 %11 = and i8 %10, -64231 %arrayidx3.5 = getelementptr inbounds i8, ptr %dst, i64 5232 store i8 %11, ptr %arrayidx3.5, align 1233 %arrayidx.6 = getelementptr inbounds i8, ptr %src, i64 6234 %12 = load i8, ptr %arrayidx.6, align 1235 %13 = and i8 %12, -64236 %arrayidx3.6 = getelementptr inbounds i8, ptr %dst, i64 6237 store i8 %13, ptr %arrayidx3.6, align 1238 %arrayidx.7 = getelementptr inbounds i8, ptr %src, i64 7239 %14 = load i8, ptr %arrayidx.7, align 1240 %15 = and i8 %14, -64241 %arrayidx3.7 = getelementptr inbounds i8, ptr %dst, i64 7242 store i8 %15, ptr %arrayidx3.7, align 1243 %arrayidx.8 = getelementptr inbounds i8, ptr %src, i64 8244 %16 = load i8, ptr %arrayidx.8, align 1245 %17 = and i8 %16, -64246 %arrayidx3.8 = getelementptr inbounds i8, ptr %dst, i64 8247 store i8 %17, ptr %arrayidx3.8, align 1248 %arrayidx.9 = getelementptr inbounds i8, ptr %src, i64 9249 %18 = load i8, ptr %arrayidx.9, align 1250 %19 = and i8 %18, -64251 %arrayidx3.9 = getelementptr inbounds i8, ptr %dst, i64 9252 store i8 %19, ptr %arrayidx3.9, align 1253 %arrayidx.10 = getelementptr inbounds i8, ptr %src, i64 10254 %20 = load i8, ptr %arrayidx.10, align 1255 %21 = and i8 %20, -64256 %arrayidx3.10 = getelementptr inbounds i8, ptr %dst, i64 10257 store i8 %21, ptr %arrayidx3.10, align 1258 %arrayidx.11 = getelementptr inbounds i8, ptr %src, i64 11259 %22 = load i8, ptr %arrayidx.11, align 1260 %23 = and i8 %22, -64261 %arrayidx3.11 = getelementptr inbounds i8, ptr %dst, i64 11262 store i8 %23, ptr %arrayidx3.11, align 1263 %arrayidx.12 = getelementptr inbounds i8, ptr %src, i64 12264 %24 = load i8, ptr %arrayidx.12, align 1265 %25 = and i8 %24, -64266 %arrayidx3.12 = getelementptr inbounds i8, ptr %dst, i64 12267 store i8 %25, ptr %arrayidx3.12, align 1268 %arrayidx.13 = getelementptr inbounds i8, ptr %src, i64 13269 %26 = load i8, ptr %arrayidx.13, align 1270 %27 = and i8 %26, -64271 %arrayidx3.13 = getelementptr inbounds i8, ptr %dst, i64 13272 store i8 %27, ptr %arrayidx3.13, align 1273 %arrayidx.14 = getelementptr inbounds i8, ptr %src, i64 14274 %28 = load i8, ptr %arrayidx.14, align 1275 %29 = and i8 %28, -64276 %arrayidx3.14 = getelementptr inbounds i8, ptr %dst, i64 14277 store i8 %29, ptr %arrayidx3.14, align 1278 %arrayidx.15 = getelementptr inbounds i8, ptr %src, i64 15279 %30 = load i8, ptr %arrayidx.15, align 1280 %31 = and i8 %30, -64281 %arrayidx3.15 = getelementptr inbounds i8, ptr %dst, i64 15282 store i8 %31, ptr %arrayidx3.15, align 1283 %arrayidx.16 = getelementptr inbounds i8, ptr %src, i64 16284 %32 = load i8, ptr %arrayidx.16, align 1285 %33 = and i8 %32, -64286 %arrayidx3.16 = getelementptr inbounds i8, ptr %dst, i64 16287 store i8 %33, ptr %arrayidx3.16, align 1288 %arrayidx.17 = getelementptr inbounds i8, ptr %src, i64 17289 %34 = load i8, ptr %arrayidx.17, align 1290 %35 = and i8 %34, -64291 %arrayidx3.17 = getelementptr inbounds i8, ptr %dst, i64 17292 store i8 %35, ptr %arrayidx3.17, align 1293 %arrayidx.18 = getelementptr inbounds i8, ptr %src, i64 18294 %36 = load i8, ptr %arrayidx.18, align 1295 %37 = and i8 %36, -64296 %arrayidx3.18 = getelementptr inbounds i8, ptr %dst, i64 18297 store i8 %37, ptr %arrayidx3.18, align 1298 %arrayidx.19 = getelementptr inbounds i8, ptr %src, i64 19299 %38 = load i8, ptr %arrayidx.19, align 1300 %39 = and i8 %38, -64301 %arrayidx3.19 = getelementptr inbounds i8, ptr %dst, i64 19302 store i8 %39, ptr %arrayidx3.19, align 1303 %arrayidx.20 = getelementptr inbounds i8, ptr %src, i64 20304 %40 = load i8, ptr %arrayidx.20, align 1305 %41 = and i8 %40, -64306 %arrayidx3.20 = getelementptr inbounds i8, ptr %dst, i64 20307 store i8 %41, ptr %arrayidx3.20, align 1308 %arrayidx.21 = getelementptr inbounds i8, ptr %src, i64 21309 %42 = load i8, ptr %arrayidx.21, align 1310 %43 = and i8 %42, -64311 %arrayidx3.21 = getelementptr inbounds i8, ptr %dst, i64 21312 store i8 %43, ptr %arrayidx3.21, align 1313 %arrayidx.22 = getelementptr inbounds i8, ptr %src, i64 22314 %44 = load i8, ptr %arrayidx.22, align 1315 %45 = and i8 %44, -64316 %arrayidx3.22 = getelementptr inbounds i8, ptr %dst, i64 22317 store i8 %45, ptr %arrayidx3.22, align 1318 %arrayidx.23 = getelementptr inbounds i8, ptr %src, i64 23319 %46 = load i8, ptr %arrayidx.23, align 1320 %47 = and i8 %46, -64321 %arrayidx3.23 = getelementptr inbounds i8, ptr %dst, i64 23322 store i8 %47, ptr %arrayidx3.23, align 1323 %arrayidx.24 = getelementptr inbounds i8, ptr %src, i64 24324 %48 = load i8, ptr %arrayidx.24, align 1325 %49 = and i8 %48, -64326 %arrayidx3.24 = getelementptr inbounds i8, ptr %dst, i64 24327 store i8 %49, ptr %arrayidx3.24, align 1328 %arrayidx.25 = getelementptr inbounds i8, ptr %src, i64 25329 %50 = load i8, ptr %arrayidx.25, align 1330 %51 = and i8 %50, -64331 %arrayidx3.25 = getelementptr inbounds i8, ptr %dst, i64 25332 store i8 %51, ptr %arrayidx3.25, align 1333 %arrayidx.26 = getelementptr inbounds i8, ptr %src, i64 26334 %52 = load i8, ptr %arrayidx.26, align 1335 %53 = and i8 %52, -64336 %arrayidx3.26 = getelementptr inbounds i8, ptr %dst, i64 26337 store i8 %53, ptr %arrayidx3.26, align 1338 %arrayidx.27 = getelementptr inbounds i8, ptr %src, i64 27339 %54 = load i8, ptr %arrayidx.27, align 1340 %55 = and i8 %54, -64341 %arrayidx3.27 = getelementptr inbounds i8, ptr %dst, i64 27342 store i8 %55, ptr %arrayidx3.27, align 1343 %arrayidx.28 = getelementptr inbounds i8, ptr %src, i64 28344 %56 = load i8, ptr %arrayidx.28, align 1345 %57 = and i8 %56, -64346 %arrayidx3.28 = getelementptr inbounds i8, ptr %dst, i64 28347 store i8 %57, ptr %arrayidx3.28, align 1348 %arrayidx.29 = getelementptr inbounds i8, ptr %src, i64 29349 %58 = load i8, ptr %arrayidx.29, align 1350 %59 = and i8 %58, -64351 %arrayidx3.29 = getelementptr inbounds i8, ptr %dst, i64 29352 store i8 %59, ptr %arrayidx3.29, align 1353 %arrayidx.30 = getelementptr inbounds i8, ptr %src, i64 30354 %60 = load i8, ptr %arrayidx.30, align 1355 %61 = and i8 %60, -64356 %arrayidx3.30 = getelementptr inbounds i8, ptr %dst, i64 30357 store i8 %61, ptr %arrayidx3.30, align 1358 %arrayidx.31 = getelementptr inbounds i8, ptr %src, i64 31359 %62 = load i8, ptr %arrayidx.31, align 1360 %63 = and i8 %62, -64361 %arrayidx3.31 = getelementptr inbounds i8, ptr %dst, i64 31362 store i8 %63, ptr %arrayidx3.31, align 1363 ret void364}365