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