436 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -mtriple=x86_64-unknown -passes=slp-vectorizer -S | FileCheck %s --check-prefix=CHECK --check-prefix=SSE3; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=corei7-avx -passes=slp-vectorizer -S | FileCheck %s --check-prefix=CHECK --check-prefix=AVX4; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=core-avx2 -passes=slp-vectorizer -S | FileCheck %s --check-prefix=CHECK --check-prefix=AVX5; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=bdver2 -passes=slp-vectorizer -S | FileCheck %s --check-prefix=CHECK --check-prefix=XOP6; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=bdver4 -passes=slp-vectorizer -S | FileCheck %s --check-prefix=CHECK --check-prefix=XOP7 8target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"9 10@src64 = common global [4 x i64] zeroinitializer, align 3211@dst64 = common global [4 x i64] zeroinitializer, align 3212@src32 = common global [8 x i32] zeroinitializer, align 3213@dst32 = common global [8 x i32] zeroinitializer, align 3214@src16 = common global [16 x i16] zeroinitializer, align 3215@dst16 = common global [16 x i16] zeroinitializer, align 3216@src8 = common global [32 x i8] zeroinitializer, align 3217@dst8 = common global [32 x i8] zeroinitializer, align 3218 19declare i64 @llvm.bitreverse.i64(i64)20declare i32 @llvm.bitreverse.i32(i32)21declare i16 @llvm.bitreverse.i16(i16)22declare i8 @llvm.bitreverse.i8(i8)23 24define void @bitreverse_2i64() #0 {25; CHECK-LABEL: @bitreverse_2i64(26; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr @src64, align 827; CHECK-NEXT: [[TMP2:%.*]] = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> [[TMP1]])28; CHECK-NEXT: store <2 x i64> [[TMP2]], ptr @dst64, align 829; CHECK-NEXT: ret void30;31 %ld0 = load i64, ptr @src64, align 832 %ld1 = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i32 0, i64 1), align 833 %bitreverse0 = call i64 @llvm.bitreverse.i64(i64 %ld0)34 %bitreverse1 = call i64 @llvm.bitreverse.i64(i64 %ld1)35 store i64 %bitreverse0, ptr @dst64, align 836 store i64 %bitreverse1, ptr getelementptr inbounds ([4 x i64], ptr @dst64, i32 0, i64 1), align 837 ret void38}39 40define void @bitreverse_4i64() #0 {41; SSE-LABEL: @bitreverse_4i64(42; SSE-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr @src64, align 443; SSE-NEXT: [[TMP2:%.*]] = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> [[TMP1]])44; SSE-NEXT: store <2 x i64> [[TMP2]], ptr @dst64, align 445; SSE-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 2), align 446; SSE-NEXT: [[TMP4:%.*]] = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> [[TMP3]])47; SSE-NEXT: store <2 x i64> [[TMP4]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 2), align 448; SSE-NEXT: ret void49;50; AVX-LABEL: @bitreverse_4i64(51; AVX-NEXT: [[TMP1:%.*]] = load <4 x i64>, ptr @src64, align 452; AVX-NEXT: [[TMP2:%.*]] = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> [[TMP1]])53; AVX-NEXT: store <4 x i64> [[TMP2]], ptr @dst64, align 454; AVX-NEXT: ret void55;56; XOP-LABEL: @bitreverse_4i64(57; XOP-NEXT: [[TMP1:%.*]] = load <4 x i64>, ptr @src64, align 458; XOP-NEXT: [[TMP2:%.*]] = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> [[TMP1]])59; XOP-NEXT: store <4 x i64> [[TMP2]], ptr @dst64, align 460; XOP-NEXT: ret void61;62 %ld0 = load i64, ptr @src64, align 463 %ld1 = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 1), align 464 %ld2 = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 2), align 465 %ld3 = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 3), align 466 %bitreverse0 = call i64 @llvm.bitreverse.i64(i64 %ld0)67 %bitreverse1 = call i64 @llvm.bitreverse.i64(i64 %ld1)68 %bitreverse2 = call i64 @llvm.bitreverse.i64(i64 %ld2)69 %bitreverse3 = call i64 @llvm.bitreverse.i64(i64 %ld3)70 store i64 %bitreverse0, ptr @dst64, align 471 store i64 %bitreverse1, ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 1), align 472 store i64 %bitreverse2, ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 2), align 473 store i64 %bitreverse3, ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 3), align 474 ret void75}76 77define void @bitreverse_4i32() #0 {78; CHECK-LABEL: @bitreverse_4i32(79; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr @src32, align 480; CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> [[TMP1]])81; CHECK-NEXT: store <4 x i32> [[TMP2]], ptr @dst32, align 482; CHECK-NEXT: ret void83;84 %ld0 = load i32, ptr @src32, align 485 %ld1 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 1), align 486 %ld2 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 2), align 487 %ld3 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 3), align 488 %bitreverse0 = call i32 @llvm.bitreverse.i32(i32 %ld0)89 %bitreverse1 = call i32 @llvm.bitreverse.i32(i32 %ld1)90 %bitreverse2 = call i32 @llvm.bitreverse.i32(i32 %ld2)91 %bitreverse3 = call i32 @llvm.bitreverse.i32(i32 %ld3)92 store i32 %bitreverse0, ptr @dst32, align 493 store i32 %bitreverse1, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 1), align 494 store i32 %bitreverse2, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 2), align 495 store i32 %bitreverse3, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 3), align 496 ret void97}98 99define void @bitreverse_8i32() #0 {100; SSE-LABEL: @bitreverse_8i32(101; SSE-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr @src32, align 2102; SSE-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> [[TMP1]])103; SSE-NEXT: store <4 x i32> [[TMP2]], ptr @dst32, align 2104; SSE-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 4), align 2105; SSE-NEXT: [[TMP4:%.*]] = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> [[TMP3]])106; SSE-NEXT: store <4 x i32> [[TMP4]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 4), align 2107; SSE-NEXT: ret void108;109; AVX-LABEL: @bitreverse_8i32(110; AVX-NEXT: [[TMP1:%.*]] = load <8 x i32>, ptr @src32, align 2111; AVX-NEXT: [[TMP2:%.*]] = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> [[TMP1]])112; AVX-NEXT: store <8 x i32> [[TMP2]], ptr @dst32, align 2113; AVX-NEXT: ret void114;115; XOP-LABEL: @bitreverse_8i32(116; XOP-NEXT: [[TMP1:%.*]] = load <8 x i32>, ptr @src32, align 2117; XOP-NEXT: [[TMP2:%.*]] = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> [[TMP1]])118; XOP-NEXT: store <8 x i32> [[TMP2]], ptr @dst32, align 2119; XOP-NEXT: ret void120;121 %ld0 = load i32, ptr @src32, align 2122 %ld1 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 1), align 2123 %ld2 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 2), align 2124 %ld3 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 3), align 2125 %ld4 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 4), align 2126 %ld5 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 5), align 2127 %ld6 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 6), align 2128 %ld7 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 7), align 2129 %bitreverse0 = call i32 @llvm.bitreverse.i32(i32 %ld0)130 %bitreverse1 = call i32 @llvm.bitreverse.i32(i32 %ld1)131 %bitreverse2 = call i32 @llvm.bitreverse.i32(i32 %ld2)132 %bitreverse3 = call i32 @llvm.bitreverse.i32(i32 %ld3)133 %bitreverse4 = call i32 @llvm.bitreverse.i32(i32 %ld4)134 %bitreverse5 = call i32 @llvm.bitreverse.i32(i32 %ld5)135 %bitreverse6 = call i32 @llvm.bitreverse.i32(i32 %ld6)136 %bitreverse7 = call i32 @llvm.bitreverse.i32(i32 %ld7)137 store i32 %bitreverse0, ptr @dst32, align 2138 store i32 %bitreverse1, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 1), align 2139 store i32 %bitreverse2, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 2), align 2140 store i32 %bitreverse3, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 3), align 2141 store i32 %bitreverse4, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 4), align 2142 store i32 %bitreverse5, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 5), align 2143 store i32 %bitreverse6, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 6), align 2144 store i32 %bitreverse7, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 7), align 2145 ret void146}147 148define void @bitreverse_8i16() #0 {149; CHECK-LABEL: @bitreverse_8i16(150; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i16>, ptr @src16, align 2151; CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> [[TMP1]])152; CHECK-NEXT: store <8 x i16> [[TMP2]], ptr @dst16, align 2153; CHECK-NEXT: ret void154;155 %ld0 = load i16, ptr @src16, align 2156 %ld1 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 1), align 2157 %ld2 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 2), align 2158 %ld3 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 3), align 2159 %ld4 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 4), align 2160 %ld5 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 5), align 2161 %ld6 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 6), align 2162 %ld7 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 7), align 2163 %bitreverse0 = call i16 @llvm.bitreverse.i16(i16 %ld0)164 %bitreverse1 = call i16 @llvm.bitreverse.i16(i16 %ld1)165 %bitreverse2 = call i16 @llvm.bitreverse.i16(i16 %ld2)166 %bitreverse3 = call i16 @llvm.bitreverse.i16(i16 %ld3)167 %bitreverse4 = call i16 @llvm.bitreverse.i16(i16 %ld4)168 %bitreverse5 = call i16 @llvm.bitreverse.i16(i16 %ld5)169 %bitreverse6 = call i16 @llvm.bitreverse.i16(i16 %ld6)170 %bitreverse7 = call i16 @llvm.bitreverse.i16(i16 %ld7)171 store i16 %bitreverse0, ptr @dst16, align 2172 store i16 %bitreverse1, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 1), align 2173 store i16 %bitreverse2, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 2), align 2174 store i16 %bitreverse3, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 3), align 2175 store i16 %bitreverse4, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 4), align 2176 store i16 %bitreverse5, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 5), align 2177 store i16 %bitreverse6, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 6), align 2178 store i16 %bitreverse7, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 7), align 2179 ret void180}181 182define void @bitreverse_16i16() #0 {183; SSE-LABEL: @bitreverse_16i16(184; SSE-NEXT: [[TMP1:%.*]] = load <8 x i16>, ptr @src16, align 2185; SSE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> [[TMP1]])186; SSE-NEXT: store <8 x i16> [[TMP2]], ptr @dst16, align 2187; SSE-NEXT: [[TMP3:%.*]] = load <8 x i16>, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 8), align 2188; SSE-NEXT: [[TMP4:%.*]] = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> [[TMP3]])189; SSE-NEXT: store <8 x i16> [[TMP4]], ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 8), align 2190; SSE-NEXT: ret void191;192; AVX-LABEL: @bitreverse_16i16(193; AVX-NEXT: [[TMP1:%.*]] = load <16 x i16>, ptr @src16, align 2194; AVX-NEXT: [[TMP2:%.*]] = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> [[TMP1]])195; AVX-NEXT: store <16 x i16> [[TMP2]], ptr @dst16, align 2196; AVX-NEXT: ret void197;198; XOP-LABEL: @bitreverse_16i16(199; XOP-NEXT: [[TMP1:%.*]] = load <16 x i16>, ptr @src16, align 2200; XOP-NEXT: [[TMP2:%.*]] = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> [[TMP1]])201; XOP-NEXT: store <16 x i16> [[TMP2]], ptr @dst16, align 2202; XOP-NEXT: ret void203;204 %ld0 = load i16, ptr @src16, align 2205 %ld1 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 1), align 2206 %ld2 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 2), align 2207 %ld3 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 3), align 2208 %ld4 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 4), align 2209 %ld5 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 5), align 2210 %ld6 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 6), align 2211 %ld7 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 7), align 2212 %ld8 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 8), align 2213 %ld9 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 9), align 2214 %ld10 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 10), align 2215 %ld11 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 11), align 2216 %ld12 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 12), align 2217 %ld13 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 13), align 2218 %ld14 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 14), align 2219 %ld15 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 15), align 2220 %bitreverse0 = call i16 @llvm.bitreverse.i16(i16 %ld0)221 %bitreverse1 = call i16 @llvm.bitreverse.i16(i16 %ld1)222 %bitreverse2 = call i16 @llvm.bitreverse.i16(i16 %ld2)223 %bitreverse3 = call i16 @llvm.bitreverse.i16(i16 %ld3)224 %bitreverse4 = call i16 @llvm.bitreverse.i16(i16 %ld4)225 %bitreverse5 = call i16 @llvm.bitreverse.i16(i16 %ld5)226 %bitreverse6 = call i16 @llvm.bitreverse.i16(i16 %ld6)227 %bitreverse7 = call i16 @llvm.bitreverse.i16(i16 %ld7)228 %bitreverse8 = call i16 @llvm.bitreverse.i16(i16 %ld8)229 %bitreverse9 = call i16 @llvm.bitreverse.i16(i16 %ld9)230 %bitreverse10 = call i16 @llvm.bitreverse.i16(i16 %ld10)231 %bitreverse11 = call i16 @llvm.bitreverse.i16(i16 %ld11)232 %bitreverse12 = call i16 @llvm.bitreverse.i16(i16 %ld12)233 %bitreverse13 = call i16 @llvm.bitreverse.i16(i16 %ld13)234 %bitreverse14 = call i16 @llvm.bitreverse.i16(i16 %ld14)235 %bitreverse15 = call i16 @llvm.bitreverse.i16(i16 %ld15)236 store i16 %bitreverse0 , ptr @dst16, align 2237 store i16 %bitreverse1 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 1), align 2238 store i16 %bitreverse2 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 2), align 2239 store i16 %bitreverse3 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 3), align 2240 store i16 %bitreverse4 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 4), align 2241 store i16 %bitreverse5 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 5), align 2242 store i16 %bitreverse6 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 6), align 2243 store i16 %bitreverse7 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 7), align 2244 store i16 %bitreverse8 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 8), align 2245 store i16 %bitreverse9 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 9), align 2246 store i16 %bitreverse10, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 10), align 2247 store i16 %bitreverse11, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 11), align 2248 store i16 %bitreverse12, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 12), align 2249 store i16 %bitreverse13, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 13), align 2250 store i16 %bitreverse14, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 14), align 2251 store i16 %bitreverse15, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 15), align 2252 ret void253}254 255define void @bitreverse_16i8() #0 {256; CHECK-LABEL: @bitreverse_16i8(257; CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @src8, align 1258; CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> [[TMP1]])259; CHECK-NEXT: store <16 x i8> [[TMP2]], ptr @dst8, align 1260; CHECK-NEXT: ret void261;262 %ld0 = load i8, ptr @src8, align 1263 %ld1 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 1), align 1264 %ld2 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 2), align 1265 %ld3 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 3), align 1266 %ld4 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 4), align 1267 %ld5 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 5), align 1268 %ld6 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 6), align 1269 %ld7 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 7), align 1270 %ld8 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 8), align 1271 %ld9 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 9), align 1272 %ld10 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 10), align 1273 %ld11 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 11), align 1274 %ld12 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 12), align 1275 %ld13 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 13), align 1276 %ld14 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 14), align 1277 %ld15 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 15), align 1278 %bitreverse0 = call i8 @llvm.bitreverse.i8(i8 %ld0)279 %bitreverse1 = call i8 @llvm.bitreverse.i8(i8 %ld1)280 %bitreverse2 = call i8 @llvm.bitreverse.i8(i8 %ld2)281 %bitreverse3 = call i8 @llvm.bitreverse.i8(i8 %ld3)282 %bitreverse4 = call i8 @llvm.bitreverse.i8(i8 %ld4)283 %bitreverse5 = call i8 @llvm.bitreverse.i8(i8 %ld5)284 %bitreverse6 = call i8 @llvm.bitreverse.i8(i8 %ld6)285 %bitreverse7 = call i8 @llvm.bitreverse.i8(i8 %ld7)286 %bitreverse8 = call i8 @llvm.bitreverse.i8(i8 %ld8)287 %bitreverse9 = call i8 @llvm.bitreverse.i8(i8 %ld9)288 %bitreverse10 = call i8 @llvm.bitreverse.i8(i8 %ld10)289 %bitreverse11 = call i8 @llvm.bitreverse.i8(i8 %ld11)290 %bitreverse12 = call i8 @llvm.bitreverse.i8(i8 %ld12)291 %bitreverse13 = call i8 @llvm.bitreverse.i8(i8 %ld13)292 %bitreverse14 = call i8 @llvm.bitreverse.i8(i8 %ld14)293 %bitreverse15 = call i8 @llvm.bitreverse.i8(i8 %ld15)294 store i8 %bitreverse0 , ptr @dst8, align 1295 store i8 %bitreverse1 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 1), align 1296 store i8 %bitreverse2 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 2), align 1297 store i8 %bitreverse3 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 3), align 1298 store i8 %bitreverse4 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 4), align 1299 store i8 %bitreverse5 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 5), align 1300 store i8 %bitreverse6 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 6), align 1301 store i8 %bitreverse7 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 7), align 1302 store i8 %bitreverse8 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 8), align 1303 store i8 %bitreverse9 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 9), align 1304 store i8 %bitreverse10, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 10), align 1305 store i8 %bitreverse11, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 11), align 1306 store i8 %bitreverse12, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 12), align 1307 store i8 %bitreverse13, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 13), align 1308 store i8 %bitreverse14, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 14), align 1309 store i8 %bitreverse15, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 15), align 1310 ret void311}312 313define void @bitreverse_32i8() #0 {314; SSE-LABEL: @bitreverse_32i8(315; SSE-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @src8, align 1316; SSE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> [[TMP1]])317; SSE-NEXT: store <16 x i8> [[TMP2]], ptr @dst8, align 1318; SSE-NEXT: [[TMP3:%.*]] = load <16 x i8>, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 16), align 1319; SSE-NEXT: [[TMP4:%.*]] = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> [[TMP3]])320; SSE-NEXT: store <16 x i8> [[TMP4]], ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 16), align 1321; SSE-NEXT: ret void322;323; AVX-LABEL: @bitreverse_32i8(324; AVX-NEXT: [[TMP1:%.*]] = load <32 x i8>, ptr @src8, align 1325; AVX-NEXT: [[TMP2:%.*]] = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> [[TMP1]])326; AVX-NEXT: store <32 x i8> [[TMP2]], ptr @dst8, align 1327; AVX-NEXT: ret void328;329; XOP-LABEL: @bitreverse_32i8(330; XOP-NEXT: [[TMP1:%.*]] = load <32 x i8>, ptr @src8, align 1331; XOP-NEXT: [[TMP2:%.*]] = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> [[TMP1]])332; XOP-NEXT: store <32 x i8> [[TMP2]], ptr @dst8, align 1333; XOP-NEXT: ret void334;335 %ld0 = load i8, ptr @src8, align 1336 %ld1 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 1), align 1337 %ld2 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 2), align 1338 %ld3 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 3), align 1339 %ld4 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 4), align 1340 %ld5 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 5), align 1341 %ld6 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 6), align 1342 %ld7 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 7), align 1343 %ld8 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 8), align 1344 %ld9 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 9), align 1345 %ld10 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 10), align 1346 %ld11 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 11), align 1347 %ld12 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 12), align 1348 %ld13 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 13), align 1349 %ld14 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 14), align 1350 %ld15 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 15), align 1351 %ld16 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 16), align 1352 %ld17 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 17), align 1353 %ld18 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 18), align 1354 %ld19 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 19), align 1355 %ld20 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 20), align 1356 %ld21 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 21), align 1357 %ld22 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 22), align 1358 %ld23 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 23), align 1359 %ld24 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 24), align 1360 %ld25 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 25), align 1361 %ld26 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 26), align 1362 %ld27 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 27), align 1363 %ld28 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 28), align 1364 %ld29 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 29), align 1365 %ld30 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 30), align 1366 %ld31 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 31), align 1367 %bitreverse0 = call i8 @llvm.bitreverse.i8(i8 %ld0)368 %bitreverse1 = call i8 @llvm.bitreverse.i8(i8 %ld1)369 %bitreverse2 = call i8 @llvm.bitreverse.i8(i8 %ld2)370 %bitreverse3 = call i8 @llvm.bitreverse.i8(i8 %ld3)371 %bitreverse4 = call i8 @llvm.bitreverse.i8(i8 %ld4)372 %bitreverse5 = call i8 @llvm.bitreverse.i8(i8 %ld5)373 %bitreverse6 = call i8 @llvm.bitreverse.i8(i8 %ld6)374 %bitreverse7 = call i8 @llvm.bitreverse.i8(i8 %ld7)375 %bitreverse8 = call i8 @llvm.bitreverse.i8(i8 %ld8)376 %bitreverse9 = call i8 @llvm.bitreverse.i8(i8 %ld9)377 %bitreverse10 = call i8 @llvm.bitreverse.i8(i8 %ld10)378 %bitreverse11 = call i8 @llvm.bitreverse.i8(i8 %ld11)379 %bitreverse12 = call i8 @llvm.bitreverse.i8(i8 %ld12)380 %bitreverse13 = call i8 @llvm.bitreverse.i8(i8 %ld13)381 %bitreverse14 = call i8 @llvm.bitreverse.i8(i8 %ld14)382 %bitreverse15 = call i8 @llvm.bitreverse.i8(i8 %ld15)383 %bitreverse16 = call i8 @llvm.bitreverse.i8(i8 %ld16)384 %bitreverse17 = call i8 @llvm.bitreverse.i8(i8 %ld17)385 %bitreverse18 = call i8 @llvm.bitreverse.i8(i8 %ld18)386 %bitreverse19 = call i8 @llvm.bitreverse.i8(i8 %ld19)387 %bitreverse20 = call i8 @llvm.bitreverse.i8(i8 %ld20)388 %bitreverse21 = call i8 @llvm.bitreverse.i8(i8 %ld21)389 %bitreverse22 = call i8 @llvm.bitreverse.i8(i8 %ld22)390 %bitreverse23 = call i8 @llvm.bitreverse.i8(i8 %ld23)391 %bitreverse24 = call i8 @llvm.bitreverse.i8(i8 %ld24)392 %bitreverse25 = call i8 @llvm.bitreverse.i8(i8 %ld25)393 %bitreverse26 = call i8 @llvm.bitreverse.i8(i8 %ld26)394 %bitreverse27 = call i8 @llvm.bitreverse.i8(i8 %ld27)395 %bitreverse28 = call i8 @llvm.bitreverse.i8(i8 %ld28)396 %bitreverse29 = call i8 @llvm.bitreverse.i8(i8 %ld29)397 %bitreverse30 = call i8 @llvm.bitreverse.i8(i8 %ld30)398 %bitreverse31 = call i8 @llvm.bitreverse.i8(i8 %ld31)399 store i8 %bitreverse0 , ptr @dst8, align 1400 store i8 %bitreverse1 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 1), align 1401 store i8 %bitreverse2 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 2), align 1402 store i8 %bitreverse3 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 3), align 1403 store i8 %bitreverse4 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 4), align 1404 store i8 %bitreverse5 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 5), align 1405 store i8 %bitreverse6 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 6), align 1406 store i8 %bitreverse7 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 7), align 1407 store i8 %bitreverse8 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 8), align 1408 store i8 %bitreverse9 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 9), align 1409 store i8 %bitreverse10, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 10), align 1410 store i8 %bitreverse11, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 11), align 1411 store i8 %bitreverse12, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 12), align 1412 store i8 %bitreverse13, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 13), align 1413 store i8 %bitreverse14, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 14), align 1414 store i8 %bitreverse15, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 15), align 1415 store i8 %bitreverse16, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 16), align 1416 store i8 %bitreverse17, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 17), align 1417 store i8 %bitreverse18, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 18), align 1418 store i8 %bitreverse19, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 19), align 1419 store i8 %bitreverse20, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 20), align 1420 store i8 %bitreverse21, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 21), align 1421 store i8 %bitreverse22, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 22), align 1422 store i8 %bitreverse23, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 23), align 1423 store i8 %bitreverse24, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 24), align 1424 store i8 %bitreverse25, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 25), align 1425 store i8 %bitreverse26, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 26), align 1426 store i8 %bitreverse27, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 27), align 1427 store i8 %bitreverse28, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 28), align 1428 store i8 %bitreverse29, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 29), align 1429 store i8 %bitreverse30, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 30), align 1430 store i8 %bitreverse31, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 31), align 1431 ret void432}433 434attributes #0 = { nounwind }435 436