brintos

brintos / llvm-project-archived public Read only

0
0
Text · 30.3 KiB · f23043f Raw
602 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -mtriple=x86_64-- -passes=slp-vectorizer -S -mattr=+avx2 | FileCheck %s --check-prefix=CHECK3; RUN: opt < %s -mtriple=x86_64-- -passes=slp-vectorizer -S -mattr=+avx2 -mattr=+f16c | FileCheck %s --check-prefix=CHECK-F16C4; RUN: opt < %s -mtriple=x86_64-- -passes=slp-vectorizer -S -mattr=+avx512f | FileCheck %s --check-prefix=CHECK-AVX5125 6define void @fpext_v4xf16_v4xf32(ptr %s0, ptr %d0) {7; CHECK-LABEL: define void @fpext_v4xf16_v4xf32(8; CHECK-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0:[0-9]+]] {9; CHECK-NEXT:    [[S1:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 110; CHECK-NEXT:    [[S2:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 211; CHECK-NEXT:    [[S3:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 312; CHECK-NEXT:    [[L0:%.*]] = load half, ptr [[S0]], align 213; CHECK-NEXT:    [[L1:%.*]] = load half, ptr [[S1]], align 214; CHECK-NEXT:    [[L2:%.*]] = load half, ptr [[S2]], align 215; CHECK-NEXT:    [[L3:%.*]] = load half, ptr [[S3]], align 216; CHECK-NEXT:    [[E0:%.*]] = fpext half [[L0]] to float17; CHECK-NEXT:    [[E1:%.*]] = fpext half [[L1]] to float18; CHECK-NEXT:    [[E2:%.*]] = fpext half [[L2]] to float19; CHECK-NEXT:    [[E3:%.*]] = fpext half [[L3]] to float20; CHECK-NEXT:    [[D1:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 121; CHECK-NEXT:    [[D2:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 222; CHECK-NEXT:    [[D3:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 323; CHECK-NEXT:    store float [[E0]], ptr [[D0]], align 824; CHECK-NEXT:    store float [[E1]], ptr [[D1]], align 825; CHECK-NEXT:    store float [[E2]], ptr [[D2]], align 826; CHECK-NEXT:    store float [[E3]], ptr [[D3]], align 827; CHECK-NEXT:    ret void28;29; CHECK-F16C-LABEL: define void @fpext_v4xf16_v4xf32(30; CHECK-F16C-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0:[0-9]+]] {31; CHECK-F16C-NEXT:    [[TMP1:%.*]] = load <4 x half>, ptr [[S0]], align 232; CHECK-F16C-NEXT:    [[TMP2:%.*]] = fpext <4 x half> [[TMP1]] to <4 x float>33; CHECK-F16C-NEXT:    store <4 x float> [[TMP2]], ptr [[D0]], align 834; CHECK-F16C-NEXT:    ret void35;36; CHECK-AVX512-LABEL: define void @fpext_v4xf16_v4xf32(37; CHECK-AVX512-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0:[0-9]+]] {38; CHECK-AVX512-NEXT:    [[TMP1:%.*]] = load <4 x half>, ptr [[S0]], align 239; CHECK-AVX512-NEXT:    [[TMP2:%.*]] = fpext <4 x half> [[TMP1]] to <4 x float>40; CHECK-AVX512-NEXT:    store <4 x float> [[TMP2]], ptr [[D0]], align 841; CHECK-AVX512-NEXT:    ret void42;43  %s1 = getelementptr inbounds half, ptr %s0, i64 144  %s2 = getelementptr inbounds half, ptr %s0, i64 245  %s3 = getelementptr inbounds half, ptr %s0, i64 346  %l0 = load half, ptr %s0, align 247  %l1 = load half, ptr %s1, align 248  %l2 = load half, ptr %s2, align 249  %l3 = load half, ptr %s3, align 250 51  %e0 = fpext half %l0 to float52  %e1 = fpext half %l1 to float53  %e2 = fpext half %l2 to float54  %e3 = fpext half %l3 to float55 56  %d1 = getelementptr inbounds float, ptr %d0, i64 157  %d2 = getelementptr inbounds float, ptr %d0, i64 258  %d3 = getelementptr inbounds float, ptr %d0, i64 359  store float %e0, ptr %d0, align 860  store float %e1, ptr %d1, align 861  store float %e2, ptr %d2, align 862  store float %e3, ptr %d3, align 863  ret void64}65 66define void @fpext_v4xf16_v4xf64(ptr %s0, ptr %d0) {67; CHECK-LABEL: define void @fpext_v4xf16_v4xf64(68; CHECK-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {69; CHECK-NEXT:    [[S1:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 170; CHECK-NEXT:    [[S2:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 271; CHECK-NEXT:    [[S3:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 372; CHECK-NEXT:    [[L0:%.*]] = load half, ptr [[S0]], align 273; CHECK-NEXT:    [[L1:%.*]] = load half, ptr [[S1]], align 274; CHECK-NEXT:    [[L2:%.*]] = load half, ptr [[S2]], align 275; CHECK-NEXT:    [[L3:%.*]] = load half, ptr [[S3]], align 276; CHECK-NEXT:    [[E0:%.*]] = fpext half [[L0]] to double77; CHECK-NEXT:    [[E1:%.*]] = fpext half [[L1]] to double78; CHECK-NEXT:    [[E2:%.*]] = fpext half [[L2]] to double79; CHECK-NEXT:    [[E3:%.*]] = fpext half [[L3]] to double80; CHECK-NEXT:    [[D1:%.*]] = getelementptr inbounds double, ptr [[D0]], i64 181; CHECK-NEXT:    [[D2:%.*]] = getelementptr inbounds double, ptr [[D0]], i64 282; CHECK-NEXT:    [[D3:%.*]] = getelementptr inbounds double, ptr [[D0]], i64 383; CHECK-NEXT:    store double [[E0]], ptr [[D0]], align 884; CHECK-NEXT:    store double [[E1]], ptr [[D1]], align 885; CHECK-NEXT:    store double [[E2]], ptr [[D2]], align 886; CHECK-NEXT:    store double [[E3]], ptr [[D3]], align 887; CHECK-NEXT:    ret void88;89; CHECK-F16C-LABEL: define void @fpext_v4xf16_v4xf64(90; CHECK-F16C-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {91; CHECK-F16C-NEXT:    [[TMP1:%.*]] = load <4 x half>, ptr [[S0]], align 292; CHECK-F16C-NEXT:    [[TMP2:%.*]] = fpext <4 x half> [[TMP1]] to <4 x double>93; CHECK-F16C-NEXT:    store <4 x double> [[TMP2]], ptr [[D0]], align 894; CHECK-F16C-NEXT:    ret void95;96; CHECK-AVX512-LABEL: define void @fpext_v4xf16_v4xf64(97; CHECK-AVX512-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {98; CHECK-AVX512-NEXT:    [[TMP1:%.*]] = load <4 x half>, ptr [[S0]], align 299; CHECK-AVX512-NEXT:    [[TMP2:%.*]] = fpext <4 x half> [[TMP1]] to <4 x double>100; CHECK-AVX512-NEXT:    store <4 x double> [[TMP2]], ptr [[D0]], align 8101; CHECK-AVX512-NEXT:    ret void102;103  %s1 = getelementptr inbounds half, ptr %s0, i64 1104  %s2 = getelementptr inbounds half, ptr %s0, i64 2105  %s3 = getelementptr inbounds half, ptr %s0, i64 3106  %l0 = load half, ptr %s0, align 2107  %l1 = load half, ptr %s1, align 2108  %l2 = load half, ptr %s2, align 2109  %l3 = load half, ptr %s3, align 2110 111  %e0 = fpext half %l0 to double112  %e1 = fpext half %l1 to double113  %e2 = fpext half %l2 to double114  %e3 = fpext half %l3 to double115 116  %d1 = getelementptr inbounds double, ptr %d0, i64 1117  %d2 = getelementptr inbounds double, ptr %d0, i64 2118  %d3 = getelementptr inbounds double, ptr %d0, i64 3119  store double %e0, ptr %d0, align 8120  store double %e1, ptr %d1, align 8121  store double %e2, ptr %d2, align 8122  store double %e3, ptr %d3, align 8123  ret void124}125 126define void @fpext_v16xf16_v16xf32(ptr %s0, ptr %d0) {127; CHECK-LABEL: define void @fpext_v16xf16_v16xf32(128; CHECK-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {129; CHECK-NEXT:    [[S1:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 1130; CHECK-NEXT:    [[S2:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 2131; CHECK-NEXT:    [[S3:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 3132; CHECK-NEXT:    [[S4:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 4133; CHECK-NEXT:    [[S5:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 5134; CHECK-NEXT:    [[S6:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 6135; CHECK-NEXT:    [[S7:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 7136; CHECK-NEXT:    [[S8:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 8137; CHECK-NEXT:    [[S9:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 9138; CHECK-NEXT:    [[S10:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 10139; CHECK-NEXT:    [[S11:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 11140; CHECK-NEXT:    [[S12:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 12141; CHECK-NEXT:    [[S13:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 13142; CHECK-NEXT:    [[S14:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 14143; CHECK-NEXT:    [[S15:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 15144; CHECK-NEXT:    [[L0:%.*]] = load half, ptr [[S0]], align 2145; CHECK-NEXT:    [[L1:%.*]] = load half, ptr [[S1]], align 2146; CHECK-NEXT:    [[L2:%.*]] = load half, ptr [[S2]], align 2147; CHECK-NEXT:    [[L3:%.*]] = load half, ptr [[S3]], align 2148; CHECK-NEXT:    [[L4:%.*]] = load half, ptr [[S4]], align 2149; CHECK-NEXT:    [[L5:%.*]] = load half, ptr [[S5]], align 2150; CHECK-NEXT:    [[L6:%.*]] = load half, ptr [[S6]], align 2151; CHECK-NEXT:    [[L7:%.*]] = load half, ptr [[S7]], align 2152; CHECK-NEXT:    [[L8:%.*]] = load half, ptr [[S8]], align 2153; CHECK-NEXT:    [[L9:%.*]] = load half, ptr [[S9]], align 2154; CHECK-NEXT:    [[L10:%.*]] = load half, ptr [[S10]], align 2155; CHECK-NEXT:    [[L11:%.*]] = load half, ptr [[S11]], align 2156; CHECK-NEXT:    [[L12:%.*]] = load half, ptr [[S12]], align 2157; CHECK-NEXT:    [[L13:%.*]] = load half, ptr [[S13]], align 2158; CHECK-NEXT:    [[L14:%.*]] = load half, ptr [[S14]], align 2159; CHECK-NEXT:    [[L15:%.*]] = load half, ptr [[S15]], align 2160; CHECK-NEXT:    [[E0:%.*]] = fpext half [[L0]] to float161; CHECK-NEXT:    [[E1:%.*]] = fpext half [[L1]] to float162; CHECK-NEXT:    [[E2:%.*]] = fpext half [[L2]] to float163; CHECK-NEXT:    [[E3:%.*]] = fpext half [[L3]] to float164; CHECK-NEXT:    [[E4:%.*]] = fpext half [[L4]] to float165; CHECK-NEXT:    [[E5:%.*]] = fpext half [[L5]] to float166; CHECK-NEXT:    [[E6:%.*]] = fpext half [[L6]] to float167; CHECK-NEXT:    [[E7:%.*]] = fpext half [[L7]] to float168; CHECK-NEXT:    [[E8:%.*]] = fpext half [[L8]] to float169; CHECK-NEXT:    [[E9:%.*]] = fpext half [[L9]] to float170; CHECK-NEXT:    [[E10:%.*]] = fpext half [[L10]] to float171; CHECK-NEXT:    [[E11:%.*]] = fpext half [[L11]] to float172; CHECK-NEXT:    [[E12:%.*]] = fpext half [[L12]] to float173; CHECK-NEXT:    [[E13:%.*]] = fpext half [[L13]] to float174; CHECK-NEXT:    [[E14:%.*]] = fpext half [[L14]] to float175; CHECK-NEXT:    [[E15:%.*]] = fpext half [[L15]] to float176; CHECK-NEXT:    [[D1:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 1177; CHECK-NEXT:    [[D2:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 2178; CHECK-NEXT:    [[D15:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 3179; CHECK-NEXT:    [[D4:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 4180; CHECK-NEXT:    [[D5:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 5181; CHECK-NEXT:    [[D6:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 6182; CHECK-NEXT:    [[D7:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 7183; CHECK-NEXT:    [[D8:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 8184; CHECK-NEXT:    [[D9:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 9185; CHECK-NEXT:    [[D10:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 10186; CHECK-NEXT:    [[D11:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 11187; CHECK-NEXT:    [[D12:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 12188; CHECK-NEXT:    [[D13:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 13189; CHECK-NEXT:    [[D14:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 14190; CHECK-NEXT:    [[D16:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 15191; CHECK-NEXT:    store float [[E0]], ptr [[D0]], align 8192; CHECK-NEXT:    store float [[E1]], ptr [[D1]], align 8193; CHECK-NEXT:    store float [[E2]], ptr [[D2]], align 8194; CHECK-NEXT:    store float [[E3]], ptr [[D15]], align 8195; CHECK-NEXT:    store float [[E4]], ptr [[D4]], align 8196; CHECK-NEXT:    store float [[E5]], ptr [[D5]], align 8197; CHECK-NEXT:    store float [[E6]], ptr [[D6]], align 8198; CHECK-NEXT:    store float [[E7]], ptr [[D7]], align 8199; CHECK-NEXT:    store float [[E8]], ptr [[D8]], align 8200; CHECK-NEXT:    store float [[E9]], ptr [[D9]], align 8201; CHECK-NEXT:    store float [[E10]], ptr [[D10]], align 8202; CHECK-NEXT:    store float [[E11]], ptr [[D11]], align 8203; CHECK-NEXT:    store float [[E12]], ptr [[D12]], align 8204; CHECK-NEXT:    store float [[E13]], ptr [[D13]], align 8205; CHECK-NEXT:    store float [[E14]], ptr [[D14]], align 8206; CHECK-NEXT:    store float [[E15]], ptr [[D16]], align 8207; CHECK-NEXT:    ret void208;209; CHECK-F16C-LABEL: define void @fpext_v16xf16_v16xf32(210; CHECK-F16C-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {211; CHECK-F16C-NEXT:    [[S8:%.*]] = getelementptr inbounds half, ptr [[S0]], i64 8212; CHECK-F16C-NEXT:    [[D8:%.*]] = getelementptr inbounds float, ptr [[D0]], i64 8213; CHECK-F16C-NEXT:    [[TMP1:%.*]] = load <8 x half>, ptr [[S0]], align 2214; CHECK-F16C-NEXT:    [[TMP2:%.*]] = fpext <8 x half> [[TMP1]] to <8 x float>215; CHECK-F16C-NEXT:    [[TMP3:%.*]] = load <8 x half>, ptr [[S8]], align 2216; CHECK-F16C-NEXT:    [[TMP4:%.*]] = fpext <8 x half> [[TMP3]] to <8 x float>217; CHECK-F16C-NEXT:    store <8 x float> [[TMP2]], ptr [[D0]], align 8218; CHECK-F16C-NEXT:    store <8 x float> [[TMP4]], ptr [[D8]], align 8219; CHECK-F16C-NEXT:    ret void220;221; CHECK-AVX512-LABEL: define void @fpext_v16xf16_v16xf32(222; CHECK-AVX512-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {223; CHECK-AVX512-NEXT:    [[TMP1:%.*]] = load <16 x half>, ptr [[S0]], align 2224; CHECK-AVX512-NEXT:    [[TMP2:%.*]] = fpext <16 x half> [[TMP1]] to <16 x float>225; CHECK-AVX512-NEXT:    store <16 x float> [[TMP2]], ptr [[D0]], align 8226; CHECK-AVX512-NEXT:    ret void227;228  %s1 = getelementptr inbounds half, ptr %s0, i64 1229  %s2 = getelementptr inbounds half, ptr %s0, i64 2230  %s3 = getelementptr inbounds half, ptr %s0, i64 3231  %s4 = getelementptr inbounds half, ptr %s0, i64 4232  %s5 = getelementptr inbounds half, ptr %s0, i64 5233  %s6 = getelementptr inbounds half, ptr %s0, i64 6234  %s7 = getelementptr inbounds half, ptr %s0, i64 7235  %s8 = getelementptr inbounds half, ptr %s0, i64 8236  %s9 = getelementptr inbounds half, ptr %s0, i64 9237  %s10 = getelementptr inbounds half, ptr %s0, i64 10238  %s11 = getelementptr inbounds half, ptr %s0, i64 11239  %s12 = getelementptr inbounds half, ptr %s0, i64 12240  %s13 = getelementptr inbounds half, ptr %s0, i64 13241  %s14 = getelementptr inbounds half, ptr %s0, i64 14242  %s15 = getelementptr inbounds half, ptr %s0, i64 15243  %l0 = load half, ptr %s0, align 2244  %l1 = load half, ptr %s1, align 2245  %l2 = load half, ptr %s2, align 2246  %l3 = load half, ptr %s3, align 2247  %l4 = load half, ptr %s4, align 2248  %l5 = load half, ptr %s5, align 2249  %l6 = load half, ptr %s6, align 2250  %l7 = load half, ptr %s7, align 2251  %l8 = load half, ptr %s8, align 2252  %l9 = load half, ptr %s9, align 2253  %l10 = load half, ptr %s10, align 2254  %l11 = load half, ptr %s11, align 2255  %l12 = load half, ptr %s12, align 2256  %l13 = load half, ptr %s13, align 2257  %l14 = load half, ptr %s14, align 2258  %l15 = load half, ptr %s15, align 2259 260  %e0 = fpext half %l0 to float261  %e1 = fpext half %l1 to float262  %e2 = fpext half %l2 to float263  %e3 = fpext half %l3 to float264  %e4 = fpext half %l4 to float265  %e5 = fpext half %l5 to float266  %e6 = fpext half %l6 to float267  %e7 = fpext half %l7 to float268  %e8 = fpext half %l8 to float269  %e9 = fpext half %l9 to float270  %e10 = fpext half %l10 to float271  %e11 = fpext half %l11 to float272  %e12 = fpext half %l12 to float273  %e13 = fpext half %l13 to float274  %e14 = fpext half %l14 to float275  %e15 = fpext half %l15 to float276 277  %d1 = getelementptr inbounds float, ptr %d0, i64 1278  %d2 = getelementptr inbounds float, ptr %d0, i64 2279  %d3 = getelementptr inbounds float, ptr %d0, i64 3280  %d4 = getelementptr inbounds float, ptr %d0, i64 4281  %d5 = getelementptr inbounds float, ptr %d0, i64 5282  %d6 = getelementptr inbounds float, ptr %d0, i64 6283  %d7 = getelementptr inbounds float, ptr %d0, i64 7284  %d8 = getelementptr inbounds float, ptr %d0, i64 8285  %d9 = getelementptr inbounds float, ptr %d0, i64 9286  %d10 = getelementptr inbounds float, ptr %d0, i64 10287  %d11 = getelementptr inbounds float, ptr %d0, i64 11288  %d12 = getelementptr inbounds float, ptr %d0, i64 12289  %d13 = getelementptr inbounds float, ptr %d0, i64 13290  %d14 = getelementptr inbounds float, ptr %d0, i64 14291  %d15 = getelementptr inbounds float, ptr %d0, i64 15292  store float %e0, ptr %d0, align 8293  store float %e1, ptr %d1, align 8294  store float %e2, ptr %d2, align 8295  store float %e3, ptr %d3, align 8296  store float %e4, ptr %d4, align 8297  store float %e5, ptr %d5, align 8298  store float %e6, ptr %d6, align 8299  store float %e7, ptr %d7, align 8300  store float %e8, ptr %d8, align 8301  store float %e9, ptr %d9, align 8302  store float %e10, ptr %d10, align 8303  store float %e11, ptr %d11, align 8304  store float %e12, ptr %d12, align 8305  store float %e13, ptr %d13, align 8306  store float %e14, ptr %d14, align 8307  store float %e15, ptr %d15, align 8308  ret void309}310 311define void @fpround_v4xf32_v4xf16(ptr %s0, ptr %d0) {312; CHECK-LABEL: define void @fpround_v4xf32_v4xf16(313; CHECK-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {314; CHECK-NEXT:    [[S1:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 1315; CHECK-NEXT:    [[S2:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 2316; CHECK-NEXT:    [[S3:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 3317; CHECK-NEXT:    [[L0:%.*]] = load float, ptr [[S0]], align 4318; CHECK-NEXT:    [[L1:%.*]] = load float, ptr [[S1]], align 4319; CHECK-NEXT:    [[L2:%.*]] = load float, ptr [[S2]], align 4320; CHECK-NEXT:    [[L3:%.*]] = load float, ptr [[S3]], align 4321; CHECK-NEXT:    [[T0:%.*]] = fptrunc float [[L0]] to half322; CHECK-NEXT:    [[T1:%.*]] = fptrunc float [[L1]] to half323; CHECK-NEXT:    [[T2:%.*]] = fptrunc float [[L2]] to half324; CHECK-NEXT:    [[T3:%.*]] = fptrunc float [[L3]] to half325; CHECK-NEXT:    [[D1:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 1326; CHECK-NEXT:    [[D2:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 2327; CHECK-NEXT:    [[D3:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 3328; CHECK-NEXT:    store half [[T0]], ptr [[D0]], align 2329; CHECK-NEXT:    store half [[T1]], ptr [[D1]], align 2330; CHECK-NEXT:    store half [[T2]], ptr [[D2]], align 2331; CHECK-NEXT:    store half [[T3]], ptr [[D3]], align 2332; CHECK-NEXT:    ret void333;334; CHECK-F16C-LABEL: define void @fpround_v4xf32_v4xf16(335; CHECK-F16C-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {336; CHECK-F16C-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr [[S0]], align 4337; CHECK-F16C-NEXT:    [[TMP2:%.*]] = fptrunc <4 x float> [[TMP1]] to <4 x half>338; CHECK-F16C-NEXT:    store <4 x half> [[TMP2]], ptr [[D0]], align 2339; CHECK-F16C-NEXT:    ret void340;341; CHECK-AVX512-LABEL: define void @fpround_v4xf32_v4xf16(342; CHECK-AVX512-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {343; CHECK-AVX512-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr [[S0]], align 4344; CHECK-AVX512-NEXT:    [[TMP2:%.*]] = fptrunc <4 x float> [[TMP1]] to <4 x half>345; CHECK-AVX512-NEXT:    store <4 x half> [[TMP2]], ptr [[D0]], align 2346; CHECK-AVX512-NEXT:    ret void347;348  %s1 = getelementptr inbounds float, ptr %s0, i64 1349  %s2 = getelementptr inbounds float, ptr %s0, i64 2350  %s3 = getelementptr inbounds float, ptr %s0, i64 3351  %l0 = load float, ptr %s0, align 4352  %l1 = load float, ptr %s1, align 4353  %l2 = load float, ptr %s2, align 4354  %l3 = load float, ptr %s3, align 4355 356  %t0 = fptrunc float %l0 to half357  %t1 = fptrunc float %l1 to half358  %t2 = fptrunc float %l2 to half359  %t3 = fptrunc float %l3 to half360 361  %d1 = getelementptr inbounds half, ptr %d0, i64 1362  %d2 = getelementptr inbounds half, ptr %d0, i64 2363  %d3 = getelementptr inbounds half, ptr %d0, i64 3364  store half %t0, ptr %d0, align 2365  store half %t1, ptr %d1, align 2366  store half %t2, ptr %d2, align 2367  store half %t3, ptr %d3, align 2368  ret void369}370 371define void @fpround_v16xf32_v16xf16(ptr %s0, ptr %d0) {372; CHECK-LABEL: define void @fpround_v16xf32_v16xf16(373; CHECK-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {374; CHECK-NEXT:    [[S1:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 1375; CHECK-NEXT:    [[S2:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 2376; CHECK-NEXT:    [[S3:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 3377; CHECK-NEXT:    [[S4:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 4378; CHECK-NEXT:    [[S5:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 5379; CHECK-NEXT:    [[S6:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 6380; CHECK-NEXT:    [[S7:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 7381; CHECK-NEXT:    [[S8:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 8382; CHECK-NEXT:    [[S9:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 9383; CHECK-NEXT:    [[S10:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 10384; CHECK-NEXT:    [[S11:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 11385; CHECK-NEXT:    [[S12:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 12386; CHECK-NEXT:    [[S13:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 13387; CHECK-NEXT:    [[S14:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 14388; CHECK-NEXT:    [[S15:%.*]] = getelementptr inbounds float, ptr [[S0]], i64 15389; CHECK-NEXT:    [[L0:%.*]] = load float, ptr [[S0]], align 4390; CHECK-NEXT:    [[L1:%.*]] = load float, ptr [[S1]], align 4391; CHECK-NEXT:    [[L2:%.*]] = load float, ptr [[S2]], align 4392; CHECK-NEXT:    [[L3:%.*]] = load float, ptr [[S3]], align 4393; CHECK-NEXT:    [[L4:%.*]] = load float, ptr [[S4]], align 4394; CHECK-NEXT:    [[L5:%.*]] = load float, ptr [[S5]], align 4395; CHECK-NEXT:    [[L6:%.*]] = load float, ptr [[S6]], align 4396; CHECK-NEXT:    [[L7:%.*]] = load float, ptr [[S7]], align 4397; CHECK-NEXT:    [[L8:%.*]] = load float, ptr [[S8]], align 4398; CHECK-NEXT:    [[L9:%.*]] = load float, ptr [[S9]], align 4399; CHECK-NEXT:    [[L10:%.*]] = load float, ptr [[S10]], align 4400; CHECK-NEXT:    [[L11:%.*]] = load float, ptr [[S11]], align 4401; CHECK-NEXT:    [[L12:%.*]] = load float, ptr [[S12]], align 4402; CHECK-NEXT:    [[L13:%.*]] = load float, ptr [[S13]], align 4403; CHECK-NEXT:    [[L14:%.*]] = load float, ptr [[S14]], align 4404; CHECK-NEXT:    [[L15:%.*]] = load float, ptr [[S15]], align 4405; CHECK-NEXT:    [[T0:%.*]] = fptrunc float [[L0]] to half406; CHECK-NEXT:    [[T1:%.*]] = fptrunc float [[L1]] to half407; CHECK-NEXT:    [[T2:%.*]] = fptrunc float [[L2]] to half408; CHECK-NEXT:    [[T3:%.*]] = fptrunc float [[L3]] to half409; CHECK-NEXT:    [[T4:%.*]] = fptrunc float [[L4]] to half410; CHECK-NEXT:    [[T5:%.*]] = fptrunc float [[L5]] to half411; CHECK-NEXT:    [[T6:%.*]] = fptrunc float [[L6]] to half412; CHECK-NEXT:    [[T7:%.*]] = fptrunc float [[L7]] to half413; CHECK-NEXT:    [[T8:%.*]] = fptrunc float [[L8]] to half414; CHECK-NEXT:    [[T9:%.*]] = fptrunc float [[L9]] to half415; CHECK-NEXT:    [[T10:%.*]] = fptrunc float [[L10]] to half416; CHECK-NEXT:    [[T11:%.*]] = fptrunc float [[L11]] to half417; CHECK-NEXT:    [[T12:%.*]] = fptrunc float [[L12]] to half418; CHECK-NEXT:    [[T13:%.*]] = fptrunc float [[L13]] to half419; CHECK-NEXT:    [[T14:%.*]] = fptrunc float [[L14]] to half420; CHECK-NEXT:    [[T15:%.*]] = fptrunc float [[L15]] to half421; CHECK-NEXT:    [[D1:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 1422; CHECK-NEXT:    [[D2:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 2423; CHECK-NEXT:    [[D3:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 3424; CHECK-NEXT:    [[D4:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 4425; CHECK-NEXT:    [[D5:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 5426; CHECK-NEXT:    [[D6:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 6427; CHECK-NEXT:    [[D7:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 7428; CHECK-NEXT:    [[D8:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 8429; CHECK-NEXT:    [[D9:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 9430; CHECK-NEXT:    [[D10:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 10431; CHECK-NEXT:    [[D11:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 11432; CHECK-NEXT:    [[D12:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 12433; CHECK-NEXT:    [[D13:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 13434; CHECK-NEXT:    [[D14:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 14435; CHECK-NEXT:    [[D15:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 15436; CHECK-NEXT:    store half [[T0]], ptr [[D0]], align 2437; CHECK-NEXT:    store half [[T1]], ptr [[D1]], align 2438; CHECK-NEXT:    store half [[T2]], ptr [[D2]], align 2439; CHECK-NEXT:    store half [[T3]], ptr [[D3]], align 2440; CHECK-NEXT:    store half [[T4]], ptr [[D4]], align 2441; CHECK-NEXT:    store half [[T5]], ptr [[D5]], align 2442; CHECK-NEXT:    store half [[T6]], ptr [[D6]], align 2443; CHECK-NEXT:    store half [[T7]], ptr [[D7]], align 2444; CHECK-NEXT:    store half [[T8]], ptr [[D8]], align 2445; CHECK-NEXT:    store half [[T9]], ptr [[D9]], align 2446; CHECK-NEXT:    store half [[T10]], ptr [[D10]], align 2447; CHECK-NEXT:    store half [[T11]], ptr [[D11]], align 2448; CHECK-NEXT:    store half [[T12]], ptr [[D12]], align 2449; CHECK-NEXT:    store half [[T13]], ptr [[D13]], align 2450; CHECK-NEXT:    store half [[T14]], ptr [[D14]], align 2451; CHECK-NEXT:    store half [[T15]], ptr [[D15]], align 2452; CHECK-NEXT:    ret void453;454; CHECK-F16C-LABEL: define void @fpround_v16xf32_v16xf16(455; CHECK-F16C-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {456; CHECK-F16C-NEXT:    [[TMP1:%.*]] = load <16 x float>, ptr [[S0]], align 4457; CHECK-F16C-NEXT:    [[TMP2:%.*]] = fptrunc <16 x float> [[TMP1]] to <16 x half>458; CHECK-F16C-NEXT:    store <16 x half> [[TMP2]], ptr [[D0]], align 2459; CHECK-F16C-NEXT:    ret void460;461; CHECK-AVX512-LABEL: define void @fpround_v16xf32_v16xf16(462; CHECK-AVX512-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {463; CHECK-AVX512-NEXT:    [[TMP1:%.*]] = load <16 x float>, ptr [[S0]], align 4464; CHECK-AVX512-NEXT:    [[TMP2:%.*]] = fptrunc <16 x float> [[TMP1]] to <16 x half>465; CHECK-AVX512-NEXT:    store <16 x half> [[TMP2]], ptr [[D0]], align 2466; CHECK-AVX512-NEXT:    ret void467;468  %s1 = getelementptr inbounds float, ptr %s0, i64 1469  %s2 = getelementptr inbounds float, ptr %s0, i64 2470  %s3 = getelementptr inbounds float, ptr %s0, i64 3471  %s4 = getelementptr inbounds float, ptr %s0, i64 4472  %s5 = getelementptr inbounds float, ptr %s0, i64 5473  %s6 = getelementptr inbounds float, ptr %s0, i64 6474  %s7 = getelementptr inbounds float, ptr %s0, i64 7475  %s8 = getelementptr inbounds float, ptr %s0, i64 8476  %s9 = getelementptr inbounds float, ptr %s0, i64 9477  %s10 = getelementptr inbounds float, ptr %s0, i64 10478  %s11 = getelementptr inbounds float, ptr %s0, i64 11479  %s12 = getelementptr inbounds float, ptr %s0, i64 12480  %s13 = getelementptr inbounds float, ptr %s0, i64 13481  %s14 = getelementptr inbounds float, ptr %s0, i64 14482  %s15 = getelementptr inbounds float, ptr %s0, i64 15483  %l0 = load float, ptr %s0, align 4484  %l1 = load float, ptr %s1, align 4485  %l2 = load float, ptr %s2, align 4486  %l3 = load float, ptr %s3, align 4487  %l4 = load float, ptr %s4, align 4488  %l5 = load float, ptr %s5, align 4489  %l6 = load float, ptr %s6, align 4490  %l7 = load float, ptr %s7, align 4491  %l8 = load float, ptr %s8, align 4492  %l9 = load float, ptr %s9, align 4493  %l10 = load float, ptr %s10, align 4494  %l11 = load float, ptr %s11, align 4495  %l12 = load float, ptr %s12, align 4496  %l13 = load float, ptr %s13, align 4497  %l14 = load float, ptr %s14, align 4498  %l15 = load float, ptr %s15, align 4499 500  %t0 = fptrunc float %l0 to half501  %t1 = fptrunc float %l1 to half502  %t2 = fptrunc float %l2 to half503  %t3 = fptrunc float %l3 to half504  %t4 = fptrunc float %l4 to half505  %t5 = fptrunc float %l5 to half506  %t6 = fptrunc float %l6 to half507  %t7 = fptrunc float %l7 to half508  %t8 = fptrunc float %l8 to half509  %t9 = fptrunc float %l9 to half510  %t10 = fptrunc float %l10 to half511  %t11 = fptrunc float %l11 to half512  %t12 = fptrunc float %l12 to half513  %t13 = fptrunc float %l13 to half514  %t14 = fptrunc float %l14 to half515  %t15 = fptrunc float %l15 to half516 517  %d1 = getelementptr inbounds half, ptr %d0, i64 1518  %d2 = getelementptr inbounds half, ptr %d0, i64 2519  %d3 = getelementptr inbounds half, ptr %d0, i64 3520  %d4 = getelementptr inbounds half, ptr %d0, i64 4521  %d5 = getelementptr inbounds half, ptr %d0, i64 5522  %d6 = getelementptr inbounds half, ptr %d0, i64 6523  %d7 = getelementptr inbounds half, ptr %d0, i64 7524  %d8 = getelementptr inbounds half, ptr %d0, i64 8525  %d9 = getelementptr inbounds half, ptr %d0, i64 9526  %d10 = getelementptr inbounds half, ptr %d0, i64 10527  %d11 = getelementptr inbounds half, ptr %d0, i64 11528  %d12 = getelementptr inbounds half, ptr %d0, i64 12529  %d13 = getelementptr inbounds half, ptr %d0, i64 13530  %d14 = getelementptr inbounds half, ptr %d0, i64 14531  %d15 = getelementptr inbounds half, ptr %d0, i64 15532  store half %t0, ptr %d0, align 2533  store half %t1, ptr %d1, align 2534  store half %t2, ptr %d2, align 2535  store half %t3, ptr %d3, align 2536  store half %t4, ptr %d4, align 2537  store half %t5, ptr %d5, align 2538  store half %t6, ptr %d6, align 2539  store half %t7, ptr %d7, align 2540  store half %t8, ptr %d8, align 2541  store half %t9, ptr %d9, align 2542  store half %t10, ptr %d10, align 2543  store half %t11, ptr %d11, align 2544  store half %t12, ptr %d12, align 2545  store half %t13, ptr %d13, align 2546  store half %t14, ptr %d14, align 2547  store half %t15, ptr %d15, align 2548  ret void549 550}551 552; There is no instruction to round f64 to f16; this should not get vectorized!553define void @fpround_v2xf64_v2xf16(ptr %s0, ptr %d0) {554; CHECK-LABEL: define void @fpround_v2xf64_v2xf16(555; CHECK-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {556; CHECK-NEXT:    [[S1:%.*]] = getelementptr inbounds double, ptr [[S0]], i64 1557; CHECK-NEXT:    [[L0:%.*]] = load double, ptr [[S0]], align 4558; CHECK-NEXT:    [[L1:%.*]] = load double, ptr [[S1]], align 4559; CHECK-NEXT:    [[T0:%.*]] = fptrunc double [[L0]] to half560; CHECK-NEXT:    [[T1:%.*]] = fptrunc double [[L1]] to half561; CHECK-NEXT:    [[D1:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 1562; CHECK-NEXT:    store half [[T0]], ptr [[D0]], align 2563; CHECK-NEXT:    store half [[T1]], ptr [[D1]], align 2564; CHECK-NEXT:    ret void565;566; CHECK-F16C-LABEL: define void @fpround_v2xf64_v2xf16(567; CHECK-F16C-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {568; CHECK-F16C-NEXT:    [[S1:%.*]] = getelementptr inbounds double, ptr [[S0]], i64 1569; CHECK-F16C-NEXT:    [[L0:%.*]] = load double, ptr [[S0]], align 4570; CHECK-F16C-NEXT:    [[L1:%.*]] = load double, ptr [[S1]], align 4571; CHECK-F16C-NEXT:    [[T0:%.*]] = fptrunc double [[L0]] to half572; CHECK-F16C-NEXT:    [[T1:%.*]] = fptrunc double [[L1]] to half573; CHECK-F16C-NEXT:    [[D1:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 1574; CHECK-F16C-NEXT:    store half [[T0]], ptr [[D0]], align 2575; CHECK-F16C-NEXT:    store half [[T1]], ptr [[D1]], align 2576; CHECK-F16C-NEXT:    ret void577;578; CHECK-AVX512-LABEL: define void @fpround_v2xf64_v2xf16(579; CHECK-AVX512-SAME: ptr [[S0:%.*]], ptr [[D0:%.*]]) #[[ATTR0]] {580; CHECK-AVX512-NEXT:    [[S1:%.*]] = getelementptr inbounds double, ptr [[S0]], i64 1581; CHECK-AVX512-NEXT:    [[L0:%.*]] = load double, ptr [[S0]], align 4582; CHECK-AVX512-NEXT:    [[L1:%.*]] = load double, ptr [[S1]], align 4583; CHECK-AVX512-NEXT:    [[T0:%.*]] = fptrunc double [[L0]] to half584; CHECK-AVX512-NEXT:    [[T1:%.*]] = fptrunc double [[L1]] to half585; CHECK-AVX512-NEXT:    [[D1:%.*]] = getelementptr inbounds half, ptr [[D0]], i64 1586; CHECK-AVX512-NEXT:    store half [[T0]], ptr [[D0]], align 2587; CHECK-AVX512-NEXT:    store half [[T1]], ptr [[D1]], align 2588; CHECK-AVX512-NEXT:    ret void589;590  %s1 = getelementptr inbounds double, ptr %s0, i64 1591  %l0 = load double, ptr %s0, align 4592  %l1 = load double, ptr %s1, align 4593 594  %t0 = fptrunc double %l0 to half595  %t1 = fptrunc double %l1 to half596 597  %d1 = getelementptr inbounds half, ptr %d0, i64 1598  store half %t0, ptr %d0, align 2599  store half %t1, ptr %d1, align 2600  ret void601}602