1108 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-prefixes=CHECK,SSE3; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=corei7 -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,SSE4; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=corei7-avx -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,AVX,AVX15; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=core-avx2 -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,AVX,AVX26; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=icelake-server -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,AVX,AVX5127 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.ctlz.i64(i64, i1)20declare i32 @llvm.ctlz.i32(i32, i1)21declare i16 @llvm.ctlz.i16(i16, i1)22declare i8 @llvm.ctlz.i8(i8, i1)23 24;25; CTLZ26;27 28define void @ctlz_2i64() #0 {29; SSE-LABEL: @ctlz_2i64(30; SSE-NEXT: [[LD0:%.*]] = load i64, ptr @src64, align 831; SSE-NEXT: [[LD1:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i32 0, i64 1), align 832; SSE-NEXT: [[CTLZ0:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD0]], i1 false)33; SSE-NEXT: [[CTLZ1:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD1]], i1 false)34; SSE-NEXT: store i64 [[CTLZ0]], ptr @dst64, align 835; SSE-NEXT: store i64 [[CTLZ1]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i32 0, i64 1), align 836; SSE-NEXT: ret void37;38; AVX1-LABEL: @ctlz_2i64(39; AVX1-NEXT: [[LD0:%.*]] = load i64, ptr @src64, align 840; AVX1-NEXT: [[LD1:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i32 0, i64 1), align 841; AVX1-NEXT: [[CTLZ0:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD0]], i1 false)42; AVX1-NEXT: [[CTLZ1:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD1]], i1 false)43; AVX1-NEXT: store i64 [[CTLZ0]], ptr @dst64, align 844; AVX1-NEXT: store i64 [[CTLZ1]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i32 0, i64 1), align 845; AVX1-NEXT: ret void46;47; AVX2-LABEL: @ctlz_2i64(48; AVX2-NEXT: [[LD0:%.*]] = load i64, ptr @src64, align 849; AVX2-NEXT: [[LD1:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i32 0, i64 1), align 850; AVX2-NEXT: [[CTLZ0:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD0]], i1 false)51; AVX2-NEXT: [[CTLZ1:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD1]], i1 false)52; AVX2-NEXT: store i64 [[CTLZ0]], ptr @dst64, align 853; AVX2-NEXT: store i64 [[CTLZ1]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i32 0, i64 1), align 854; AVX2-NEXT: ret void55;56; AVX512-LABEL: @ctlz_2i64(57; AVX512-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr @src64, align 858; AVX512-NEXT: [[TMP2:%.*]] = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> [[TMP1]], i1 false)59; AVX512-NEXT: store <2 x i64> [[TMP2]], ptr @dst64, align 860; AVX512-NEXT: ret void61;62 %ld0 = load i64, ptr @src64, align 863 %ld1 = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i32 0, i64 1), align 864 %ctlz0 = call i64 @llvm.ctlz.i64(i64 %ld0, i1 0)65 %ctlz1 = call i64 @llvm.ctlz.i64(i64 %ld1, i1 0)66 store i64 %ctlz0, ptr @dst64, align 867 store i64 %ctlz1, ptr getelementptr inbounds ([4 x i64], ptr @dst64, i32 0, i64 1), align 868 ret void69}70 71define void @ctlz_4i64() #0 {72; SSE-LABEL: @ctlz_4i64(73; SSE-NEXT: [[LD0:%.*]] = load i64, ptr @src64, align 474; SSE-NEXT: [[LD1:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 1), align 475; SSE-NEXT: [[LD2:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 2), align 476; SSE-NEXT: [[LD3:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 3), align 477; SSE-NEXT: [[CTLZ0:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD0]], i1 false)78; SSE-NEXT: [[CTLZ1:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD1]], i1 false)79; SSE-NEXT: [[CTLZ2:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD2]], i1 false)80; SSE-NEXT: [[CTLZ3:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD3]], i1 false)81; SSE-NEXT: store i64 [[CTLZ0]], ptr @dst64, align 482; SSE-NEXT: store i64 [[CTLZ1]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 1), align 483; SSE-NEXT: store i64 [[CTLZ2]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 2), align 484; SSE-NEXT: store i64 [[CTLZ3]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 3), align 485; SSE-NEXT: ret void86;87; AVX1-LABEL: @ctlz_4i64(88; AVX1-NEXT: [[LD0:%.*]] = load i64, ptr @src64, align 489; AVX1-NEXT: [[LD1:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 1), align 490; AVX1-NEXT: [[LD2:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 2), align 491; AVX1-NEXT: [[LD3:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 3), align 492; AVX1-NEXT: [[CTLZ0:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD0]], i1 false)93; AVX1-NEXT: [[CTLZ1:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD1]], i1 false)94; AVX1-NEXT: [[CTLZ2:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD2]], i1 false)95; AVX1-NEXT: [[CTLZ3:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD3]], i1 false)96; AVX1-NEXT: store i64 [[CTLZ0]], ptr @dst64, align 497; AVX1-NEXT: store i64 [[CTLZ1]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 1), align 498; AVX1-NEXT: store i64 [[CTLZ2]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 2), align 499; AVX1-NEXT: store i64 [[CTLZ3]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 3), align 4100; AVX1-NEXT: ret void101;102; AVX2-LABEL: @ctlz_4i64(103; AVX2-NEXT: [[LD0:%.*]] = load i64, ptr @src64, align 4104; AVX2-NEXT: [[LD1:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 1), align 4105; AVX2-NEXT: [[LD2:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 2), align 4106; AVX2-NEXT: [[LD3:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 3), align 4107; AVX2-NEXT: [[CTLZ0:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD0]], i1 false)108; AVX2-NEXT: [[CTLZ1:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD1]], i1 false)109; AVX2-NEXT: [[CTLZ2:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD2]], i1 false)110; AVX2-NEXT: [[CTLZ3:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD3]], i1 false)111; AVX2-NEXT: store i64 [[CTLZ0]], ptr @dst64, align 4112; AVX2-NEXT: store i64 [[CTLZ1]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 1), align 4113; AVX2-NEXT: store i64 [[CTLZ2]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 2), align 4114; AVX2-NEXT: store i64 [[CTLZ3]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 3), align 4115; AVX2-NEXT: ret void116;117; AVX512-LABEL: @ctlz_4i64(118; AVX512-NEXT: [[TMP1:%.*]] = load <4 x i64>, ptr @src64, align 4119; AVX512-NEXT: [[TMP2:%.*]] = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> [[TMP1]], i1 false)120; AVX512-NEXT: store <4 x i64> [[TMP2]], ptr @dst64, align 4121; AVX512-NEXT: ret void122;123 %ld0 = load i64, ptr @src64, align 4124 %ld1 = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 1), align 4125 %ld2 = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 2), align 4126 %ld3 = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 3), align 4127 %ctlz0 = call i64 @llvm.ctlz.i64(i64 %ld0, i1 0)128 %ctlz1 = call i64 @llvm.ctlz.i64(i64 %ld1, i1 0)129 %ctlz2 = call i64 @llvm.ctlz.i64(i64 %ld2, i1 0)130 %ctlz3 = call i64 @llvm.ctlz.i64(i64 %ld3, i1 0)131 store i64 %ctlz0, ptr @dst64, align 4132 store i64 %ctlz1, ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 1), align 4133 store i64 %ctlz2, ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 2), align 4134 store i64 %ctlz3, ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 3), align 4135 ret void136}137 138define void @ctlz_4i32() #0 {139; SSE-LABEL: @ctlz_4i32(140; SSE-NEXT: [[LD0:%.*]] = load i32, ptr @src32, align 4141; SSE-NEXT: [[LD1:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 1), align 4142; SSE-NEXT: [[LD2:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 2), align 4143; SSE-NEXT: [[LD3:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 3), align 4144; SSE-NEXT: [[CTLZ0:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD0]], i1 false)145; SSE-NEXT: [[CTLZ1:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD1]], i1 false)146; SSE-NEXT: [[CTLZ2:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD2]], i1 false)147; SSE-NEXT: [[CTLZ3:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD3]], i1 false)148; SSE-NEXT: store i32 [[CTLZ0]], ptr @dst32, align 4149; SSE-NEXT: store i32 [[CTLZ1]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 1), align 4150; SSE-NEXT: store i32 [[CTLZ2]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 2), align 4151; SSE-NEXT: store i32 [[CTLZ3]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 3), align 4152; SSE-NEXT: ret void153;154; AVX1-LABEL: @ctlz_4i32(155; AVX1-NEXT: [[LD0:%.*]] = load i32, ptr @src32, align 4156; AVX1-NEXT: [[LD1:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 1), align 4157; AVX1-NEXT: [[LD2:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 2), align 4158; AVX1-NEXT: [[LD3:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 3), align 4159; AVX1-NEXT: [[CTLZ0:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD0]], i1 false)160; AVX1-NEXT: [[CTLZ1:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD1]], i1 false)161; AVX1-NEXT: [[CTLZ2:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD2]], i1 false)162; AVX1-NEXT: [[CTLZ3:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD3]], i1 false)163; AVX1-NEXT: store i32 [[CTLZ0]], ptr @dst32, align 4164; AVX1-NEXT: store i32 [[CTLZ1]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 1), align 4165; AVX1-NEXT: store i32 [[CTLZ2]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 2), align 4166; AVX1-NEXT: store i32 [[CTLZ3]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 3), align 4167; AVX1-NEXT: ret void168;169; AVX2-LABEL: @ctlz_4i32(170; AVX2-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr @src32, align 4171; AVX2-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> [[TMP1]], i1 false)172; AVX2-NEXT: store <4 x i32> [[TMP2]], ptr @dst32, align 4173; AVX2-NEXT: ret void174;175; AVX512-LABEL: @ctlz_4i32(176; AVX512-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr @src32, align 4177; AVX512-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> [[TMP1]], i1 false)178; AVX512-NEXT: store <4 x i32> [[TMP2]], ptr @dst32, align 4179; AVX512-NEXT: ret void180;181 %ld0 = load i32, ptr @src32, align 4182 %ld1 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 1), align 4183 %ld2 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 2), align 4184 %ld3 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 3), align 4185 %ctlz0 = call i32 @llvm.ctlz.i32(i32 %ld0, i1 0)186 %ctlz1 = call i32 @llvm.ctlz.i32(i32 %ld1, i1 0)187 %ctlz2 = call i32 @llvm.ctlz.i32(i32 %ld2, i1 0)188 %ctlz3 = call i32 @llvm.ctlz.i32(i32 %ld3, i1 0)189 store i32 %ctlz0, ptr @dst32, align 4190 store i32 %ctlz1, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 1), align 4191 store i32 %ctlz2, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 2), align 4192 store i32 %ctlz3, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 3), align 4193 ret void194}195 196define void @ctlz_8i32() #0 {197; SSE-LABEL: @ctlz_8i32(198; SSE-NEXT: [[LD0:%.*]] = load i32, ptr @src32, align 2199; SSE-NEXT: [[LD1:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 1), align 2200; SSE-NEXT: [[LD2:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 2), align 2201; SSE-NEXT: [[LD3:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 3), align 2202; SSE-NEXT: [[LD4:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 4), align 2203; SSE-NEXT: [[LD5:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 5), align 2204; SSE-NEXT: [[LD6:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 6), align 2205; SSE-NEXT: [[LD7:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 7), align 2206; SSE-NEXT: [[CTLZ0:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD0]], i1 false)207; SSE-NEXT: [[CTLZ1:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD1]], i1 false)208; SSE-NEXT: [[CTLZ2:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD2]], i1 false)209; SSE-NEXT: [[CTLZ3:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD3]], i1 false)210; SSE-NEXT: [[CTLZ4:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD4]], i1 false)211; SSE-NEXT: [[CTLZ5:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD5]], i1 false)212; SSE-NEXT: [[CTLZ6:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD6]], i1 false)213; SSE-NEXT: [[CTLZ7:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD7]], i1 false)214; SSE-NEXT: store i32 [[CTLZ0]], ptr @dst32, align 2215; SSE-NEXT: store i32 [[CTLZ1]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 1), align 2216; SSE-NEXT: store i32 [[CTLZ2]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 2), align 2217; SSE-NEXT: store i32 [[CTLZ3]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 3), align 2218; SSE-NEXT: store i32 [[CTLZ4]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 4), align 2219; SSE-NEXT: store i32 [[CTLZ5]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 5), align 2220; SSE-NEXT: store i32 [[CTLZ6]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 6), align 2221; SSE-NEXT: store i32 [[CTLZ7]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 7), align 2222; SSE-NEXT: ret void223;224; AVX1-LABEL: @ctlz_8i32(225; AVX1-NEXT: [[LD0:%.*]] = load i32, ptr @src32, align 2226; AVX1-NEXT: [[LD1:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 1), align 2227; AVX1-NEXT: [[LD2:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 2), align 2228; AVX1-NEXT: [[LD3:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 3), align 2229; AVX1-NEXT: [[LD4:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 4), align 2230; AVX1-NEXT: [[LD5:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 5), align 2231; AVX1-NEXT: [[LD6:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 6), align 2232; AVX1-NEXT: [[LD7:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 7), align 2233; AVX1-NEXT: [[CTLZ0:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD0]], i1 false)234; AVX1-NEXT: [[CTLZ1:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD1]], i1 false)235; AVX1-NEXT: [[CTLZ2:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD2]], i1 false)236; AVX1-NEXT: [[CTLZ3:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD3]], i1 false)237; AVX1-NEXT: [[CTLZ4:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD4]], i1 false)238; AVX1-NEXT: [[CTLZ5:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD5]], i1 false)239; AVX1-NEXT: [[CTLZ6:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD6]], i1 false)240; AVX1-NEXT: [[CTLZ7:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD7]], i1 false)241; AVX1-NEXT: store i32 [[CTLZ0]], ptr @dst32, align 2242; AVX1-NEXT: store i32 [[CTLZ1]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 1), align 2243; AVX1-NEXT: store i32 [[CTLZ2]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 2), align 2244; AVX1-NEXT: store i32 [[CTLZ3]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 3), align 2245; AVX1-NEXT: store i32 [[CTLZ4]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 4), align 2246; AVX1-NEXT: store i32 [[CTLZ5]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 5), align 2247; AVX1-NEXT: store i32 [[CTLZ6]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 6), align 2248; AVX1-NEXT: store i32 [[CTLZ7]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 7), align 2249; AVX1-NEXT: ret void250;251; AVX2-LABEL: @ctlz_8i32(252; AVX2-NEXT: [[TMP1:%.*]] = load <8 x i32>, ptr @src32, align 2253; AVX2-NEXT: [[TMP2:%.*]] = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> [[TMP1]], i1 false)254; AVX2-NEXT: store <8 x i32> [[TMP2]], ptr @dst32, align 2255; AVX2-NEXT: ret void256;257; AVX512-LABEL: @ctlz_8i32(258; AVX512-NEXT: [[TMP1:%.*]] = load <8 x i32>, ptr @src32, align 2259; AVX512-NEXT: [[TMP2:%.*]] = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> [[TMP1]], i1 false)260; AVX512-NEXT: store <8 x i32> [[TMP2]], ptr @dst32, align 2261; AVX512-NEXT: ret void262;263 %ld0 = load i32, ptr @src32, align 2264 %ld1 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 1), align 2265 %ld2 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 2), align 2266 %ld3 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 3), align 2267 %ld4 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 4), align 2268 %ld5 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 5), align 2269 %ld6 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 6), align 2270 %ld7 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 7), align 2271 %ctlz0 = call i32 @llvm.ctlz.i32(i32 %ld0, i1 0)272 %ctlz1 = call i32 @llvm.ctlz.i32(i32 %ld1, i1 0)273 %ctlz2 = call i32 @llvm.ctlz.i32(i32 %ld2, i1 0)274 %ctlz3 = call i32 @llvm.ctlz.i32(i32 %ld3, i1 0)275 %ctlz4 = call i32 @llvm.ctlz.i32(i32 %ld4, i1 0)276 %ctlz5 = call i32 @llvm.ctlz.i32(i32 %ld5, i1 0)277 %ctlz6 = call i32 @llvm.ctlz.i32(i32 %ld6, i1 0)278 %ctlz7 = call i32 @llvm.ctlz.i32(i32 %ld7, i1 0)279 store i32 %ctlz0, ptr @dst32, align 2280 store i32 %ctlz1, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 1), align 2281 store i32 %ctlz2, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 2), align 2282 store i32 %ctlz3, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 3), align 2283 store i32 %ctlz4, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 4), align 2284 store i32 %ctlz5, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 5), align 2285 store i32 %ctlz6, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 6), align 2286 store i32 %ctlz7, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 7), align 2287 ret void288}289 290define void @ctlz_8i16() #0 {291; CHECK-LABEL: @ctlz_8i16(292; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i16>, ptr @src16, align 2293; CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> [[TMP1]], i1 false)294; CHECK-NEXT: store <8 x i16> [[TMP2]], ptr @dst16, align 2295; CHECK-NEXT: ret void296;297 %ld0 = load i16, ptr @src16, align 2298 %ld1 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 1), align 2299 %ld2 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 2), align 2300 %ld3 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 3), align 2301 %ld4 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 4), align 2302 %ld5 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 5), align 2303 %ld6 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 6), align 2304 %ld7 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 7), align 2305 %ctlz0 = call i16 @llvm.ctlz.i16(i16 %ld0, i1 0)306 %ctlz1 = call i16 @llvm.ctlz.i16(i16 %ld1, i1 0)307 %ctlz2 = call i16 @llvm.ctlz.i16(i16 %ld2, i1 0)308 %ctlz3 = call i16 @llvm.ctlz.i16(i16 %ld3, i1 0)309 %ctlz4 = call i16 @llvm.ctlz.i16(i16 %ld4, i1 0)310 %ctlz5 = call i16 @llvm.ctlz.i16(i16 %ld5, i1 0)311 %ctlz6 = call i16 @llvm.ctlz.i16(i16 %ld6, i1 0)312 %ctlz7 = call i16 @llvm.ctlz.i16(i16 %ld7, i1 0)313 store i16 %ctlz0, ptr @dst16, align 2314 store i16 %ctlz1, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 1), align 2315 store i16 %ctlz2, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 2), align 2316 store i16 %ctlz3, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 3), align 2317 store i16 %ctlz4, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 4), align 2318 store i16 %ctlz5, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 5), align 2319 store i16 %ctlz6, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 6), align 2320 store i16 %ctlz7, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 7), align 2321 ret void322}323 324define void @ctlz_16i16() #0 {325; SSE-LABEL: @ctlz_16i16(326; SSE-NEXT: [[TMP1:%.*]] = load <8 x i16>, ptr @src16, align 2327; SSE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> [[TMP1]], i1 false)328; SSE-NEXT: store <8 x i16> [[TMP2]], ptr @dst16, align 2329; SSE-NEXT: [[TMP3:%.*]] = load <8 x i16>, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 8), align 2330; SSE-NEXT: [[TMP4:%.*]] = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> [[TMP3]], i1 false)331; SSE-NEXT: store <8 x i16> [[TMP4]], ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 8), align 2332; SSE-NEXT: ret void333;334; AVX-LABEL: @ctlz_16i16(335; AVX-NEXT: [[TMP1:%.*]] = load <16 x i16>, ptr @src16, align 2336; AVX-NEXT: [[TMP2:%.*]] = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> [[TMP1]], i1 false)337; AVX-NEXT: store <16 x i16> [[TMP2]], ptr @dst16, align 2338; AVX-NEXT: ret void339;340 %ld0 = load i16, ptr @src16, align 2341 %ld1 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 1), align 2342 %ld2 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 2), align 2343 %ld3 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 3), align 2344 %ld4 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 4), align 2345 %ld5 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 5), align 2346 %ld6 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 6), align 2347 %ld7 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 7), align 2348 %ld8 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 8), align 2349 %ld9 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 9), align 2350 %ld10 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 10), align 2351 %ld11 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 11), align 2352 %ld12 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 12), align 2353 %ld13 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 13), align 2354 %ld14 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 14), align 2355 %ld15 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 15), align 2356 %ctlz0 = call i16 @llvm.ctlz.i16(i16 %ld0, i1 0)357 %ctlz1 = call i16 @llvm.ctlz.i16(i16 %ld1, i1 0)358 %ctlz2 = call i16 @llvm.ctlz.i16(i16 %ld2, i1 0)359 %ctlz3 = call i16 @llvm.ctlz.i16(i16 %ld3, i1 0)360 %ctlz4 = call i16 @llvm.ctlz.i16(i16 %ld4, i1 0)361 %ctlz5 = call i16 @llvm.ctlz.i16(i16 %ld5, i1 0)362 %ctlz6 = call i16 @llvm.ctlz.i16(i16 %ld6, i1 0)363 %ctlz7 = call i16 @llvm.ctlz.i16(i16 %ld7, i1 0)364 %ctlz8 = call i16 @llvm.ctlz.i16(i16 %ld8, i1 0)365 %ctlz9 = call i16 @llvm.ctlz.i16(i16 %ld9, i1 0)366 %ctlz10 = call i16 @llvm.ctlz.i16(i16 %ld10, i1 0)367 %ctlz11 = call i16 @llvm.ctlz.i16(i16 %ld11, i1 0)368 %ctlz12 = call i16 @llvm.ctlz.i16(i16 %ld12, i1 0)369 %ctlz13 = call i16 @llvm.ctlz.i16(i16 %ld13, i1 0)370 %ctlz14 = call i16 @llvm.ctlz.i16(i16 %ld14, i1 0)371 %ctlz15 = call i16 @llvm.ctlz.i16(i16 %ld15, i1 0)372 store i16 %ctlz0 , ptr @dst16, align 2373 store i16 %ctlz1 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 1), align 2374 store i16 %ctlz2 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 2), align 2375 store i16 %ctlz3 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 3), align 2376 store i16 %ctlz4 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 4), align 2377 store i16 %ctlz5 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 5), align 2378 store i16 %ctlz6 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 6), align 2379 store i16 %ctlz7 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 7), align 2380 store i16 %ctlz8 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 8), align 2381 store i16 %ctlz9 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 9), align 2382 store i16 %ctlz10, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 10), align 2383 store i16 %ctlz11, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 11), align 2384 store i16 %ctlz12, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 12), align 2385 store i16 %ctlz13, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 13), align 2386 store i16 %ctlz14, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 14), align 2387 store i16 %ctlz15, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 15), align 2388 ret void389}390 391define void @ctlz_16i8() #0 {392; CHECK-LABEL: @ctlz_16i8(393; CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @src8, align 1394; CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> [[TMP1]], i1 false)395; CHECK-NEXT: store <16 x i8> [[TMP2]], ptr @dst8, align 1396; CHECK-NEXT: ret void397;398 %ld0 = load i8, ptr @src8, align 1399 %ld1 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 1), align 1400 %ld2 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 2), align 1401 %ld3 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 3), align 1402 %ld4 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 4), align 1403 %ld5 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 5), align 1404 %ld6 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 6), align 1405 %ld7 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 7), align 1406 %ld8 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 8), align 1407 %ld9 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 9), align 1408 %ld10 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 10), align 1409 %ld11 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 11), align 1410 %ld12 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 12), align 1411 %ld13 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 13), align 1412 %ld14 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 14), align 1413 %ld15 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 15), align 1414 %ctlz0 = call i8 @llvm.ctlz.i8(i8 %ld0, i1 0)415 %ctlz1 = call i8 @llvm.ctlz.i8(i8 %ld1, i1 0)416 %ctlz2 = call i8 @llvm.ctlz.i8(i8 %ld2, i1 0)417 %ctlz3 = call i8 @llvm.ctlz.i8(i8 %ld3, i1 0)418 %ctlz4 = call i8 @llvm.ctlz.i8(i8 %ld4, i1 0)419 %ctlz5 = call i8 @llvm.ctlz.i8(i8 %ld5, i1 0)420 %ctlz6 = call i8 @llvm.ctlz.i8(i8 %ld6, i1 0)421 %ctlz7 = call i8 @llvm.ctlz.i8(i8 %ld7, i1 0)422 %ctlz8 = call i8 @llvm.ctlz.i8(i8 %ld8, i1 0)423 %ctlz9 = call i8 @llvm.ctlz.i8(i8 %ld9, i1 0)424 %ctlz10 = call i8 @llvm.ctlz.i8(i8 %ld10, i1 0)425 %ctlz11 = call i8 @llvm.ctlz.i8(i8 %ld11, i1 0)426 %ctlz12 = call i8 @llvm.ctlz.i8(i8 %ld12, i1 0)427 %ctlz13 = call i8 @llvm.ctlz.i8(i8 %ld13, i1 0)428 %ctlz14 = call i8 @llvm.ctlz.i8(i8 %ld14, i1 0)429 %ctlz15 = call i8 @llvm.ctlz.i8(i8 %ld15, i1 0)430 store i8 %ctlz0 , ptr @dst8, align 1431 store i8 %ctlz1 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 1), align 1432 store i8 %ctlz2 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 2), align 1433 store i8 %ctlz3 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 3), align 1434 store i8 %ctlz4 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 4), align 1435 store i8 %ctlz5 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 5), align 1436 store i8 %ctlz6 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 6), align 1437 store i8 %ctlz7 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 7), align 1438 store i8 %ctlz8 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 8), align 1439 store i8 %ctlz9 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 9), align 1440 store i8 %ctlz10, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 10), align 1441 store i8 %ctlz11, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 11), align 1442 store i8 %ctlz12, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 12), align 1443 store i8 %ctlz13, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 13), align 1444 store i8 %ctlz14, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 14), align 1445 store i8 %ctlz15, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 15), align 1446 ret void447}448 449define void @ctlz_32i8() #0 {450; SSE-LABEL: @ctlz_32i8(451; SSE-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @src8, align 1452; SSE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> [[TMP1]], i1 false)453; SSE-NEXT: store <16 x i8> [[TMP2]], ptr @dst8, align 1454; SSE-NEXT: [[TMP3:%.*]] = load <16 x i8>, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 16), align 1455; SSE-NEXT: [[TMP4:%.*]] = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> [[TMP3]], i1 false)456; SSE-NEXT: store <16 x i8> [[TMP4]], ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 16), align 1457; SSE-NEXT: ret void458;459; AVX-LABEL: @ctlz_32i8(460; AVX-NEXT: [[TMP1:%.*]] = load <32 x i8>, ptr @src8, align 1461; AVX-NEXT: [[TMP2:%.*]] = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> [[TMP1]], i1 false)462; AVX-NEXT: store <32 x i8> [[TMP2]], ptr @dst8, align 1463; AVX-NEXT: ret void464;465 %ld0 = load i8, ptr @src8, align 1466 %ld1 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 1), align 1467 %ld2 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 2), align 1468 %ld3 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 3), align 1469 %ld4 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 4), align 1470 %ld5 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 5), align 1471 %ld6 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 6), align 1472 %ld7 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 7), align 1473 %ld8 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 8), align 1474 %ld9 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 9), align 1475 %ld10 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 10), align 1476 %ld11 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 11), align 1477 %ld12 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 12), align 1478 %ld13 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 13), align 1479 %ld14 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 14), align 1480 %ld15 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 15), align 1481 %ld16 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 16), align 1482 %ld17 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 17), align 1483 %ld18 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 18), align 1484 %ld19 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 19), align 1485 %ld20 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 20), align 1486 %ld21 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 21), align 1487 %ld22 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 22), align 1488 %ld23 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 23), align 1489 %ld24 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 24), align 1490 %ld25 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 25), align 1491 %ld26 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 26), align 1492 %ld27 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 27), align 1493 %ld28 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 28), align 1494 %ld29 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 29), align 1495 %ld30 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 30), align 1496 %ld31 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 31), align 1497 %ctlz0 = call i8 @llvm.ctlz.i8(i8 %ld0, i1 0)498 %ctlz1 = call i8 @llvm.ctlz.i8(i8 %ld1, i1 0)499 %ctlz2 = call i8 @llvm.ctlz.i8(i8 %ld2, i1 0)500 %ctlz3 = call i8 @llvm.ctlz.i8(i8 %ld3, i1 0)501 %ctlz4 = call i8 @llvm.ctlz.i8(i8 %ld4, i1 0)502 %ctlz5 = call i8 @llvm.ctlz.i8(i8 %ld5, i1 0)503 %ctlz6 = call i8 @llvm.ctlz.i8(i8 %ld6, i1 0)504 %ctlz7 = call i8 @llvm.ctlz.i8(i8 %ld7, i1 0)505 %ctlz8 = call i8 @llvm.ctlz.i8(i8 %ld8, i1 0)506 %ctlz9 = call i8 @llvm.ctlz.i8(i8 %ld9, i1 0)507 %ctlz10 = call i8 @llvm.ctlz.i8(i8 %ld10, i1 0)508 %ctlz11 = call i8 @llvm.ctlz.i8(i8 %ld11, i1 0)509 %ctlz12 = call i8 @llvm.ctlz.i8(i8 %ld12, i1 0)510 %ctlz13 = call i8 @llvm.ctlz.i8(i8 %ld13, i1 0)511 %ctlz14 = call i8 @llvm.ctlz.i8(i8 %ld14, i1 0)512 %ctlz15 = call i8 @llvm.ctlz.i8(i8 %ld15, i1 0)513 %ctlz16 = call i8 @llvm.ctlz.i8(i8 %ld16, i1 0)514 %ctlz17 = call i8 @llvm.ctlz.i8(i8 %ld17, i1 0)515 %ctlz18 = call i8 @llvm.ctlz.i8(i8 %ld18, i1 0)516 %ctlz19 = call i8 @llvm.ctlz.i8(i8 %ld19, i1 0)517 %ctlz20 = call i8 @llvm.ctlz.i8(i8 %ld20, i1 0)518 %ctlz21 = call i8 @llvm.ctlz.i8(i8 %ld21, i1 0)519 %ctlz22 = call i8 @llvm.ctlz.i8(i8 %ld22, i1 0)520 %ctlz23 = call i8 @llvm.ctlz.i8(i8 %ld23, i1 0)521 %ctlz24 = call i8 @llvm.ctlz.i8(i8 %ld24, i1 0)522 %ctlz25 = call i8 @llvm.ctlz.i8(i8 %ld25, i1 0)523 %ctlz26 = call i8 @llvm.ctlz.i8(i8 %ld26, i1 0)524 %ctlz27 = call i8 @llvm.ctlz.i8(i8 %ld27, i1 0)525 %ctlz28 = call i8 @llvm.ctlz.i8(i8 %ld28, i1 0)526 %ctlz29 = call i8 @llvm.ctlz.i8(i8 %ld29, i1 0)527 %ctlz30 = call i8 @llvm.ctlz.i8(i8 %ld30, i1 0)528 %ctlz31 = call i8 @llvm.ctlz.i8(i8 %ld31, i1 0)529 store i8 %ctlz0 , ptr @dst8, align 1530 store i8 %ctlz1 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 1), align 1531 store i8 %ctlz2 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 2), align 1532 store i8 %ctlz3 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 3), align 1533 store i8 %ctlz4 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 4), align 1534 store i8 %ctlz5 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 5), align 1535 store i8 %ctlz6 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 6), align 1536 store i8 %ctlz7 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 7), align 1537 store i8 %ctlz8 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 8), align 1538 store i8 %ctlz9 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 9), align 1539 store i8 %ctlz10, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 10), align 1540 store i8 %ctlz11, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 11), align 1541 store i8 %ctlz12, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 12), align 1542 store i8 %ctlz13, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 13), align 1543 store i8 %ctlz14, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 14), align 1544 store i8 %ctlz15, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 15), align 1545 store i8 %ctlz16, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 16), align 1546 store i8 %ctlz17, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 17), align 1547 store i8 %ctlz18, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 18), align 1548 store i8 %ctlz19, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 19), align 1549 store i8 %ctlz20, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 20), align 1550 store i8 %ctlz21, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 21), align 1551 store i8 %ctlz22, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 22), align 1552 store i8 %ctlz23, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 23), align 1553 store i8 %ctlz24, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 24), align 1554 store i8 %ctlz25, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 25), align 1555 store i8 %ctlz26, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 26), align 1556 store i8 %ctlz27, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 27), align 1557 store i8 %ctlz28, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 28), align 1558 store i8 %ctlz29, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 29), align 1559 store i8 %ctlz30, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 30), align 1560 store i8 %ctlz31, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 31), align 1561 ret void562}563 564;565; CTLZ_ZERO_UNDEF566;567 568define void @ctlz_undef_2i64() #0 {569; SSE-LABEL: @ctlz_undef_2i64(570; SSE-NEXT: [[LD0:%.*]] = load i64, ptr @src64, align 8571; SSE-NEXT: [[LD1:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i32 0, i64 1), align 8572; SSE-NEXT: [[CTLZ0:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD0]], i1 true)573; SSE-NEXT: [[CTLZ1:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD1]], i1 true)574; SSE-NEXT: store i64 [[CTLZ0]], ptr @dst64, align 8575; SSE-NEXT: store i64 [[CTLZ1]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i32 0, i64 1), align 8576; SSE-NEXT: ret void577;578; AVX1-LABEL: @ctlz_undef_2i64(579; AVX1-NEXT: [[LD0:%.*]] = load i64, ptr @src64, align 8580; AVX1-NEXT: [[LD1:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i32 0, i64 1), align 8581; AVX1-NEXT: [[CTLZ0:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD0]], i1 true)582; AVX1-NEXT: [[CTLZ1:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD1]], i1 true)583; AVX1-NEXT: store i64 [[CTLZ0]], ptr @dst64, align 8584; AVX1-NEXT: store i64 [[CTLZ1]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i32 0, i64 1), align 8585; AVX1-NEXT: ret void586;587; AVX2-LABEL: @ctlz_undef_2i64(588; AVX2-NEXT: [[LD0:%.*]] = load i64, ptr @src64, align 8589; AVX2-NEXT: [[LD1:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i32 0, i64 1), align 8590; AVX2-NEXT: [[CTLZ0:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD0]], i1 true)591; AVX2-NEXT: [[CTLZ1:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD1]], i1 true)592; AVX2-NEXT: store i64 [[CTLZ0]], ptr @dst64, align 8593; AVX2-NEXT: store i64 [[CTLZ1]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i32 0, i64 1), align 8594; AVX2-NEXT: ret void595;596; AVX512-LABEL: @ctlz_undef_2i64(597; AVX512-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr @src64, align 8598; AVX512-NEXT: [[TMP2:%.*]] = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> [[TMP1]], i1 true)599; AVX512-NEXT: store <2 x i64> [[TMP2]], ptr @dst64, align 8600; AVX512-NEXT: ret void601;602 %ld0 = load i64, ptr @src64, align 8603 %ld1 = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i32 0, i64 1), align 8604 %ctlz0 = call i64 @llvm.ctlz.i64(i64 %ld0, i1 -1)605 %ctlz1 = call i64 @llvm.ctlz.i64(i64 %ld1, i1 -1)606 store i64 %ctlz0, ptr @dst64, align 8607 store i64 %ctlz1, ptr getelementptr inbounds ([4 x i64], ptr @dst64, i32 0, i64 1), align 8608 ret void609}610 611define void @ctlz_undef_4i64() #0 {612; SSE-LABEL: @ctlz_undef_4i64(613; SSE-NEXT: [[LD0:%.*]] = load i64, ptr @src64, align 4614; SSE-NEXT: [[LD1:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 1), align 4615; SSE-NEXT: [[LD2:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 2), align 4616; SSE-NEXT: [[LD3:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 3), align 4617; SSE-NEXT: [[CTLZ0:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD0]], i1 true)618; SSE-NEXT: [[CTLZ1:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD1]], i1 true)619; SSE-NEXT: [[CTLZ2:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD2]], i1 true)620; SSE-NEXT: [[CTLZ3:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD3]], i1 true)621; SSE-NEXT: store i64 [[CTLZ0]], ptr @dst64, align 4622; SSE-NEXT: store i64 [[CTLZ1]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 1), align 4623; SSE-NEXT: store i64 [[CTLZ2]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 2), align 4624; SSE-NEXT: store i64 [[CTLZ3]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 3), align 4625; SSE-NEXT: ret void626;627; AVX1-LABEL: @ctlz_undef_4i64(628; AVX1-NEXT: [[LD0:%.*]] = load i64, ptr @src64, align 4629; AVX1-NEXT: [[LD1:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 1), align 4630; AVX1-NEXT: [[LD2:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 2), align 4631; AVX1-NEXT: [[LD3:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 3), align 4632; AVX1-NEXT: [[CTLZ0:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD0]], i1 true)633; AVX1-NEXT: [[CTLZ1:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD1]], i1 true)634; AVX1-NEXT: [[CTLZ2:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD2]], i1 true)635; AVX1-NEXT: [[CTLZ3:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD3]], i1 true)636; AVX1-NEXT: store i64 [[CTLZ0]], ptr @dst64, align 4637; AVX1-NEXT: store i64 [[CTLZ1]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 1), align 4638; AVX1-NEXT: store i64 [[CTLZ2]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 2), align 4639; AVX1-NEXT: store i64 [[CTLZ3]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 3), align 4640; AVX1-NEXT: ret void641;642; AVX2-LABEL: @ctlz_undef_4i64(643; AVX2-NEXT: [[LD0:%.*]] = load i64, ptr @src64, align 4644; AVX2-NEXT: [[LD1:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 1), align 4645; AVX2-NEXT: [[LD2:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 2), align 4646; AVX2-NEXT: [[LD3:%.*]] = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 3), align 4647; AVX2-NEXT: [[CTLZ0:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD0]], i1 true)648; AVX2-NEXT: [[CTLZ1:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD1]], i1 true)649; AVX2-NEXT: [[CTLZ2:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD2]], i1 true)650; AVX2-NEXT: [[CTLZ3:%.*]] = call i64 @llvm.ctlz.i64(i64 [[LD3]], i1 true)651; AVX2-NEXT: store i64 [[CTLZ0]], ptr @dst64, align 4652; AVX2-NEXT: store i64 [[CTLZ1]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 1), align 4653; AVX2-NEXT: store i64 [[CTLZ2]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 2), align 4654; AVX2-NEXT: store i64 [[CTLZ3]], ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 3), align 4655; AVX2-NEXT: ret void656;657; AVX512-LABEL: @ctlz_undef_4i64(658; AVX512-NEXT: [[TMP1:%.*]] = load <4 x i64>, ptr @src64, align 4659; AVX512-NEXT: [[TMP2:%.*]] = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> [[TMP1]], i1 true)660; AVX512-NEXT: store <4 x i64> [[TMP2]], ptr @dst64, align 4661; AVX512-NEXT: ret void662;663 %ld0 = load i64, ptr @src64, align 4664 %ld1 = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 1), align 4665 %ld2 = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 2), align 4666 %ld3 = load i64, ptr getelementptr inbounds ([4 x i64], ptr @src64, i64 0, i64 3), align 4667 %ctlz0 = call i64 @llvm.ctlz.i64(i64 %ld0, i1 -1)668 %ctlz1 = call i64 @llvm.ctlz.i64(i64 %ld1, i1 -1)669 %ctlz2 = call i64 @llvm.ctlz.i64(i64 %ld2, i1 -1)670 %ctlz3 = call i64 @llvm.ctlz.i64(i64 %ld3, i1 -1)671 store i64 %ctlz0, ptr @dst64, align 4672 store i64 %ctlz1, ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 1), align 4673 store i64 %ctlz2, ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 2), align 4674 store i64 %ctlz3, ptr getelementptr inbounds ([4 x i64], ptr @dst64, i64 0, i64 3), align 4675 ret void676}677 678define void @ctlz_undef_4i32() #0 {679; SSE-LABEL: @ctlz_undef_4i32(680; SSE-NEXT: [[LD0:%.*]] = load i32, ptr @src32, align 4681; SSE-NEXT: [[LD1:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 1), align 4682; SSE-NEXT: [[LD2:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 2), align 4683; SSE-NEXT: [[LD3:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 3), align 4684; SSE-NEXT: [[CTLZ0:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD0]], i1 true)685; SSE-NEXT: [[CTLZ1:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD1]], i1 true)686; SSE-NEXT: [[CTLZ2:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD2]], i1 true)687; SSE-NEXT: [[CTLZ3:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD3]], i1 true)688; SSE-NEXT: store i32 [[CTLZ0]], ptr @dst32, align 4689; SSE-NEXT: store i32 [[CTLZ1]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 1), align 4690; SSE-NEXT: store i32 [[CTLZ2]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 2), align 4691; SSE-NEXT: store i32 [[CTLZ3]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 3), align 4692; SSE-NEXT: ret void693;694; AVX1-LABEL: @ctlz_undef_4i32(695; AVX1-NEXT: [[LD0:%.*]] = load i32, ptr @src32, align 4696; AVX1-NEXT: [[LD1:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 1), align 4697; AVX1-NEXT: [[LD2:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 2), align 4698; AVX1-NEXT: [[LD3:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 3), align 4699; AVX1-NEXT: [[CTLZ0:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD0]], i1 true)700; AVX1-NEXT: [[CTLZ1:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD1]], i1 true)701; AVX1-NEXT: [[CTLZ2:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD2]], i1 true)702; AVX1-NEXT: [[CTLZ3:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD3]], i1 true)703; AVX1-NEXT: store i32 [[CTLZ0]], ptr @dst32, align 4704; AVX1-NEXT: store i32 [[CTLZ1]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 1), align 4705; AVX1-NEXT: store i32 [[CTLZ2]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 2), align 4706; AVX1-NEXT: store i32 [[CTLZ3]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 3), align 4707; AVX1-NEXT: ret void708;709; AVX2-LABEL: @ctlz_undef_4i32(710; AVX2-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr @src32, align 4711; AVX2-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> [[TMP1]], i1 true)712; AVX2-NEXT: store <4 x i32> [[TMP2]], ptr @dst32, align 4713; AVX2-NEXT: ret void714;715; AVX512-LABEL: @ctlz_undef_4i32(716; AVX512-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr @src32, align 4717; AVX512-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> [[TMP1]], i1 true)718; AVX512-NEXT: store <4 x i32> [[TMP2]], ptr @dst32, align 4719; AVX512-NEXT: ret void720;721 %ld0 = load i32, ptr @src32, align 4722 %ld1 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 1), align 4723 %ld2 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 2), align 4724 %ld3 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 3), align 4725 %ctlz0 = call i32 @llvm.ctlz.i32(i32 %ld0, i1 -1)726 %ctlz1 = call i32 @llvm.ctlz.i32(i32 %ld1, i1 -1)727 %ctlz2 = call i32 @llvm.ctlz.i32(i32 %ld2, i1 -1)728 %ctlz3 = call i32 @llvm.ctlz.i32(i32 %ld3, i1 -1)729 store i32 %ctlz0, ptr @dst32, align 4730 store i32 %ctlz1, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 1), align 4731 store i32 %ctlz2, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 2), align 4732 store i32 %ctlz3, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 3), align 4733 ret void734}735 736define void @ctlz_undef_8i32() #0 {737; SSE-LABEL: @ctlz_undef_8i32(738; SSE-NEXT: [[LD0:%.*]] = load i32, ptr @src32, align 2739; SSE-NEXT: [[LD1:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 1), align 2740; SSE-NEXT: [[LD2:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 2), align 2741; SSE-NEXT: [[LD3:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 3), align 2742; SSE-NEXT: [[LD4:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 4), align 2743; SSE-NEXT: [[LD5:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 5), align 2744; SSE-NEXT: [[LD6:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 6), align 2745; SSE-NEXT: [[LD7:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 7), align 2746; SSE-NEXT: [[CTLZ0:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD0]], i1 true)747; SSE-NEXT: [[CTLZ1:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD1]], i1 true)748; SSE-NEXT: [[CTLZ2:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD2]], i1 true)749; SSE-NEXT: [[CTLZ3:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD3]], i1 true)750; SSE-NEXT: [[CTLZ4:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD4]], i1 true)751; SSE-NEXT: [[CTLZ5:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD5]], i1 true)752; SSE-NEXT: [[CTLZ6:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD6]], i1 true)753; SSE-NEXT: [[CTLZ7:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD7]], i1 true)754; SSE-NEXT: store i32 [[CTLZ0]], ptr @dst32, align 2755; SSE-NEXT: store i32 [[CTLZ1]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 1), align 2756; SSE-NEXT: store i32 [[CTLZ2]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 2), align 2757; SSE-NEXT: store i32 [[CTLZ3]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 3), align 2758; SSE-NEXT: store i32 [[CTLZ4]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 4), align 2759; SSE-NEXT: store i32 [[CTLZ5]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 5), align 2760; SSE-NEXT: store i32 [[CTLZ6]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 6), align 2761; SSE-NEXT: store i32 [[CTLZ7]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 7), align 2762; SSE-NEXT: ret void763;764; AVX1-LABEL: @ctlz_undef_8i32(765; AVX1-NEXT: [[LD0:%.*]] = load i32, ptr @src32, align 2766; AVX1-NEXT: [[LD1:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 1), align 2767; AVX1-NEXT: [[LD2:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 2), align 2768; AVX1-NEXT: [[LD3:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 3), align 2769; AVX1-NEXT: [[LD4:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 4), align 2770; AVX1-NEXT: [[LD5:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 5), align 2771; AVX1-NEXT: [[LD6:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 6), align 2772; AVX1-NEXT: [[LD7:%.*]] = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 7), align 2773; AVX1-NEXT: [[CTLZ0:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD0]], i1 true)774; AVX1-NEXT: [[CTLZ1:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD1]], i1 true)775; AVX1-NEXT: [[CTLZ2:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD2]], i1 true)776; AVX1-NEXT: [[CTLZ3:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD3]], i1 true)777; AVX1-NEXT: [[CTLZ4:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD4]], i1 true)778; AVX1-NEXT: [[CTLZ5:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD5]], i1 true)779; AVX1-NEXT: [[CTLZ6:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD6]], i1 true)780; AVX1-NEXT: [[CTLZ7:%.*]] = call i32 @llvm.ctlz.i32(i32 [[LD7]], i1 true)781; AVX1-NEXT: store i32 [[CTLZ0]], ptr @dst32, align 2782; AVX1-NEXT: store i32 [[CTLZ1]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 1), align 2783; AVX1-NEXT: store i32 [[CTLZ2]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 2), align 2784; AVX1-NEXT: store i32 [[CTLZ3]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 3), align 2785; AVX1-NEXT: store i32 [[CTLZ4]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 4), align 2786; AVX1-NEXT: store i32 [[CTLZ5]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 5), align 2787; AVX1-NEXT: store i32 [[CTLZ6]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 6), align 2788; AVX1-NEXT: store i32 [[CTLZ7]], ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 7), align 2789; AVX1-NEXT: ret void790;791; AVX2-LABEL: @ctlz_undef_8i32(792; AVX2-NEXT: [[TMP1:%.*]] = load <8 x i32>, ptr @src32, align 2793; AVX2-NEXT: [[TMP2:%.*]] = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> [[TMP1]], i1 true)794; AVX2-NEXT: store <8 x i32> [[TMP2]], ptr @dst32, align 2795; AVX2-NEXT: ret void796;797; AVX512-LABEL: @ctlz_undef_8i32(798; AVX512-NEXT: [[TMP1:%.*]] = load <8 x i32>, ptr @src32, align 2799; AVX512-NEXT: [[TMP2:%.*]] = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> [[TMP1]], i1 true)800; AVX512-NEXT: store <8 x i32> [[TMP2]], ptr @dst32, align 2801; AVX512-NEXT: ret void802;803 %ld0 = load i32, ptr @src32, align 2804 %ld1 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 1), align 2805 %ld2 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 2), align 2806 %ld3 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 3), align 2807 %ld4 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 4), align 2808 %ld5 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 5), align 2809 %ld6 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 6), align 2810 %ld7 = load i32, ptr getelementptr inbounds ([8 x i32], ptr @src32, i32 0, i64 7), align 2811 %ctlz0 = call i32 @llvm.ctlz.i32(i32 %ld0, i1 -1)812 %ctlz1 = call i32 @llvm.ctlz.i32(i32 %ld1, i1 -1)813 %ctlz2 = call i32 @llvm.ctlz.i32(i32 %ld2, i1 -1)814 %ctlz3 = call i32 @llvm.ctlz.i32(i32 %ld3, i1 -1)815 %ctlz4 = call i32 @llvm.ctlz.i32(i32 %ld4, i1 -1)816 %ctlz5 = call i32 @llvm.ctlz.i32(i32 %ld5, i1 -1)817 %ctlz6 = call i32 @llvm.ctlz.i32(i32 %ld6, i1 -1)818 %ctlz7 = call i32 @llvm.ctlz.i32(i32 %ld7, i1 -1)819 store i32 %ctlz0, ptr @dst32, align 2820 store i32 %ctlz1, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 1), align 2821 store i32 %ctlz2, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 2), align 2822 store i32 %ctlz3, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 3), align 2823 store i32 %ctlz4, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 4), align 2824 store i32 %ctlz5, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 5), align 2825 store i32 %ctlz6, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 6), align 2826 store i32 %ctlz7, ptr getelementptr inbounds ([8 x i32], ptr @dst32, i32 0, i64 7), align 2827 ret void828}829 830define void @ctlz_undef_8i16() #0 {831; CHECK-LABEL: @ctlz_undef_8i16(832; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i16>, ptr @src16, align 2833; CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> [[TMP1]], i1 true)834; CHECK-NEXT: store <8 x i16> [[TMP2]], ptr @dst16, align 2835; CHECK-NEXT: ret void836;837 %ld0 = load i16, ptr @src16, align 2838 %ld1 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 1), align 2839 %ld2 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 2), align 2840 %ld3 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 3), align 2841 %ld4 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 4), align 2842 %ld5 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 5), align 2843 %ld6 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 6), align 2844 %ld7 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 7), align 2845 %ctlz0 = call i16 @llvm.ctlz.i16(i16 %ld0, i1 -1)846 %ctlz1 = call i16 @llvm.ctlz.i16(i16 %ld1, i1 -1)847 %ctlz2 = call i16 @llvm.ctlz.i16(i16 %ld2, i1 -1)848 %ctlz3 = call i16 @llvm.ctlz.i16(i16 %ld3, i1 -1)849 %ctlz4 = call i16 @llvm.ctlz.i16(i16 %ld4, i1 -1)850 %ctlz5 = call i16 @llvm.ctlz.i16(i16 %ld5, i1 -1)851 %ctlz6 = call i16 @llvm.ctlz.i16(i16 %ld6, i1 -1)852 %ctlz7 = call i16 @llvm.ctlz.i16(i16 %ld7, i1 -1)853 store i16 %ctlz0, ptr @dst16, align 2854 store i16 %ctlz1, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 1), align 2855 store i16 %ctlz2, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 2), align 2856 store i16 %ctlz3, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 3), align 2857 store i16 %ctlz4, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 4), align 2858 store i16 %ctlz5, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 5), align 2859 store i16 %ctlz6, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 6), align 2860 store i16 %ctlz7, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 7), align 2861 ret void862}863 864define void @ctlz_undef_16i16() #0 {865; SSE-LABEL: @ctlz_undef_16i16(866; SSE-NEXT: [[TMP1:%.*]] = load <8 x i16>, ptr @src16, align 2867; SSE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> [[TMP1]], i1 true)868; SSE-NEXT: store <8 x i16> [[TMP2]], ptr @dst16, align 2869; SSE-NEXT: [[TMP3:%.*]] = load <8 x i16>, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 8), align 2870; SSE-NEXT: [[TMP4:%.*]] = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> [[TMP3]], i1 true)871; SSE-NEXT: store <8 x i16> [[TMP4]], ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 8), align 2872; SSE-NEXT: ret void873;874; AVX-LABEL: @ctlz_undef_16i16(875; AVX-NEXT: [[TMP1:%.*]] = load <16 x i16>, ptr @src16, align 2876; AVX-NEXT: [[TMP2:%.*]] = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> [[TMP1]], i1 true)877; AVX-NEXT: store <16 x i16> [[TMP2]], ptr @dst16, align 2878; AVX-NEXT: ret void879;880 %ld0 = load i16, ptr @src16, align 2881 %ld1 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 1), align 2882 %ld2 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 2), align 2883 %ld3 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 3), align 2884 %ld4 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 4), align 2885 %ld5 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 5), align 2886 %ld6 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 6), align 2887 %ld7 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 7), align 2888 %ld8 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 8), align 2889 %ld9 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 9), align 2890 %ld10 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 10), align 2891 %ld11 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 11), align 2892 %ld12 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 12), align 2893 %ld13 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 13), align 2894 %ld14 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 14), align 2895 %ld15 = load i16, ptr getelementptr inbounds ([16 x i16], ptr @src16, i16 0, i64 15), align 2896 %ctlz0 = call i16 @llvm.ctlz.i16(i16 %ld0, i1 -1)897 %ctlz1 = call i16 @llvm.ctlz.i16(i16 %ld1, i1 -1)898 %ctlz2 = call i16 @llvm.ctlz.i16(i16 %ld2, i1 -1)899 %ctlz3 = call i16 @llvm.ctlz.i16(i16 %ld3, i1 -1)900 %ctlz4 = call i16 @llvm.ctlz.i16(i16 %ld4, i1 -1)901 %ctlz5 = call i16 @llvm.ctlz.i16(i16 %ld5, i1 -1)902 %ctlz6 = call i16 @llvm.ctlz.i16(i16 %ld6, i1 -1)903 %ctlz7 = call i16 @llvm.ctlz.i16(i16 %ld7, i1 -1)904 %ctlz8 = call i16 @llvm.ctlz.i16(i16 %ld8, i1 -1)905 %ctlz9 = call i16 @llvm.ctlz.i16(i16 %ld9, i1 -1)906 %ctlz10 = call i16 @llvm.ctlz.i16(i16 %ld10, i1 -1)907 %ctlz11 = call i16 @llvm.ctlz.i16(i16 %ld11, i1 -1)908 %ctlz12 = call i16 @llvm.ctlz.i16(i16 %ld12, i1 -1)909 %ctlz13 = call i16 @llvm.ctlz.i16(i16 %ld13, i1 -1)910 %ctlz14 = call i16 @llvm.ctlz.i16(i16 %ld14, i1 -1)911 %ctlz15 = call i16 @llvm.ctlz.i16(i16 %ld15, i1 -1)912 store i16 %ctlz0 , ptr @dst16, align 2913 store i16 %ctlz1 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 1), align 2914 store i16 %ctlz2 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 2), align 2915 store i16 %ctlz3 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 3), align 2916 store i16 %ctlz4 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 4), align 2917 store i16 %ctlz5 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 5), align 2918 store i16 %ctlz6 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 6), align 2919 store i16 %ctlz7 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 7), align 2920 store i16 %ctlz8 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 8), align 2921 store i16 %ctlz9 , ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 9), align 2922 store i16 %ctlz10, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 10), align 2923 store i16 %ctlz11, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 11), align 2924 store i16 %ctlz12, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 12), align 2925 store i16 %ctlz13, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 13), align 2926 store i16 %ctlz14, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 14), align 2927 store i16 %ctlz15, ptr getelementptr inbounds ([16 x i16], ptr @dst16, i16 0, i64 15), align 2928 ret void929}930 931define void @ctlz_undef_16i8() #0 {932; CHECK-LABEL: @ctlz_undef_16i8(933; CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @src8, align 1934; CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> [[TMP1]], i1 true)935; CHECK-NEXT: store <16 x i8> [[TMP2]], ptr @dst8, align 1936; CHECK-NEXT: ret void937;938 %ld0 = load i8, ptr @src8, align 1939 %ld1 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 1), align 1940 %ld2 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 2), align 1941 %ld3 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 3), align 1942 %ld4 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 4), align 1943 %ld5 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 5), align 1944 %ld6 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 6), align 1945 %ld7 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 7), align 1946 %ld8 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 8), align 1947 %ld9 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 9), align 1948 %ld10 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 10), align 1949 %ld11 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 11), align 1950 %ld12 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 12), align 1951 %ld13 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 13), align 1952 %ld14 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 14), align 1953 %ld15 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 15), align 1954 %ctlz0 = call i8 @llvm.ctlz.i8(i8 %ld0, i1 -1)955 %ctlz1 = call i8 @llvm.ctlz.i8(i8 %ld1, i1 -1)956 %ctlz2 = call i8 @llvm.ctlz.i8(i8 %ld2, i1 -1)957 %ctlz3 = call i8 @llvm.ctlz.i8(i8 %ld3, i1 -1)958 %ctlz4 = call i8 @llvm.ctlz.i8(i8 %ld4, i1 -1)959 %ctlz5 = call i8 @llvm.ctlz.i8(i8 %ld5, i1 -1)960 %ctlz6 = call i8 @llvm.ctlz.i8(i8 %ld6, i1 -1)961 %ctlz7 = call i8 @llvm.ctlz.i8(i8 %ld7, i1 -1)962 %ctlz8 = call i8 @llvm.ctlz.i8(i8 %ld8, i1 -1)963 %ctlz9 = call i8 @llvm.ctlz.i8(i8 %ld9, i1 -1)964 %ctlz10 = call i8 @llvm.ctlz.i8(i8 %ld10, i1 -1)965 %ctlz11 = call i8 @llvm.ctlz.i8(i8 %ld11, i1 -1)966 %ctlz12 = call i8 @llvm.ctlz.i8(i8 %ld12, i1 -1)967 %ctlz13 = call i8 @llvm.ctlz.i8(i8 %ld13, i1 -1)968 %ctlz14 = call i8 @llvm.ctlz.i8(i8 %ld14, i1 -1)969 %ctlz15 = call i8 @llvm.ctlz.i8(i8 %ld15, i1 -1)970 store i8 %ctlz0 , ptr @dst8, align 1971 store i8 %ctlz1 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 1), align 1972 store i8 %ctlz2 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 2), align 1973 store i8 %ctlz3 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 3), align 1974 store i8 %ctlz4 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 4), align 1975 store i8 %ctlz5 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 5), align 1976 store i8 %ctlz6 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 6), align 1977 store i8 %ctlz7 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 7), align 1978 store i8 %ctlz8 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 8), align 1979 store i8 %ctlz9 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 9), align 1980 store i8 %ctlz10, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 10), align 1981 store i8 %ctlz11, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 11), align 1982 store i8 %ctlz12, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 12), align 1983 store i8 %ctlz13, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 13), align 1984 store i8 %ctlz14, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 14), align 1985 store i8 %ctlz15, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 15), align 1986 ret void987}988 989define void @ctlz_undef_32i8() #0 {990; SSE-LABEL: @ctlz_undef_32i8(991; SSE-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @src8, align 1992; SSE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> [[TMP1]], i1 true)993; SSE-NEXT: store <16 x i8> [[TMP2]], ptr @dst8, align 1994; SSE-NEXT: [[TMP3:%.*]] = load <16 x i8>, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 16), align 1995; SSE-NEXT: [[TMP4:%.*]] = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> [[TMP3]], i1 true)996; SSE-NEXT: store <16 x i8> [[TMP4]], ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 16), align 1997; SSE-NEXT: ret void998;999; AVX-LABEL: @ctlz_undef_32i8(1000; AVX-NEXT: [[TMP1:%.*]] = load <32 x i8>, ptr @src8, align 11001; AVX-NEXT: [[TMP2:%.*]] = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> [[TMP1]], i1 true)1002; AVX-NEXT: store <32 x i8> [[TMP2]], ptr @dst8, align 11003; AVX-NEXT: ret void1004;1005 %ld0 = load i8, ptr @src8, align 11006 %ld1 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 1), align 11007 %ld2 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 2), align 11008 %ld3 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 3), align 11009 %ld4 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 4), align 11010 %ld5 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 5), align 11011 %ld6 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 6), align 11012 %ld7 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 7), align 11013 %ld8 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 8), align 11014 %ld9 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 9), align 11015 %ld10 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 10), align 11016 %ld11 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 11), align 11017 %ld12 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 12), align 11018 %ld13 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 13), align 11019 %ld14 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 14), align 11020 %ld15 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 15), align 11021 %ld16 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 16), align 11022 %ld17 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 17), align 11023 %ld18 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 18), align 11024 %ld19 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 19), align 11025 %ld20 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 20), align 11026 %ld21 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 21), align 11027 %ld22 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 22), align 11028 %ld23 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 23), align 11029 %ld24 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 24), align 11030 %ld25 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 25), align 11031 %ld26 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 26), align 11032 %ld27 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 27), align 11033 %ld28 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 28), align 11034 %ld29 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 29), align 11035 %ld30 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 30), align 11036 %ld31 = load i8, ptr getelementptr inbounds ([32 x i8], ptr @src8, i8 0, i64 31), align 11037 %ctlz0 = call i8 @llvm.ctlz.i8(i8 %ld0, i1 -1)1038 %ctlz1 = call i8 @llvm.ctlz.i8(i8 %ld1, i1 -1)1039 %ctlz2 = call i8 @llvm.ctlz.i8(i8 %ld2, i1 -1)1040 %ctlz3 = call i8 @llvm.ctlz.i8(i8 %ld3, i1 -1)1041 %ctlz4 = call i8 @llvm.ctlz.i8(i8 %ld4, i1 -1)1042 %ctlz5 = call i8 @llvm.ctlz.i8(i8 %ld5, i1 -1)1043 %ctlz6 = call i8 @llvm.ctlz.i8(i8 %ld6, i1 -1)1044 %ctlz7 = call i8 @llvm.ctlz.i8(i8 %ld7, i1 -1)1045 %ctlz8 = call i8 @llvm.ctlz.i8(i8 %ld8, i1 -1)1046 %ctlz9 = call i8 @llvm.ctlz.i8(i8 %ld9, i1 -1)1047 %ctlz10 = call i8 @llvm.ctlz.i8(i8 %ld10, i1 -1)1048 %ctlz11 = call i8 @llvm.ctlz.i8(i8 %ld11, i1 -1)1049 %ctlz12 = call i8 @llvm.ctlz.i8(i8 %ld12, i1 -1)1050 %ctlz13 = call i8 @llvm.ctlz.i8(i8 %ld13, i1 -1)1051 %ctlz14 = call i8 @llvm.ctlz.i8(i8 %ld14, i1 -1)1052 %ctlz15 = call i8 @llvm.ctlz.i8(i8 %ld15, i1 -1)1053 %ctlz16 = call i8 @llvm.ctlz.i8(i8 %ld16, i1 -1)1054 %ctlz17 = call i8 @llvm.ctlz.i8(i8 %ld17, i1 -1)1055 %ctlz18 = call i8 @llvm.ctlz.i8(i8 %ld18, i1 -1)1056 %ctlz19 = call i8 @llvm.ctlz.i8(i8 %ld19, i1 -1)1057 %ctlz20 = call i8 @llvm.ctlz.i8(i8 %ld20, i1 -1)1058 %ctlz21 = call i8 @llvm.ctlz.i8(i8 %ld21, i1 -1)1059 %ctlz22 = call i8 @llvm.ctlz.i8(i8 %ld22, i1 -1)1060 %ctlz23 = call i8 @llvm.ctlz.i8(i8 %ld23, i1 -1)1061 %ctlz24 = call i8 @llvm.ctlz.i8(i8 %ld24, i1 -1)1062 %ctlz25 = call i8 @llvm.ctlz.i8(i8 %ld25, i1 -1)1063 %ctlz26 = call i8 @llvm.ctlz.i8(i8 %ld26, i1 -1)1064 %ctlz27 = call i8 @llvm.ctlz.i8(i8 %ld27, i1 -1)1065 %ctlz28 = call i8 @llvm.ctlz.i8(i8 %ld28, i1 -1)1066 %ctlz29 = call i8 @llvm.ctlz.i8(i8 %ld29, i1 -1)1067 %ctlz30 = call i8 @llvm.ctlz.i8(i8 %ld30, i1 -1)1068 %ctlz31 = call i8 @llvm.ctlz.i8(i8 %ld31, i1 -1)1069 store i8 %ctlz0 , ptr @dst8, align 11070 store i8 %ctlz1 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 1), align 11071 store i8 %ctlz2 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 2), align 11072 store i8 %ctlz3 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 3), align 11073 store i8 %ctlz4 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 4), align 11074 store i8 %ctlz5 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 5), align 11075 store i8 %ctlz6 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 6), align 11076 store i8 %ctlz7 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 7), align 11077 store i8 %ctlz8 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 8), align 11078 store i8 %ctlz9 , ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 9), align 11079 store i8 %ctlz10, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 10), align 11080 store i8 %ctlz11, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 11), align 11081 store i8 %ctlz12, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 12), align 11082 store i8 %ctlz13, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 13), align 11083 store i8 %ctlz14, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 14), align 11084 store i8 %ctlz15, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 15), align 11085 store i8 %ctlz16, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 16), align 11086 store i8 %ctlz17, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 17), align 11087 store i8 %ctlz18, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 18), align 11088 store i8 %ctlz19, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 19), align 11089 store i8 %ctlz20, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 20), align 11090 store i8 %ctlz21, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 21), align 11091 store i8 %ctlz22, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 22), align 11092 store i8 %ctlz23, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 23), align 11093 store i8 %ctlz24, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 24), align 11094 store i8 %ctlz25, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 25), align 11095 store i8 %ctlz26, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 26), align 11096 store i8 %ctlz27, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 27), align 11097 store i8 %ctlz28, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 28), align 11098 store i8 %ctlz29, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 29), align 11099 store i8 %ctlz30, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 30), align 11100 store i8 %ctlz31, ptr getelementptr inbounds ([32 x i8], ptr @dst8, i8 0, i64 31), align 11101 ret void1102}1103 1104attributes #0 = { nounwind }1105;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:1106; SSE2: {{.*}}1107; SSE4: {{.*}}1108