1317 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt %s -passes='function(scalarizer<load-store;min-bits=16>,dce)' -S | FileCheck %s --check-prefixes=CHECK,MIN163; RUN: opt %s -passes='function(scalarizer<load-store;min-bits=32>,dce)' -S | FileCheck %s --check-prefixes=CHECK,MIN324; RUN: opt %s -passes='function(scalarizer<load-store;min-bits=64>,dce)' -S | FileCheck %s --check-prefixes=CHECK,MIN645target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"6 7define void @load_add_store_v2i16(ptr %pa, ptr %pb) {8; MIN16-LABEL: @load_add_store_v2i16(9; MIN16-NEXT: [[PB_I1:%.*]] = getelementptr i16, ptr [[PB:%.*]], i32 110; MIN16-NEXT: [[A_I0:%.*]] = load i16, ptr [[PA:%.*]], align 811; MIN16-NEXT: [[PA_I1:%.*]] = getelementptr i16, ptr [[PA]], i32 112; MIN16-NEXT: [[A_I1:%.*]] = load i16, ptr [[PA_I1]], align 213; MIN16-NEXT: [[B_I0:%.*]] = load i16, ptr [[PB]], align 814; MIN16-NEXT: [[B_I1:%.*]] = load i16, ptr [[PB_I1]], align 215; MIN16-NEXT: [[C_I0:%.*]] = add i16 [[A_I0]], [[B_I0]]16; MIN16-NEXT: [[C_I1:%.*]] = add i16 [[A_I1]], [[B_I1]]17; MIN16-NEXT: store i16 [[C_I0]], ptr [[PA]], align 818; MIN16-NEXT: store i16 [[C_I1]], ptr [[PA_I1]], align 219; MIN16-NEXT: ret void20;21; MIN32-LABEL: @load_add_store_v2i16(22; MIN32-NEXT: [[A:%.*]] = load <2 x i16>, ptr [[PA:%.*]], align 823; MIN32-NEXT: [[B:%.*]] = load <2 x i16>, ptr [[PB:%.*]], align 824; MIN32-NEXT: [[C:%.*]] = add <2 x i16> [[A]], [[B]]25; MIN32-NEXT: store <2 x i16> [[C]], ptr [[PA]], align 826; MIN32-NEXT: ret void27;28; MIN64-LABEL: @load_add_store_v2i16(29; MIN64-NEXT: [[A:%.*]] = load <2 x i16>, ptr [[PA:%.*]], align 830; MIN64-NEXT: [[B:%.*]] = load <2 x i16>, ptr [[PB:%.*]], align 831; MIN64-NEXT: [[C:%.*]] = add <2 x i16> [[A]], [[B]]32; MIN64-NEXT: store <2 x i16> [[C]], ptr [[PA]], align 833; MIN64-NEXT: ret void34;35 %a = load <2 x i16>, ptr %pa, align 836 %b = load <2 x i16>, ptr %pb, align 837 %c = add <2 x i16> %a, %b38 store <2 x i16> %c, ptr %pa, align 839 ret void40}41 42define void @load_add_store_v3i16(ptr %pa, ptr %pb) {43; MIN16-LABEL: @load_add_store_v3i16(44; MIN16-NEXT: [[PB_I1:%.*]] = getelementptr i16, ptr [[PB:%.*]], i32 145; MIN16-NEXT: [[PB_I2:%.*]] = getelementptr i16, ptr [[PB]], i32 246; MIN16-NEXT: [[A_I0:%.*]] = load i16, ptr [[PA:%.*]], align 847; MIN16-NEXT: [[PA_I1:%.*]] = getelementptr i16, ptr [[PA]], i32 148; MIN16-NEXT: [[A_I1:%.*]] = load i16, ptr [[PA_I1]], align 249; MIN16-NEXT: [[PA_I2:%.*]] = getelementptr i16, ptr [[PA]], i32 250; MIN16-NEXT: [[A_I2:%.*]] = load i16, ptr [[PA_I2]], align 451; MIN16-NEXT: [[B_I0:%.*]] = load i16, ptr [[PB]], align 852; MIN16-NEXT: [[B_I1:%.*]] = load i16, ptr [[PB_I1]], align 253; MIN16-NEXT: [[B_I2:%.*]] = load i16, ptr [[PB_I2]], align 454; MIN16-NEXT: [[C_I0:%.*]] = add i16 [[A_I0]], [[B_I0]]55; MIN16-NEXT: [[C_I1:%.*]] = add i16 [[A_I1]], [[B_I1]]56; MIN16-NEXT: [[C_I2:%.*]] = add i16 [[A_I2]], [[B_I2]]57; MIN16-NEXT: store i16 [[C_I0]], ptr [[PA]], align 858; MIN16-NEXT: store i16 [[C_I1]], ptr [[PA_I1]], align 259; MIN16-NEXT: store i16 [[C_I2]], ptr [[PA_I2]], align 460; MIN16-NEXT: ret void61;62; MIN32-LABEL: @load_add_store_v3i16(63; MIN32-NEXT: [[PB_I1:%.*]] = getelementptr <2 x i16>, ptr [[PB:%.*]], i32 164; MIN32-NEXT: [[A_I0:%.*]] = load <2 x i16>, ptr [[PA:%.*]], align 865; MIN32-NEXT: [[PA_I1:%.*]] = getelementptr <2 x i16>, ptr [[PA]], i32 166; MIN32-NEXT: [[A_I1:%.*]] = load i16, ptr [[PA_I1]], align 467; MIN32-NEXT: [[B_I0:%.*]] = load <2 x i16>, ptr [[PB]], align 868; MIN32-NEXT: [[B_I1:%.*]] = load i16, ptr [[PB_I1]], align 469; MIN32-NEXT: [[C_I0:%.*]] = add <2 x i16> [[A_I0]], [[B_I0]]70; MIN32-NEXT: [[C_I1:%.*]] = add i16 [[A_I1]], [[B_I1]]71; MIN32-NEXT: store <2 x i16> [[C_I0]], ptr [[PA]], align 872; MIN32-NEXT: store i16 [[C_I1]], ptr [[PA_I1]], align 473; MIN32-NEXT: ret void74;75; MIN64-LABEL: @load_add_store_v3i16(76; MIN64-NEXT: [[A:%.*]] = load <3 x i16>, ptr [[PA:%.*]], align 877; MIN64-NEXT: [[B:%.*]] = load <3 x i16>, ptr [[PB:%.*]], align 878; MIN64-NEXT: [[C:%.*]] = add <3 x i16> [[A]], [[B]]79; MIN64-NEXT: store <3 x i16> [[C]], ptr [[PA]], align 880; MIN64-NEXT: ret void81;82 %a = load <3 x i16>, ptr %pa, align 883 %b = load <3 x i16>, ptr %pb, align 884 %c = add <3 x i16> %a, %b85 store <3 x i16> %c, ptr %pa, align 886 ret void87}88 89define void @load_add_store_v4i16(ptr %pa, ptr %pb) {90; MIN16-LABEL: @load_add_store_v4i16(91; MIN16-NEXT: [[PB_I1:%.*]] = getelementptr i16, ptr [[PB:%.*]], i32 192; MIN16-NEXT: [[PB_I2:%.*]] = getelementptr i16, ptr [[PB]], i32 293; MIN16-NEXT: [[PB_I3:%.*]] = getelementptr i16, ptr [[PB]], i32 394; MIN16-NEXT: [[A_I0:%.*]] = load i16, ptr [[PA:%.*]], align 895; MIN16-NEXT: [[PA_I1:%.*]] = getelementptr i16, ptr [[PA]], i32 196; MIN16-NEXT: [[A_I1:%.*]] = load i16, ptr [[PA_I1]], align 297; MIN16-NEXT: [[PA_I2:%.*]] = getelementptr i16, ptr [[PA]], i32 298; MIN16-NEXT: [[A_I2:%.*]] = load i16, ptr [[PA_I2]], align 499; MIN16-NEXT: [[PA_I3:%.*]] = getelementptr i16, ptr [[PA]], i32 3100; MIN16-NEXT: [[A_I3:%.*]] = load i16, ptr [[PA_I3]], align 2101; MIN16-NEXT: [[B_I0:%.*]] = load i16, ptr [[PB]], align 8102; MIN16-NEXT: [[B_I1:%.*]] = load i16, ptr [[PB_I1]], align 2103; MIN16-NEXT: [[B_I2:%.*]] = load i16, ptr [[PB_I2]], align 4104; MIN16-NEXT: [[B_I3:%.*]] = load i16, ptr [[PB_I3]], align 2105; MIN16-NEXT: [[C_I0:%.*]] = add i16 [[A_I0]], [[B_I0]]106; MIN16-NEXT: [[C_I1:%.*]] = add i16 [[A_I1]], [[B_I1]]107; MIN16-NEXT: [[C_I2:%.*]] = add i16 [[A_I2]], [[B_I2]]108; MIN16-NEXT: [[C_I3:%.*]] = add i16 [[A_I3]], [[B_I3]]109; MIN16-NEXT: store i16 [[C_I0]], ptr [[PA]], align 8110; MIN16-NEXT: store i16 [[C_I1]], ptr [[PA_I1]], align 2111; MIN16-NEXT: store i16 [[C_I2]], ptr [[PA_I2]], align 4112; MIN16-NEXT: store i16 [[C_I3]], ptr [[PA_I3]], align 2113; MIN16-NEXT: ret void114;115; MIN32-LABEL: @load_add_store_v4i16(116; MIN32-NEXT: [[PB_I1:%.*]] = getelementptr <2 x i16>, ptr [[PB:%.*]], i32 1117; MIN32-NEXT: [[A_I0:%.*]] = load <2 x i16>, ptr [[PA:%.*]], align 8118; MIN32-NEXT: [[PA_I1:%.*]] = getelementptr <2 x i16>, ptr [[PA]], i32 1119; MIN32-NEXT: [[A_I1:%.*]] = load <2 x i16>, ptr [[PA_I1]], align 4120; MIN32-NEXT: [[B_I0:%.*]] = load <2 x i16>, ptr [[PB]], align 8121; MIN32-NEXT: [[B_I1:%.*]] = load <2 x i16>, ptr [[PB_I1]], align 4122; MIN32-NEXT: [[C_I0:%.*]] = add <2 x i16> [[A_I0]], [[B_I0]]123; MIN32-NEXT: [[C_I1:%.*]] = add <2 x i16> [[A_I1]], [[B_I1]]124; MIN32-NEXT: store <2 x i16> [[C_I0]], ptr [[PA]], align 8125; MIN32-NEXT: store <2 x i16> [[C_I1]], ptr [[PA_I1]], align 4126; MIN32-NEXT: ret void127;128; MIN64-LABEL: @load_add_store_v4i16(129; MIN64-NEXT: [[A:%.*]] = load <4 x i16>, ptr [[PA:%.*]], align 8130; MIN64-NEXT: [[B:%.*]] = load <4 x i16>, ptr [[PB:%.*]], align 8131; MIN64-NEXT: [[C:%.*]] = add <4 x i16> [[A]], [[B]]132; MIN64-NEXT: store <4 x i16> [[C]], ptr [[PA]], align 8133; MIN64-NEXT: ret void134;135 %a = load <4 x i16>, ptr %pa, align 8136 %b = load <4 x i16>, ptr %pb, align 8137 %c = add <4 x i16> %a, %b138 store <4 x i16> %c, ptr %pa, align 8139 ret void140}141 142define void @load_add_store_v4i10(ptr %pa, ptr %pb) {143; MIN16-LABEL: @load_add_store_v4i10(144; MIN16-NEXT: [[A:%.*]] = load <4 x i10>, ptr [[PA:%.*]], align 8145; MIN16-NEXT: [[A_I0:%.*]] = extractelement <4 x i10> [[A]], i64 0146; MIN16-NEXT: [[A_I1:%.*]] = extractelement <4 x i10> [[A]], i64 1147; MIN16-NEXT: [[A_I2:%.*]] = extractelement <4 x i10> [[A]], i64 2148; MIN16-NEXT: [[A_I3:%.*]] = extractelement <4 x i10> [[A]], i64 3149; MIN16-NEXT: [[B:%.*]] = load <4 x i10>, ptr [[PB:%.*]], align 8150; MIN16-NEXT: [[B_I0:%.*]] = extractelement <4 x i10> [[B]], i64 0151; MIN16-NEXT: [[C_I0:%.*]] = add i10 [[A_I0]], [[B_I0]]152; MIN16-NEXT: [[B_I1:%.*]] = extractelement <4 x i10> [[B]], i64 1153; MIN16-NEXT: [[C_I1:%.*]] = add i10 [[A_I1]], [[B_I1]]154; MIN16-NEXT: [[B_I2:%.*]] = extractelement <4 x i10> [[B]], i64 2155; MIN16-NEXT: [[C_I2:%.*]] = add i10 [[A_I2]], [[B_I2]]156; MIN16-NEXT: [[B_I3:%.*]] = extractelement <4 x i10> [[B]], i64 3157; MIN16-NEXT: [[C_I3:%.*]] = add i10 [[A_I3]], [[B_I3]]158; MIN16-NEXT: [[C_UPTO0:%.*]] = insertelement <4 x i10> poison, i10 [[C_I0]], i64 0159; MIN16-NEXT: [[C_UPTO1:%.*]] = insertelement <4 x i10> [[C_UPTO0]], i10 [[C_I1]], i64 1160; MIN16-NEXT: [[C_UPTO2:%.*]] = insertelement <4 x i10> [[C_UPTO1]], i10 [[C_I2]], i64 2161; MIN16-NEXT: [[C:%.*]] = insertelement <4 x i10> [[C_UPTO2]], i10 [[C_I3]], i64 3162; MIN16-NEXT: store <4 x i10> [[C]], ptr [[PA]], align 8163; MIN16-NEXT: ret void164;165; MIN32-LABEL: @load_add_store_v4i10(166; MIN32-NEXT: [[A:%.*]] = load <4 x i10>, ptr [[PA:%.*]], align 8167; MIN32-NEXT: [[A_I0:%.*]] = shufflevector <4 x i10> [[A]], <4 x i10> poison, <3 x i32> <i32 0, i32 1, i32 2>168; MIN32-NEXT: [[A_I1:%.*]] = extractelement <4 x i10> [[A]], i64 3169; MIN32-NEXT: [[B:%.*]] = load <4 x i10>, ptr [[PB:%.*]], align 8170; MIN32-NEXT: [[B_I0:%.*]] = shufflevector <4 x i10> [[B]], <4 x i10> poison, <3 x i32> <i32 0, i32 1, i32 2>171; MIN32-NEXT: [[C_I0:%.*]] = add <3 x i10> [[A_I0]], [[B_I0]]172; MIN32-NEXT: [[B_I1:%.*]] = extractelement <4 x i10> [[B]], i64 3173; MIN32-NEXT: [[C_I1:%.*]] = add i10 [[A_I1]], [[B_I1]]174; MIN32-NEXT: [[TMP1:%.*]] = shufflevector <3 x i10> [[C_I0]], <3 x i10> [[C_I0]], <4 x i32> <i32 0, i32 1, i32 2, i32 poison>175; MIN32-NEXT: [[C:%.*]] = insertelement <4 x i10> [[TMP1]], i10 [[C_I1]], i64 3176; MIN32-NEXT: store <4 x i10> [[C]], ptr [[PA]], align 8177; MIN32-NEXT: ret void178;179; MIN64-LABEL: @load_add_store_v4i10(180; MIN64-NEXT: [[A:%.*]] = load <4 x i10>, ptr [[PA:%.*]], align 8181; MIN64-NEXT: [[B:%.*]] = load <4 x i10>, ptr [[PB:%.*]], align 8182; MIN64-NEXT: [[C:%.*]] = add <4 x i10> [[A]], [[B]]183; MIN64-NEXT: store <4 x i10> [[C]], ptr [[PA]], align 8184; MIN64-NEXT: ret void185;186 %a = load <4 x i10>, ptr %pa, align 8187 %b = load <4 x i10>, ptr %pb, align 8188 %c = add <4 x i10> %a, %b189 store <4 x i10> %c, ptr %pa, align 8190 ret void191}192 193define <2 x half> @select_uniform_condition_v2f16(<2 x half> %a, <2 x half> %b, i1 %cc) {194; MIN16-LABEL: @select_uniform_condition_v2f16(195; MIN16-NEXT: [[A_I0:%.*]] = extractelement <2 x half> [[A:%.*]], i64 0196; MIN16-NEXT: [[B_I0:%.*]] = extractelement <2 x half> [[B:%.*]], i64 0197; MIN16-NEXT: [[R_I0:%.*]] = select i1 [[CC:%.*]], half [[A_I0]], half [[B_I0]]198; MIN16-NEXT: [[A_I1:%.*]] = extractelement <2 x half> [[A]], i64 1199; MIN16-NEXT: [[B_I1:%.*]] = extractelement <2 x half> [[B]], i64 1200; MIN16-NEXT: [[R_I1:%.*]] = select i1 [[CC]], half [[A_I1]], half [[B_I1]]201; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <2 x half> poison, half [[R_I0]], i64 0202; MIN16-NEXT: [[R:%.*]] = insertelement <2 x half> [[R_UPTO0]], half [[R_I1]], i64 1203; MIN16-NEXT: ret <2 x half> [[R]]204;205; MIN32-LABEL: @select_uniform_condition_v2f16(206; MIN32-NEXT: [[R:%.*]] = select i1 [[CC:%.*]], <2 x half> [[A:%.*]], <2 x half> [[B:%.*]]207; MIN32-NEXT: ret <2 x half> [[R]]208;209; MIN64-LABEL: @select_uniform_condition_v2f16(210; MIN64-NEXT: [[R:%.*]] = select i1 [[CC:%.*]], <2 x half> [[A:%.*]], <2 x half> [[B:%.*]]211; MIN64-NEXT: ret <2 x half> [[R]]212;213 %r = select i1 %cc, <2 x half> %a, <2 x half> %b214 ret <2 x half> %r215}216 217define <3 x half> @select_uniform_condition_v3f16(<3 x half> %a, <3 x half> %b, i1 %cc) {218; MIN16-LABEL: @select_uniform_condition_v3f16(219; MIN16-NEXT: [[A_I0:%.*]] = extractelement <3 x half> [[A:%.*]], i64 0220; MIN16-NEXT: [[B_I0:%.*]] = extractelement <3 x half> [[B:%.*]], i64 0221; MIN16-NEXT: [[R_I0:%.*]] = select i1 [[CC:%.*]], half [[A_I0]], half [[B_I0]]222; MIN16-NEXT: [[A_I1:%.*]] = extractelement <3 x half> [[A]], i64 1223; MIN16-NEXT: [[B_I1:%.*]] = extractelement <3 x half> [[B]], i64 1224; MIN16-NEXT: [[R_I1:%.*]] = select i1 [[CC]], half [[A_I1]], half [[B_I1]]225; MIN16-NEXT: [[A_I2:%.*]] = extractelement <3 x half> [[A]], i64 2226; MIN16-NEXT: [[B_I2:%.*]] = extractelement <3 x half> [[B]], i64 2227; MIN16-NEXT: [[R_I2:%.*]] = select i1 [[CC]], half [[A_I2]], half [[B_I2]]228; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <3 x half> poison, half [[R_I0]], i64 0229; MIN16-NEXT: [[R_UPTO1:%.*]] = insertelement <3 x half> [[R_UPTO0]], half [[R_I1]], i64 1230; MIN16-NEXT: [[R:%.*]] = insertelement <3 x half> [[R_UPTO1]], half [[R_I2]], i64 2231; MIN16-NEXT: ret <3 x half> [[R]]232;233; MIN32-LABEL: @select_uniform_condition_v3f16(234; MIN32-NEXT: [[A_I0:%.*]] = shufflevector <3 x half> [[A:%.*]], <3 x half> poison, <2 x i32> <i32 0, i32 1>235; MIN32-NEXT: [[B_I0:%.*]] = shufflevector <3 x half> [[B:%.*]], <3 x half> poison, <2 x i32> <i32 0, i32 1>236; MIN32-NEXT: [[R_I0:%.*]] = select i1 [[CC:%.*]], <2 x half> [[A_I0]], <2 x half> [[B_I0]]237; MIN32-NEXT: [[A_I1:%.*]] = extractelement <3 x half> [[A]], i64 2238; MIN32-NEXT: [[B_I1:%.*]] = extractelement <3 x half> [[B]], i64 2239; MIN32-NEXT: [[R_I1:%.*]] = select i1 [[CC]], half [[A_I1]], half [[B_I1]]240; MIN32-NEXT: [[TMP1:%.*]] = shufflevector <2 x half> [[R_I0]], <2 x half> [[R_I0]], <3 x i32> <i32 0, i32 1, i32 poison>241; MIN32-NEXT: [[R:%.*]] = insertelement <3 x half> [[TMP1]], half [[R_I1]], i64 2242; MIN32-NEXT: ret <3 x half> [[R]]243;244; MIN64-LABEL: @select_uniform_condition_v3f16(245; MIN64-NEXT: [[R:%.*]] = select i1 [[CC:%.*]], <3 x half> [[A:%.*]], <3 x half> [[B:%.*]]246; MIN64-NEXT: ret <3 x half> [[R]]247;248 %r = select i1 %cc, <3 x half> %a, <3 x half> %b249 ret <3 x half> %r250}251 252define <4 x half> @select_uniform_condition_v4f16(<4 x half> %a, <4 x half> %b, i1 %cc) {253; MIN16-LABEL: @select_uniform_condition_v4f16(254; MIN16-NEXT: [[A_I0:%.*]] = extractelement <4 x half> [[A:%.*]], i64 0255; MIN16-NEXT: [[B_I0:%.*]] = extractelement <4 x half> [[B:%.*]], i64 0256; MIN16-NEXT: [[R_I0:%.*]] = select i1 [[CC:%.*]], half [[A_I0]], half [[B_I0]]257; MIN16-NEXT: [[A_I1:%.*]] = extractelement <4 x half> [[A]], i64 1258; MIN16-NEXT: [[B_I1:%.*]] = extractelement <4 x half> [[B]], i64 1259; MIN16-NEXT: [[R_I1:%.*]] = select i1 [[CC]], half [[A_I1]], half [[B_I1]]260; MIN16-NEXT: [[A_I2:%.*]] = extractelement <4 x half> [[A]], i64 2261; MIN16-NEXT: [[B_I2:%.*]] = extractelement <4 x half> [[B]], i64 2262; MIN16-NEXT: [[R_I2:%.*]] = select i1 [[CC]], half [[A_I2]], half [[B_I2]]263; MIN16-NEXT: [[A_I3:%.*]] = extractelement <4 x half> [[A]], i64 3264; MIN16-NEXT: [[B_I3:%.*]] = extractelement <4 x half> [[B]], i64 3265; MIN16-NEXT: [[R_I3:%.*]] = select i1 [[CC]], half [[A_I3]], half [[B_I3]]266; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <4 x half> poison, half [[R_I0]], i64 0267; MIN16-NEXT: [[R_UPTO1:%.*]] = insertelement <4 x half> [[R_UPTO0]], half [[R_I1]], i64 1268; MIN16-NEXT: [[R_UPTO2:%.*]] = insertelement <4 x half> [[R_UPTO1]], half [[R_I2]], i64 2269; MIN16-NEXT: [[R:%.*]] = insertelement <4 x half> [[R_UPTO2]], half [[R_I3]], i64 3270; MIN16-NEXT: ret <4 x half> [[R]]271;272; MIN32-LABEL: @select_uniform_condition_v4f16(273; MIN32-NEXT: [[A_I0:%.*]] = shufflevector <4 x half> [[A:%.*]], <4 x half> poison, <2 x i32> <i32 0, i32 1>274; MIN32-NEXT: [[B_I0:%.*]] = shufflevector <4 x half> [[B:%.*]], <4 x half> poison, <2 x i32> <i32 0, i32 1>275; MIN32-NEXT: [[R_I0:%.*]] = select i1 [[CC:%.*]], <2 x half> [[A_I0]], <2 x half> [[B_I0]]276; MIN32-NEXT: [[A_I1:%.*]] = shufflevector <4 x half> [[A]], <4 x half> poison, <2 x i32> <i32 2, i32 3>277; MIN32-NEXT: [[B_I1:%.*]] = shufflevector <4 x half> [[B]], <4 x half> poison, <2 x i32> <i32 2, i32 3>278; MIN32-NEXT: [[R_I1:%.*]] = select i1 [[CC]], <2 x half> [[A_I1]], <2 x half> [[B_I1]]279; MIN32-NEXT: [[TMP1:%.*]] = shufflevector <2 x half> [[R_I0]], <2 x half> [[R_I0]], <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>280; MIN32-NEXT: [[TMP2:%.*]] = shufflevector <2 x half> [[R_I1]], <2 x half> [[R_I1]], <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>281; MIN32-NEXT: [[R:%.*]] = shufflevector <4 x half> [[TMP1]], <4 x half> [[TMP2]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>282; MIN32-NEXT: ret <4 x half> [[R]]283;284; MIN64-LABEL: @select_uniform_condition_v4f16(285; MIN64-NEXT: [[R:%.*]] = select i1 [[CC:%.*]], <4 x half> [[A:%.*]], <4 x half> [[B:%.*]]286; MIN64-NEXT: ret <4 x half> [[R]]287;288 %r = select i1 %cc, <4 x half> %a, <4 x half> %b289 ret <4 x half> %r290}291 292define <4 x half> @select_vector_condition_v4f16(<4 x half> %a, <4 x half> %b, <4 x i1> %cc) {293; CHECK-LABEL: @select_vector_condition_v4f16(294; CHECK-NEXT: [[R:%.*]] = select <4 x i1> [[CC:%.*]], <4 x half> [[A:%.*]], <4 x half> [[B:%.*]]295; CHECK-NEXT: ret <4 x half> [[R]]296;297 %r = select <4 x i1> %cc, <4 x half> %a, <4 x half> %b298 ret <4 x half> %r299}300 301define <2 x half> @unary_v2f16(<2 x half> %a) {302; MIN16-LABEL: @unary_v2f16(303; MIN16-NEXT: [[A_I0:%.*]] = extractelement <2 x half> [[A:%.*]], i64 0304; MIN16-NEXT: [[R_I0:%.*]] = fneg half [[A_I0]]305; MIN16-NEXT: [[A_I1:%.*]] = extractelement <2 x half> [[A]], i64 1306; MIN16-NEXT: [[R_I1:%.*]] = fneg half [[A_I1]]307; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <2 x half> poison, half [[R_I0]], i64 0308; MIN16-NEXT: [[R:%.*]] = insertelement <2 x half> [[R_UPTO0]], half [[R_I1]], i64 1309; MIN16-NEXT: ret <2 x half> [[R]]310;311; MIN32-LABEL: @unary_v2f16(312; MIN32-NEXT: [[R:%.*]] = fneg <2 x half> [[A:%.*]]313; MIN32-NEXT: ret <2 x half> [[R]]314;315; MIN64-LABEL: @unary_v2f16(316; MIN64-NEXT: [[R:%.*]] = fneg <2 x half> [[A:%.*]]317; MIN64-NEXT: ret <2 x half> [[R]]318;319 %r = fneg <2 x half> %a320 ret <2 x half> %r321}322 323define <3 x half> @unary_v3f16(<3 x half> %a) {324; MIN16-LABEL: @unary_v3f16(325; MIN16-NEXT: [[A_I0:%.*]] = extractelement <3 x half> [[A:%.*]], i64 0326; MIN16-NEXT: [[R_I0:%.*]] = fneg half [[A_I0]]327; MIN16-NEXT: [[A_I1:%.*]] = extractelement <3 x half> [[A]], i64 1328; MIN16-NEXT: [[R_I1:%.*]] = fneg half [[A_I1]]329; MIN16-NEXT: [[A_I2:%.*]] = extractelement <3 x half> [[A]], i64 2330; MIN16-NEXT: [[R_I2:%.*]] = fneg half [[A_I2]]331; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <3 x half> poison, half [[R_I0]], i64 0332; MIN16-NEXT: [[R_UPTO1:%.*]] = insertelement <3 x half> [[R_UPTO0]], half [[R_I1]], i64 1333; MIN16-NEXT: [[R:%.*]] = insertelement <3 x half> [[R_UPTO1]], half [[R_I2]], i64 2334; MIN16-NEXT: ret <3 x half> [[R]]335;336; MIN32-LABEL: @unary_v3f16(337; MIN32-NEXT: [[A_I0:%.*]] = shufflevector <3 x half> [[A:%.*]], <3 x half> poison, <2 x i32> <i32 0, i32 1>338; MIN32-NEXT: [[R_I0:%.*]] = fneg <2 x half> [[A_I0]]339; MIN32-NEXT: [[A_I1:%.*]] = extractelement <3 x half> [[A]], i64 2340; MIN32-NEXT: [[R_I1:%.*]] = fneg half [[A_I1]]341; MIN32-NEXT: [[TMP1:%.*]] = shufflevector <2 x half> [[R_I0]], <2 x half> [[R_I0]], <3 x i32> <i32 0, i32 1, i32 poison>342; MIN32-NEXT: [[R:%.*]] = insertelement <3 x half> [[TMP1]], half [[R_I1]], i64 2343; MIN32-NEXT: ret <3 x half> [[R]]344;345; MIN64-LABEL: @unary_v3f16(346; MIN64-NEXT: [[R:%.*]] = fneg <3 x half> [[A:%.*]]347; MIN64-NEXT: ret <3 x half> [[R]]348;349 %r = fneg <3 x half> %a350 ret <3 x half> %r351}352 353define <4 x half> @unary_v4f16(<4 x half> %a) {354; MIN16-LABEL: @unary_v4f16(355; MIN16-NEXT: [[A_I0:%.*]] = extractelement <4 x half> [[A:%.*]], i64 0356; MIN16-NEXT: [[R_I0:%.*]] = fneg half [[A_I0]]357; MIN16-NEXT: [[A_I1:%.*]] = extractelement <4 x half> [[A]], i64 1358; MIN16-NEXT: [[R_I1:%.*]] = fneg half [[A_I1]]359; MIN16-NEXT: [[A_I2:%.*]] = extractelement <4 x half> [[A]], i64 2360; MIN16-NEXT: [[R_I2:%.*]] = fneg half [[A_I2]]361; MIN16-NEXT: [[A_I3:%.*]] = extractelement <4 x half> [[A]], i64 3362; MIN16-NEXT: [[R_I3:%.*]] = fneg half [[A_I3]]363; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <4 x half> poison, half [[R_I0]], i64 0364; MIN16-NEXT: [[R_UPTO1:%.*]] = insertelement <4 x half> [[R_UPTO0]], half [[R_I1]], i64 1365; MIN16-NEXT: [[R_UPTO2:%.*]] = insertelement <4 x half> [[R_UPTO1]], half [[R_I2]], i64 2366; MIN16-NEXT: [[R:%.*]] = insertelement <4 x half> [[R_UPTO2]], half [[R_I3]], i64 3367; MIN16-NEXT: ret <4 x half> [[R]]368;369; MIN32-LABEL: @unary_v4f16(370; MIN32-NEXT: [[A_I0:%.*]] = shufflevector <4 x half> [[A:%.*]], <4 x half> poison, <2 x i32> <i32 0, i32 1>371; MIN32-NEXT: [[R_I0:%.*]] = fneg <2 x half> [[A_I0]]372; MIN32-NEXT: [[A_I1:%.*]] = shufflevector <4 x half> [[A]], <4 x half> poison, <2 x i32> <i32 2, i32 3>373; MIN32-NEXT: [[R_I1:%.*]] = fneg <2 x half> [[A_I1]]374; MIN32-NEXT: [[TMP1:%.*]] = shufflevector <2 x half> [[R_I0]], <2 x half> [[R_I0]], <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>375; MIN32-NEXT: [[TMP2:%.*]] = shufflevector <2 x half> [[R_I1]], <2 x half> [[R_I1]], <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>376; MIN32-NEXT: [[R:%.*]] = shufflevector <4 x half> [[TMP1]], <4 x half> [[TMP2]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>377; MIN32-NEXT: ret <4 x half> [[R]]378;379; MIN64-LABEL: @unary_v4f16(380; MIN64-NEXT: [[R:%.*]] = fneg <4 x half> [[A:%.*]]381; MIN64-NEXT: ret <4 x half> [[R]]382;383 %r = fneg <4 x half> %a384 ret <4 x half> %r385}386 387define <2 x half> @binary_v2f16(<2 x half> %a, <2 x half> %b) {388; MIN16-LABEL: @binary_v2f16(389; MIN16-NEXT: [[A_I0:%.*]] = extractelement <2 x half> [[A:%.*]], i64 0390; MIN16-NEXT: [[B_I0:%.*]] = extractelement <2 x half> [[B:%.*]], i64 0391; MIN16-NEXT: [[R_I0:%.*]] = fadd half [[A_I0]], [[B_I0]]392; MIN16-NEXT: [[A_I1:%.*]] = extractelement <2 x half> [[A]], i64 1393; MIN16-NEXT: [[B_I1:%.*]] = extractelement <2 x half> [[B]], i64 1394; MIN16-NEXT: [[R_I1:%.*]] = fadd half [[A_I1]], [[B_I1]]395; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <2 x half> poison, half [[R_I0]], i64 0396; MIN16-NEXT: [[R:%.*]] = insertelement <2 x half> [[R_UPTO0]], half [[R_I1]], i64 1397; MIN16-NEXT: ret <2 x half> [[R]]398;399; MIN32-LABEL: @binary_v2f16(400; MIN32-NEXT: [[R:%.*]] = fadd <2 x half> [[A:%.*]], [[B:%.*]]401; MIN32-NEXT: ret <2 x half> [[R]]402;403; MIN64-LABEL: @binary_v2f16(404; MIN64-NEXT: [[R:%.*]] = fadd <2 x half> [[A:%.*]], [[B:%.*]]405; MIN64-NEXT: ret <2 x half> [[R]]406;407 %r = fadd <2 x half> %a, %b408 ret <2 x half> %r409}410 411define <3 x half> @binary_v3f16(<3 x half> %a, <3 x half> %b) {412; MIN16-LABEL: @binary_v3f16(413; MIN16-NEXT: [[A_I0:%.*]] = extractelement <3 x half> [[A:%.*]], i64 0414; MIN16-NEXT: [[B_I0:%.*]] = extractelement <3 x half> [[B:%.*]], i64 0415; MIN16-NEXT: [[R_I0:%.*]] = fadd half [[A_I0]], [[B_I0]]416; MIN16-NEXT: [[A_I1:%.*]] = extractelement <3 x half> [[A]], i64 1417; MIN16-NEXT: [[B_I1:%.*]] = extractelement <3 x half> [[B]], i64 1418; MIN16-NEXT: [[R_I1:%.*]] = fadd half [[A_I1]], [[B_I1]]419; MIN16-NEXT: [[A_I2:%.*]] = extractelement <3 x half> [[A]], i64 2420; MIN16-NEXT: [[B_I2:%.*]] = extractelement <3 x half> [[B]], i64 2421; MIN16-NEXT: [[R_I2:%.*]] = fadd half [[A_I2]], [[B_I2]]422; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <3 x half> poison, half [[R_I0]], i64 0423; MIN16-NEXT: [[R_UPTO1:%.*]] = insertelement <3 x half> [[R_UPTO0]], half [[R_I1]], i64 1424; MIN16-NEXT: [[R:%.*]] = insertelement <3 x half> [[R_UPTO1]], half [[R_I2]], i64 2425; MIN16-NEXT: ret <3 x half> [[R]]426;427; MIN32-LABEL: @binary_v3f16(428; MIN32-NEXT: [[A_I0:%.*]] = shufflevector <3 x half> [[A:%.*]], <3 x half> poison, <2 x i32> <i32 0, i32 1>429; MIN32-NEXT: [[B_I0:%.*]] = shufflevector <3 x half> [[B:%.*]], <3 x half> poison, <2 x i32> <i32 0, i32 1>430; MIN32-NEXT: [[R_I0:%.*]] = fadd <2 x half> [[A_I0]], [[B_I0]]431; MIN32-NEXT: [[A_I1:%.*]] = extractelement <3 x half> [[A]], i64 2432; MIN32-NEXT: [[B_I1:%.*]] = extractelement <3 x half> [[B]], i64 2433; MIN32-NEXT: [[R_I1:%.*]] = fadd half [[A_I1]], [[B_I1]]434; MIN32-NEXT: [[TMP1:%.*]] = shufflevector <2 x half> [[R_I0]], <2 x half> [[R_I0]], <3 x i32> <i32 0, i32 1, i32 poison>435; MIN32-NEXT: [[R:%.*]] = insertelement <3 x half> [[TMP1]], half [[R_I1]], i64 2436; MIN32-NEXT: ret <3 x half> [[R]]437;438; MIN64-LABEL: @binary_v3f16(439; MIN64-NEXT: [[R:%.*]] = fadd <3 x half> [[A:%.*]], [[B:%.*]]440; MIN64-NEXT: ret <3 x half> [[R]]441;442 %r = fadd <3 x half> %a, %b443 ret <3 x half> %r444}445 446define <4 x half> @binary_v4f16(<4 x half> %a, <4 x half> %b) {447; MIN16-LABEL: @binary_v4f16(448; MIN16-NEXT: [[A_I0:%.*]] = extractelement <4 x half> [[A:%.*]], i64 0449; MIN16-NEXT: [[B_I0:%.*]] = extractelement <4 x half> [[B:%.*]], i64 0450; MIN16-NEXT: [[R_I0:%.*]] = fadd half [[A_I0]], [[B_I0]]451; MIN16-NEXT: [[A_I1:%.*]] = extractelement <4 x half> [[A]], i64 1452; MIN16-NEXT: [[B_I1:%.*]] = extractelement <4 x half> [[B]], i64 1453; MIN16-NEXT: [[R_I1:%.*]] = fadd half [[A_I1]], [[B_I1]]454; MIN16-NEXT: [[A_I2:%.*]] = extractelement <4 x half> [[A]], i64 2455; MIN16-NEXT: [[B_I2:%.*]] = extractelement <4 x half> [[B]], i64 2456; MIN16-NEXT: [[R_I2:%.*]] = fadd half [[A_I2]], [[B_I2]]457; MIN16-NEXT: [[A_I3:%.*]] = extractelement <4 x half> [[A]], i64 3458; MIN16-NEXT: [[B_I3:%.*]] = extractelement <4 x half> [[B]], i64 3459; MIN16-NEXT: [[R_I3:%.*]] = fadd half [[A_I3]], [[B_I3]]460; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <4 x half> poison, half [[R_I0]], i64 0461; MIN16-NEXT: [[R_UPTO1:%.*]] = insertelement <4 x half> [[R_UPTO0]], half [[R_I1]], i64 1462; MIN16-NEXT: [[R_UPTO2:%.*]] = insertelement <4 x half> [[R_UPTO1]], half [[R_I2]], i64 2463; MIN16-NEXT: [[R:%.*]] = insertelement <4 x half> [[R_UPTO2]], half [[R_I3]], i64 3464; MIN16-NEXT: ret <4 x half> [[R]]465;466; MIN32-LABEL: @binary_v4f16(467; MIN32-NEXT: [[A_I0:%.*]] = shufflevector <4 x half> [[A:%.*]], <4 x half> poison, <2 x i32> <i32 0, i32 1>468; MIN32-NEXT: [[B_I0:%.*]] = shufflevector <4 x half> [[B:%.*]], <4 x half> poison, <2 x i32> <i32 0, i32 1>469; MIN32-NEXT: [[R_I0:%.*]] = fadd <2 x half> [[A_I0]], [[B_I0]]470; MIN32-NEXT: [[A_I1:%.*]] = shufflevector <4 x half> [[A]], <4 x half> poison, <2 x i32> <i32 2, i32 3>471; MIN32-NEXT: [[B_I1:%.*]] = shufflevector <4 x half> [[B]], <4 x half> poison, <2 x i32> <i32 2, i32 3>472; MIN32-NEXT: [[R_I1:%.*]] = fadd <2 x half> [[A_I1]], [[B_I1]]473; MIN32-NEXT: [[TMP1:%.*]] = shufflevector <2 x half> [[R_I0]], <2 x half> [[R_I0]], <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>474; MIN32-NEXT: [[TMP2:%.*]] = shufflevector <2 x half> [[R_I1]], <2 x half> [[R_I1]], <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>475; MIN32-NEXT: [[R:%.*]] = shufflevector <4 x half> [[TMP1]], <4 x half> [[TMP2]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>476; MIN32-NEXT: ret <4 x half> [[R]]477;478; MIN64-LABEL: @binary_v4f16(479; MIN64-NEXT: [[R:%.*]] = fadd <4 x half> [[A:%.*]], [[B:%.*]]480; MIN64-NEXT: ret <4 x half> [[R]]481;482 %r = fadd <4 x half> %a, %b483 ret <4 x half> %r484}485 486define <2 x i16> @fptosi_v2f16(<2 x half> %a) {487; MIN16-LABEL: @fptosi_v2f16(488; MIN16-NEXT: [[A_I0:%.*]] = extractelement <2 x half> [[A:%.*]], i64 0489; MIN16-NEXT: [[R_I0:%.*]] = fptosi half [[A_I0]] to i16490; MIN16-NEXT: [[A_I1:%.*]] = extractelement <2 x half> [[A]], i64 1491; MIN16-NEXT: [[R_I1:%.*]] = fptosi half [[A_I1]] to i16492; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <2 x i16> poison, i16 [[R_I0]], i64 0493; MIN16-NEXT: [[R:%.*]] = insertelement <2 x i16> [[R_UPTO0]], i16 [[R_I1]], i64 1494; MIN16-NEXT: ret <2 x i16> [[R]]495;496; MIN32-LABEL: @fptosi_v2f16(497; MIN32-NEXT: [[R:%.*]] = fptosi <2 x half> [[A:%.*]] to <2 x i16>498; MIN32-NEXT: ret <2 x i16> [[R]]499;500; MIN64-LABEL: @fptosi_v2f16(501; MIN64-NEXT: [[R:%.*]] = fptosi <2 x half> [[A:%.*]] to <2 x i16>502; MIN64-NEXT: ret <2 x i16> [[R]]503;504 %r = fptosi <2 x half> %a to <2 x i16>505 ret <2 x i16> %r506}507 508define <3 x i16> @fptosi_v3f16(<3 x half> %a) {509; MIN16-LABEL: @fptosi_v3f16(510; MIN16-NEXT: [[A_I0:%.*]] = extractelement <3 x half> [[A:%.*]], i64 0511; MIN16-NEXT: [[R_I0:%.*]] = fptosi half [[A_I0]] to i16512; MIN16-NEXT: [[A_I1:%.*]] = extractelement <3 x half> [[A]], i64 1513; MIN16-NEXT: [[R_I1:%.*]] = fptosi half [[A_I1]] to i16514; MIN16-NEXT: [[A_I2:%.*]] = extractelement <3 x half> [[A]], i64 2515; MIN16-NEXT: [[R_I2:%.*]] = fptosi half [[A_I2]] to i16516; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <3 x i16> poison, i16 [[R_I0]], i64 0517; MIN16-NEXT: [[R_UPTO1:%.*]] = insertelement <3 x i16> [[R_UPTO0]], i16 [[R_I1]], i64 1518; MIN16-NEXT: [[R:%.*]] = insertelement <3 x i16> [[R_UPTO1]], i16 [[R_I2]], i64 2519; MIN16-NEXT: ret <3 x i16> [[R]]520;521; MIN32-LABEL: @fptosi_v3f16(522; MIN32-NEXT: [[A_I0:%.*]] = shufflevector <3 x half> [[A:%.*]], <3 x half> poison, <2 x i32> <i32 0, i32 1>523; MIN32-NEXT: [[R_I0:%.*]] = fptosi <2 x half> [[A_I0]] to <2 x i16>524; MIN32-NEXT: [[A_I1:%.*]] = extractelement <3 x half> [[A]], i64 2525; MIN32-NEXT: [[R_I1:%.*]] = fptosi half [[A_I1]] to i16526; MIN32-NEXT: [[TMP1:%.*]] = shufflevector <2 x i16> [[R_I0]], <2 x i16> [[R_I0]], <3 x i32> <i32 0, i32 1, i32 poison>527; MIN32-NEXT: [[R:%.*]] = insertelement <3 x i16> [[TMP1]], i16 [[R_I1]], i64 2528; MIN32-NEXT: ret <3 x i16> [[R]]529;530; MIN64-LABEL: @fptosi_v3f16(531; MIN64-NEXT: [[R:%.*]] = fptosi <3 x half> [[A:%.*]] to <3 x i16>532; MIN64-NEXT: ret <3 x i16> [[R]]533;534 %r = fptosi <3 x half> %a to <3 x i16>535 ret <3 x i16> %r536}537 538define <4 x i16> @fptosi_v4f16(<4 x half> %a) {539; MIN16-LABEL: @fptosi_v4f16(540; MIN16-NEXT: [[A_I0:%.*]] = extractelement <4 x half> [[A:%.*]], i64 0541; MIN16-NEXT: [[R_I0:%.*]] = fptosi half [[A_I0]] to i16542; MIN16-NEXT: [[A_I1:%.*]] = extractelement <4 x half> [[A]], i64 1543; MIN16-NEXT: [[R_I1:%.*]] = fptosi half [[A_I1]] to i16544; MIN16-NEXT: [[A_I2:%.*]] = extractelement <4 x half> [[A]], i64 2545; MIN16-NEXT: [[R_I2:%.*]] = fptosi half [[A_I2]] to i16546; MIN16-NEXT: [[A_I3:%.*]] = extractelement <4 x half> [[A]], i64 3547; MIN16-NEXT: [[R_I3:%.*]] = fptosi half [[A_I3]] to i16548; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <4 x i16> poison, i16 [[R_I0]], i64 0549; MIN16-NEXT: [[R_UPTO1:%.*]] = insertelement <4 x i16> [[R_UPTO0]], i16 [[R_I1]], i64 1550; MIN16-NEXT: [[R_UPTO2:%.*]] = insertelement <4 x i16> [[R_UPTO1]], i16 [[R_I2]], i64 2551; MIN16-NEXT: [[R:%.*]] = insertelement <4 x i16> [[R_UPTO2]], i16 [[R_I3]], i64 3552; MIN16-NEXT: ret <4 x i16> [[R]]553;554; MIN32-LABEL: @fptosi_v4f16(555; MIN32-NEXT: [[A_I0:%.*]] = shufflevector <4 x half> [[A:%.*]], <4 x half> poison, <2 x i32> <i32 0, i32 1>556; MIN32-NEXT: [[R_I0:%.*]] = fptosi <2 x half> [[A_I0]] to <2 x i16>557; MIN32-NEXT: [[A_I1:%.*]] = shufflevector <4 x half> [[A]], <4 x half> poison, <2 x i32> <i32 2, i32 3>558; MIN32-NEXT: [[R_I1:%.*]] = fptosi <2 x half> [[A_I1]] to <2 x i16>559; MIN32-NEXT: [[TMP1:%.*]] = shufflevector <2 x i16> [[R_I0]], <2 x i16> [[R_I0]], <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>560; MIN32-NEXT: [[TMP2:%.*]] = shufflevector <2 x i16> [[R_I1]], <2 x i16> [[R_I1]], <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>561; MIN32-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[TMP1]], <4 x i16> [[TMP2]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>562; MIN32-NEXT: ret <4 x i16> [[R]]563;564; MIN64-LABEL: @fptosi_v4f16(565; MIN64-NEXT: [[R:%.*]] = fptosi <4 x half> [[A:%.*]] to <4 x i16>566; MIN64-NEXT: ret <4 x i16> [[R]]567;568 %r = fptosi <4 x half> %a to <4 x i16>569 ret <4 x i16> %r570}571 572define <4 x float> @fpext_v4f16(<4 x half> %a) {573; MIN16-LABEL: @fpext_v4f16(574; MIN16-NEXT: [[A_I0:%.*]] = extractelement <4 x half> [[A:%.*]], i64 0575; MIN16-NEXT: [[R_I0:%.*]] = fpext half [[A_I0]] to float576; MIN16-NEXT: [[A_I1:%.*]] = extractelement <4 x half> [[A]], i64 1577; MIN16-NEXT: [[R_I1:%.*]] = fpext half [[A_I1]] to float578; MIN16-NEXT: [[A_I2:%.*]] = extractelement <4 x half> [[A]], i64 2579; MIN16-NEXT: [[R_I2:%.*]] = fpext half [[A_I2]] to float580; MIN16-NEXT: [[A_I3:%.*]] = extractelement <4 x half> [[A]], i64 3581; MIN16-NEXT: [[R_I3:%.*]] = fpext half [[A_I3]] to float582; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <4 x float> poison, float [[R_I0]], i64 0583; MIN16-NEXT: [[R_UPTO1:%.*]] = insertelement <4 x float> [[R_UPTO0]], float [[R_I1]], i64 1584; MIN16-NEXT: [[R_UPTO2:%.*]] = insertelement <4 x float> [[R_UPTO1]], float [[R_I2]], i64 2585; MIN16-NEXT: [[R:%.*]] = insertelement <4 x float> [[R_UPTO2]], float [[R_I3]], i64 3586; MIN16-NEXT: ret <4 x float> [[R]]587;588; MIN32-LABEL: @fpext_v4f16(589; MIN32-NEXT: [[R:%.*]] = fpext <4 x half> [[A:%.*]] to <4 x float>590; MIN32-NEXT: ret <4 x float> [[R]]591;592; MIN64-LABEL: @fpext_v4f16(593; MIN64-NEXT: [[R:%.*]] = fpext <4 x half> [[A:%.*]] to <4 x float>594; MIN64-NEXT: ret <4 x float> [[R]]595;596 %r = fpext <4 x half> %a to <4 x float>597 ret <4 x float> %r598}599 600define <4 x i1> @icmp_v4f16(<4 x i16> %a, <4 x i16> %b) {601; CHECK-LABEL: @icmp_v4f16(602; CHECK-NEXT: [[R:%.*]] = icmp ugt <4 x i16> [[A:%.*]], [[B:%.*]]603; CHECK-NEXT: ret <4 x i1> [[R]]604;605 %r = icmp ugt <4 x i16> %a, %b606 ret <4 x i1> %r607}608 609define <4 x ptr> @gep1_v4(ptr %base, <4 x i16> %a) {610; MIN16-LABEL: @gep1_v4(611; MIN16-NEXT: [[A_I0:%.*]] = extractelement <4 x i16> [[A:%.*]], i64 0612; MIN16-NEXT: [[P_I0:%.*]] = getelementptr i32, ptr [[BASE:%.*]], i16 [[A_I0]]613; MIN16-NEXT: [[A_I1:%.*]] = extractelement <4 x i16> [[A]], i64 1614; MIN16-NEXT: [[P_I1:%.*]] = getelementptr i32, ptr [[BASE]], i16 [[A_I1]]615; MIN16-NEXT: [[A_I2:%.*]] = extractelement <4 x i16> [[A]], i64 2616; MIN16-NEXT: [[P_I2:%.*]] = getelementptr i32, ptr [[BASE]], i16 [[A_I2]]617; MIN16-NEXT: [[A_I3:%.*]] = extractelement <4 x i16> [[A]], i64 3618; MIN16-NEXT: [[P_I3:%.*]] = getelementptr i32, ptr [[BASE]], i16 [[A_I3]]619; MIN16-NEXT: [[P_UPTO0:%.*]] = insertelement <4 x ptr> poison, ptr [[P_I0]], i64 0620; MIN16-NEXT: [[P_UPTO1:%.*]] = insertelement <4 x ptr> [[P_UPTO0]], ptr [[P_I1]], i64 1621; MIN16-NEXT: [[P_UPTO2:%.*]] = insertelement <4 x ptr> [[P_UPTO1]], ptr [[P_I2]], i64 2622; MIN16-NEXT: [[P:%.*]] = insertelement <4 x ptr> [[P_UPTO2]], ptr [[P_I3]], i64 3623; MIN16-NEXT: ret <4 x ptr> [[P]]624;625; MIN32-LABEL: @gep1_v4(626; MIN32-NEXT: [[P:%.*]] = getelementptr i32, ptr [[BASE:%.*]], <4 x i16> [[A:%.*]]627; MIN32-NEXT: ret <4 x ptr> [[P]]628;629; MIN64-LABEL: @gep1_v4(630; MIN64-NEXT: [[P:%.*]] = getelementptr i32, ptr [[BASE:%.*]], <4 x i16> [[A:%.*]]631; MIN64-NEXT: ret <4 x ptr> [[P]]632;633 %p = getelementptr i32, ptr %base, <4 x i16> %a634 ret <4 x ptr> %p635}636 637define <4 x ptr> @gep2_v4(<4 x ptr> %base, i16 %a) {638; CHECK-LABEL: @gep2_v4(639; CHECK-NEXT: [[BASE_I0:%.*]] = extractelement <4 x ptr> [[BASE:%.*]], i64 0640; CHECK-NEXT: [[P_I0:%.*]] = getelementptr i32, ptr [[BASE_I0]], i16 [[A:%.*]]641; CHECK-NEXT: [[BASE_I1:%.*]] = extractelement <4 x ptr> [[BASE]], i64 1642; CHECK-NEXT: [[P_I1:%.*]] = getelementptr i32, ptr [[BASE_I1]], i16 [[A]]643; CHECK-NEXT: [[BASE_I2:%.*]] = extractelement <4 x ptr> [[BASE]], i64 2644; CHECK-NEXT: [[P_I2:%.*]] = getelementptr i32, ptr [[BASE_I2]], i16 [[A]]645; CHECK-NEXT: [[BASE_I3:%.*]] = extractelement <4 x ptr> [[BASE]], i64 3646; CHECK-NEXT: [[P_I3:%.*]] = getelementptr i32, ptr [[BASE_I3]], i16 [[A]]647; CHECK-NEXT: [[P_UPTO0:%.*]] = insertelement <4 x ptr> poison, ptr [[P_I0]], i64 0648; CHECK-NEXT: [[P_UPTO1:%.*]] = insertelement <4 x ptr> [[P_UPTO0]], ptr [[P_I1]], i64 1649; CHECK-NEXT: [[P_UPTO2:%.*]] = insertelement <4 x ptr> [[P_UPTO1]], ptr [[P_I2]], i64 2650; CHECK-NEXT: [[P:%.*]] = insertelement <4 x ptr> [[P_UPTO2]], ptr [[P_I3]], i64 3651; CHECK-NEXT: ret <4 x ptr> [[P]]652;653 %p = getelementptr i32, <4 x ptr> %base, i16 %a654 ret <4 x ptr> %p655}656 657define <4 x ptr> @gep3_v4(<4 x ptr> %base, <4 x i16> %a) {658; MIN16-LABEL: @gep3_v4(659; MIN16-NEXT: [[BASE_I0:%.*]] = extractelement <4 x ptr> [[BASE:%.*]], i64 0660; MIN16-NEXT: [[A_I0:%.*]] = extractelement <4 x i16> [[A:%.*]], i64 0661; MIN16-NEXT: [[P_I0:%.*]] = getelementptr i32, ptr [[BASE_I0]], i16 [[A_I0]]662; MIN16-NEXT: [[BASE_I1:%.*]] = extractelement <4 x ptr> [[BASE]], i64 1663; MIN16-NEXT: [[A_I1:%.*]] = extractelement <4 x i16> [[A]], i64 1664; MIN16-NEXT: [[P_I1:%.*]] = getelementptr i32, ptr [[BASE_I1]], i16 [[A_I1]]665; MIN16-NEXT: [[BASE_I2:%.*]] = extractelement <4 x ptr> [[BASE]], i64 2666; MIN16-NEXT: [[A_I2:%.*]] = extractelement <4 x i16> [[A]], i64 2667; MIN16-NEXT: [[P_I2:%.*]] = getelementptr i32, ptr [[BASE_I2]], i16 [[A_I2]]668; MIN16-NEXT: [[BASE_I3:%.*]] = extractelement <4 x ptr> [[BASE]], i64 3669; MIN16-NEXT: [[A_I3:%.*]] = extractelement <4 x i16> [[A]], i64 3670; MIN16-NEXT: [[P_I3:%.*]] = getelementptr i32, ptr [[BASE_I3]], i16 [[A_I3]]671; MIN16-NEXT: [[P_UPTO0:%.*]] = insertelement <4 x ptr> poison, ptr [[P_I0]], i64 0672; MIN16-NEXT: [[P_UPTO1:%.*]] = insertelement <4 x ptr> [[P_UPTO0]], ptr [[P_I1]], i64 1673; MIN16-NEXT: [[P_UPTO2:%.*]] = insertelement <4 x ptr> [[P_UPTO1]], ptr [[P_I2]], i64 2674; MIN16-NEXT: [[P:%.*]] = insertelement <4 x ptr> [[P_UPTO2]], ptr [[P_I3]], i64 3675; MIN16-NEXT: ret <4 x ptr> [[P]]676;677; MIN32-LABEL: @gep3_v4(678; MIN32-NEXT: [[P:%.*]] = getelementptr i32, <4 x ptr> [[BASE:%.*]], <4 x i16> [[A:%.*]]679; MIN32-NEXT: ret <4 x ptr> [[P]]680;681; MIN64-LABEL: @gep3_v4(682; MIN64-NEXT: [[P:%.*]] = getelementptr i32, <4 x ptr> [[BASE:%.*]], <4 x i16> [[A:%.*]]683; MIN64-NEXT: ret <4 x ptr> [[P]]684;685 %p = getelementptr i32, <4 x ptr> %base, <4 x i16> %a686 ret <4 x ptr> %p687}688 689define void @insertelement_v2i16(ptr %p, <2 x i16> %a, i16 %b) {690; MIN16-LABEL: @insertelement_v2i16(691; MIN16-NEXT: [[P_I1:%.*]] = getelementptr i16, ptr [[P:%.*]], i32 1692; MIN16-NEXT: [[A_I0:%.*]] = extractelement <2 x i16> [[A:%.*]], i64 0693; MIN16-NEXT: store i16 [[A_I0]], ptr [[P]], align 4694; MIN16-NEXT: store i16 [[B:%.*]], ptr [[P_I1]], align 2695; MIN16-NEXT: ret void696;697; MIN32-LABEL: @insertelement_v2i16(698; MIN32-NEXT: [[R:%.*]] = insertelement <2 x i16> [[A:%.*]], i16 [[B:%.*]], i64 1699; MIN32-NEXT: store <2 x i16> [[R]], ptr [[P:%.*]], align 4700; MIN32-NEXT: ret void701;702; MIN64-LABEL: @insertelement_v2i16(703; MIN64-NEXT: [[R:%.*]] = insertelement <2 x i16> [[A:%.*]], i16 [[B:%.*]], i64 1704; MIN64-NEXT: store <2 x i16> [[R]], ptr [[P:%.*]], align 4705; MIN64-NEXT: ret void706;707 %r = insertelement <2 x i16> %a, i16 %b, i64 1708 store <2 x i16> %r, ptr %p709 ret void710}711 712define void @insertelement_v3i16(ptr %p, <3 x i16> %a, i16 %b) {713; MIN16-LABEL: @insertelement_v3i16(714; MIN16-NEXT: [[P_I1:%.*]] = getelementptr i16, ptr [[P:%.*]], i32 1715; MIN16-NEXT: [[P_I2:%.*]] = getelementptr i16, ptr [[P]], i32 2716; MIN16-NEXT: [[A_I0:%.*]] = extractelement <3 x i16> [[A:%.*]], i64 0717; MIN16-NEXT: [[A_I1:%.*]] = extractelement <3 x i16> [[A]], i64 1718; MIN16-NEXT: store i16 [[A_I0]], ptr [[P]], align 8719; MIN16-NEXT: store i16 [[A_I1]], ptr [[P_I1]], align 2720; MIN16-NEXT: store i16 [[B:%.*]], ptr [[P_I2]], align 4721; MIN16-NEXT: ret void722;723; MIN32-LABEL: @insertelement_v3i16(724; MIN32-NEXT: [[P_I1:%.*]] = getelementptr <2 x i16>, ptr [[P:%.*]], i32 1725; MIN32-NEXT: [[A_I0:%.*]] = shufflevector <3 x i16> [[A:%.*]], <3 x i16> poison, <2 x i32> <i32 0, i32 1>726; MIN32-NEXT: store <2 x i16> [[A_I0]], ptr [[P]], align 8727; MIN32-NEXT: store i16 [[B:%.*]], ptr [[P_I1]], align 4728; MIN32-NEXT: ret void729;730; MIN64-LABEL: @insertelement_v3i16(731; MIN64-NEXT: [[R:%.*]] = insertelement <3 x i16> [[A:%.*]], i16 [[B:%.*]], i64 2732; MIN64-NEXT: store <3 x i16> [[R]], ptr [[P:%.*]], align 8733; MIN64-NEXT: ret void734;735 %r = insertelement <3 x i16> %a, i16 %b, i64 2736 store <3 x i16> %r, ptr %p737 ret void738}739 740define void @insertelement_v4i16(ptr %p, <4 x i16> %a, i16 %b) {741; MIN16-LABEL: @insertelement_v4i16(742; MIN16-NEXT: [[P_I1:%.*]] = getelementptr i16, ptr [[P:%.*]], i32 1743; MIN16-NEXT: [[P_I2:%.*]] = getelementptr i16, ptr [[P]], i32 2744; MIN16-NEXT: [[P_I3:%.*]] = getelementptr i16, ptr [[P]], i32 3745; MIN16-NEXT: [[A_I0:%.*]] = extractelement <4 x i16> [[A:%.*]], i64 0746; MIN16-NEXT: [[A_I1:%.*]] = extractelement <4 x i16> [[A]], i64 1747; MIN16-NEXT: [[A_I2:%.*]] = extractelement <4 x i16> [[A]], i64 2748; MIN16-NEXT: store i16 [[A_I0]], ptr [[P]], align 8749; MIN16-NEXT: store i16 [[A_I1]], ptr [[P_I1]], align 2750; MIN16-NEXT: store i16 [[A_I2]], ptr [[P_I2]], align 4751; MIN16-NEXT: store i16 [[B:%.*]], ptr [[P_I3]], align 2752; MIN16-NEXT: ret void753;754; MIN32-LABEL: @insertelement_v4i16(755; MIN32-NEXT: [[P_I1:%.*]] = getelementptr <2 x i16>, ptr [[P:%.*]], i32 1756; MIN32-NEXT: [[A_I0:%.*]] = shufflevector <4 x i16> [[A:%.*]], <4 x i16> poison, <2 x i32> <i32 0, i32 1>757; MIN32-NEXT: [[A_I1:%.*]] = shufflevector <4 x i16> [[A]], <4 x i16> poison, <2 x i32> <i32 2, i32 3>758; MIN32-NEXT: [[TMP1:%.*]] = insertelement <2 x i16> [[A_I1]], i16 [[B:%.*]], i64 1759; MIN32-NEXT: store <2 x i16> [[A_I0]], ptr [[P]], align 8760; MIN32-NEXT: store <2 x i16> [[TMP1]], ptr [[P_I1]], align 4761; MIN32-NEXT: ret void762;763; MIN64-LABEL: @insertelement_v4i16(764; MIN64-NEXT: [[R:%.*]] = insertelement <4 x i16> [[A:%.*]], i16 [[B:%.*]], i64 3765; MIN64-NEXT: store <4 x i16> [[R]], ptr [[P:%.*]], align 8766; MIN64-NEXT: ret void767;768 %r = insertelement <4 x i16> %a, i16 %b, i64 3769 store <4 x i16> %r, ptr %p770 ret void771}772 773define <2 x i16> @load_insertelement_v2i16(ptr %pa, i16 %b) {774; MIN16-LABEL: @load_insertelement_v2i16(775; MIN16-NEXT: [[A_I0:%.*]] = load i16, ptr [[PA:%.*]], align 4776; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <2 x i16> poison, i16 [[A_I0]], i64 0777; MIN16-NEXT: [[R:%.*]] = insertelement <2 x i16> [[R_UPTO0]], i16 [[B:%.*]], i64 1778; MIN16-NEXT: ret <2 x i16> [[R]]779;780; MIN32-LABEL: @load_insertelement_v2i16(781; MIN32-NEXT: [[A:%.*]] = load <2 x i16>, ptr [[PA:%.*]], align 4782; MIN32-NEXT: [[R:%.*]] = insertelement <2 x i16> [[A]], i16 [[B:%.*]], i64 1783; MIN32-NEXT: ret <2 x i16> [[R]]784;785; MIN64-LABEL: @load_insertelement_v2i16(786; MIN64-NEXT: [[A:%.*]] = load <2 x i16>, ptr [[PA:%.*]], align 4787; MIN64-NEXT: [[R:%.*]] = insertelement <2 x i16> [[A]], i16 [[B:%.*]], i64 1788; MIN64-NEXT: ret <2 x i16> [[R]]789;790 %a = load <2 x i16>, ptr %pa791 %r = insertelement <2 x i16> %a, i16 %b, i64 1792 ret <2 x i16> %r793}794 795define <3 x i16> @load_insertelement_v3i16(ptr %pa, i16 %b) {796; MIN16-LABEL: @load_insertelement_v3i16(797; MIN16-NEXT: [[A_I0:%.*]] = load i16, ptr [[PA:%.*]], align 8798; MIN16-NEXT: [[PA_I1:%.*]] = getelementptr i16, ptr [[PA]], i32 1799; MIN16-NEXT: [[A_I1:%.*]] = load i16, ptr [[PA_I1]], align 2800; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <3 x i16> poison, i16 [[A_I0]], i64 0801; MIN16-NEXT: [[R_UPTO1:%.*]] = insertelement <3 x i16> [[R_UPTO0]], i16 [[A_I1]], i64 1802; MIN16-NEXT: [[R:%.*]] = insertelement <3 x i16> [[R_UPTO1]], i16 [[B:%.*]], i64 2803; MIN16-NEXT: ret <3 x i16> [[R]]804;805; MIN32-LABEL: @load_insertelement_v3i16(806; MIN32-NEXT: [[A_I0:%.*]] = load <2 x i16>, ptr [[PA:%.*]], align 8807; MIN32-NEXT: [[TMP1:%.*]] = shufflevector <2 x i16> [[A_I0]], <2 x i16> [[A_I0]], <3 x i32> <i32 0, i32 1, i32 poison>808; MIN32-NEXT: [[R:%.*]] = insertelement <3 x i16> [[TMP1]], i16 [[B:%.*]], i64 2809; MIN32-NEXT: ret <3 x i16> [[R]]810;811; MIN64-LABEL: @load_insertelement_v3i16(812; MIN64-NEXT: [[A:%.*]] = load <3 x i16>, ptr [[PA:%.*]], align 8813; MIN64-NEXT: [[R:%.*]] = insertelement <3 x i16> [[A]], i16 [[B:%.*]], i64 2814; MIN64-NEXT: ret <3 x i16> [[R]]815;816 %a = load <3 x i16>, ptr %pa817 %r = insertelement <3 x i16> %a, i16 %b, i64 2818 ret <3 x i16> %r819}820 821define <4 x i16> @load_insertelement_v4i16(ptr %pa, i16 %b) {822; MIN16-LABEL: @load_insertelement_v4i16(823; MIN16-NEXT: [[A_I0:%.*]] = load i16, ptr [[PA:%.*]], align 8824; MIN16-NEXT: [[PA_I1:%.*]] = getelementptr i16, ptr [[PA]], i32 1825; MIN16-NEXT: [[A_I1:%.*]] = load i16, ptr [[PA_I1]], align 2826; MIN16-NEXT: [[PA_I2:%.*]] = getelementptr i16, ptr [[PA]], i32 2827; MIN16-NEXT: [[A_I2:%.*]] = load i16, ptr [[PA_I2]], align 4828; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <4 x i16> poison, i16 [[A_I0]], i64 0829; MIN16-NEXT: [[R_UPTO1:%.*]] = insertelement <4 x i16> [[R_UPTO0]], i16 [[A_I1]], i64 1830; MIN16-NEXT: [[R_UPTO2:%.*]] = insertelement <4 x i16> [[R_UPTO1]], i16 [[A_I2]], i64 2831; MIN16-NEXT: [[R:%.*]] = insertelement <4 x i16> [[R_UPTO2]], i16 [[B:%.*]], i64 3832; MIN16-NEXT: ret <4 x i16> [[R]]833;834; MIN32-LABEL: @load_insertelement_v4i16(835; MIN32-NEXT: [[A_I0:%.*]] = load <2 x i16>, ptr [[PA:%.*]], align 8836; MIN32-NEXT: [[PA_I1:%.*]] = getelementptr <2 x i16>, ptr [[PA]], i32 1837; MIN32-NEXT: [[A_I1:%.*]] = load <2 x i16>, ptr [[PA_I1]], align 4838; MIN32-NEXT: [[TMP1:%.*]] = insertelement <2 x i16> [[A_I1]], i16 [[B:%.*]], i64 1839; MIN32-NEXT: [[TMP2:%.*]] = shufflevector <2 x i16> [[A_I0]], <2 x i16> [[A_I0]], <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>840; MIN32-NEXT: [[TMP3:%.*]] = shufflevector <2 x i16> [[TMP1]], <2 x i16> [[TMP1]], <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>841; MIN32-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[TMP2]], <4 x i16> [[TMP3]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>842; MIN32-NEXT: ret <4 x i16> [[R]]843;844; MIN64-LABEL: @load_insertelement_v4i16(845; MIN64-NEXT: [[A:%.*]] = load <4 x i16>, ptr [[PA:%.*]], align 8846; MIN64-NEXT: [[R:%.*]] = insertelement <4 x i16> [[A]], i16 [[B:%.*]], i64 3847; MIN64-NEXT: ret <4 x i16> [[R]]848;849 %a = load <4 x i16>, ptr %pa850 %r = insertelement <4 x i16> %a, i16 %b, i64 3851 ret <4 x i16> %r852}853 854define void @shufflevector_grow(ptr %pa, ptr %pb) {855; MIN16-LABEL: @shufflevector_grow(856; MIN16-NEXT: [[PA_I2:%.*]] = getelementptr i16, ptr [[PA:%.*]], i32 2857; MIN16-NEXT: [[PA_I3:%.*]] = getelementptr i16, ptr [[PA]], i32 3858; MIN16-NEXT: [[PB_I1:%.*]] = getelementptr i16, ptr [[PB:%.*]], i32 1859; MIN16-NEXT: [[A_I0:%.*]] = load i16, ptr [[PA]], align 4860; MIN16-NEXT: [[PA_I1:%.*]] = getelementptr i16, ptr [[PA]], i32 1861; MIN16-NEXT: [[A_I1:%.*]] = load i16, ptr [[PA_I1]], align 2862; MIN16-NEXT: [[B_I0:%.*]] = load i16, ptr [[PB]], align 4863; MIN16-NEXT: [[B_I1:%.*]] = load i16, ptr [[PB_I1]], align 2864; MIN16-NEXT: store i16 [[A_I0]], ptr [[PA]], align 8865; MIN16-NEXT: store i16 [[A_I1]], ptr [[PA_I1]], align 2866; MIN16-NEXT: store i16 [[B_I0]], ptr [[PA_I2]], align 4867; MIN16-NEXT: store i16 [[B_I1]], ptr [[PA_I3]], align 2868; MIN16-NEXT: ret void869;870; MIN32-LABEL: @shufflevector_grow(871; MIN32-NEXT: [[PA_I1:%.*]] = getelementptr <2 x i16>, ptr [[PA:%.*]], i32 1872; MIN32-NEXT: [[A:%.*]] = load <2 x i16>, ptr [[PA]], align 4873; MIN32-NEXT: [[B:%.*]] = load <2 x i16>, ptr [[PB:%.*]], align 4874; MIN32-NEXT: [[R:%.*]] = shufflevector <2 x i16> [[A]], <2 x i16> [[B]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>875; MIN32-NEXT: [[R_I0:%.*]] = shufflevector <4 x i16> [[R]], <4 x i16> poison, <2 x i32> <i32 0, i32 1>876; MIN32-NEXT: store <2 x i16> [[R_I0]], ptr [[PA]], align 8877; MIN32-NEXT: [[R_I1:%.*]] = shufflevector <4 x i16> [[R]], <4 x i16> poison, <2 x i32> <i32 2, i32 3>878; MIN32-NEXT: store <2 x i16> [[R_I1]], ptr [[PA_I1]], align 4879; MIN32-NEXT: ret void880;881; MIN64-LABEL: @shufflevector_grow(882; MIN64-NEXT: [[A:%.*]] = load <2 x i16>, ptr [[PA:%.*]], align 4883; MIN64-NEXT: [[B:%.*]] = load <2 x i16>, ptr [[PB:%.*]], align 4884; MIN64-NEXT: [[R:%.*]] = shufflevector <2 x i16> [[A]], <2 x i16> [[B]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>885; MIN64-NEXT: store <4 x i16> [[R]], ptr [[PA]], align 8886; MIN64-NEXT: ret void887;888 %a = load <2 x i16>, ptr %pa889 %b = load <2 x i16>, ptr %pb890 %r = shufflevector <2 x i16> %a, <2 x i16> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 3>891 store <4 x i16> %r, ptr %pa892 ret void893}894 895define void @shufflevector_shrink(ptr %pa) {896; MIN16-LABEL: @shufflevector_shrink(897; MIN16-NEXT: [[PA_I1:%.*]] = getelementptr i16, ptr [[PA:%.*]], i32 1898; MIN16-NEXT: [[A_I1:%.*]] = load i16, ptr [[PA_I1]], align 2899; MIN16-NEXT: [[PA_I2:%.*]] = getelementptr i16, ptr [[PA]], i32 2900; MIN16-NEXT: [[A_I2:%.*]] = load i16, ptr [[PA_I2]], align 4901; MIN16-NEXT: store i16 [[A_I1]], ptr [[PA]], align 4902; MIN16-NEXT: store i16 [[A_I2]], ptr [[PA_I1]], align 2903; MIN16-NEXT: ret void904;905; MIN32-LABEL: @shufflevector_shrink(906; MIN32-NEXT: [[A_I0:%.*]] = load <2 x i16>, ptr [[PA:%.*]], align 8907; MIN32-NEXT: [[PA_I1:%.*]] = getelementptr <2 x i16>, ptr [[PA]], i32 1908; MIN32-NEXT: [[A_I1:%.*]] = load <2 x i16>, ptr [[PA_I1]], align 4909; MIN32-NEXT: [[TMP1:%.*]] = shufflevector <2 x i16> [[A_I0]], <2 x i16> [[A_I0]], <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>910; MIN32-NEXT: [[TMP2:%.*]] = shufflevector <2 x i16> [[A_I1]], <2 x i16> [[A_I1]], <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>911; MIN32-NEXT: [[A:%.*]] = shufflevector <4 x i16> [[TMP1]], <4 x i16> [[TMP2]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>912; MIN32-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[A]], <4 x i16> poison, <2 x i32> <i32 1, i32 2>913; MIN32-NEXT: store <2 x i16> [[R]], ptr [[PA]], align 4914; MIN32-NEXT: ret void915;916; MIN64-LABEL: @shufflevector_shrink(917; MIN64-NEXT: [[A:%.*]] = load <4 x i16>, ptr [[PA:%.*]], align 8918; MIN64-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[A]], <4 x i16> poison, <2 x i32> <i32 1, i32 2>919; MIN64-NEXT: store <2 x i16> [[R]], ptr [[PA]], align 4920; MIN64-NEXT: ret void921;922 %a = load <4 x i16>, ptr %pa923 %r = shufflevector <4 x i16> %a, <4 x i16> poison, <2 x i32> <i32 1, i32 2>924 store <2 x i16> %r, ptr %pa925 ret void926}927 928define void @phi_v2f16(ptr %base, i64 %bound) {929; MIN16-LABEL: @phi_v2f16(930; MIN16-NEXT: entry:931; MIN16-NEXT: [[BASE_I1:%.*]] = getelementptr half, ptr [[BASE:%.*]], i32 1932; MIN16-NEXT: br label [[LOOP:%.*]]933; MIN16: loop:934; MIN16-NEXT: [[X_I0:%.*]] = phi half [ 0xH0000, [[ENTRY:%.*]] ], [ [[X_NEXT_I0:%.*]], [[LOOP]] ]935; MIN16-NEXT: [[X_I1:%.*]] = phi half [ 0xH0000, [[ENTRY]] ], [ [[X_NEXT_I1:%.*]], [[LOOP]] ]936; MIN16-NEXT: [[IDX:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[IDX_NEXT:%.*]], [[LOOP]] ]937; MIN16-NEXT: [[P:%.*]] = getelementptr <2 x half>, ptr [[BASE]], i64 [[IDX]]938; MIN16-NEXT: [[A_I0:%.*]] = load half, ptr [[P]], align 2939; MIN16-NEXT: [[P_I1:%.*]] = getelementptr half, ptr [[P]], i32 1940; MIN16-NEXT: [[A_I1:%.*]] = load half, ptr [[P_I1]], align 2941; MIN16-NEXT: [[X_NEXT_I0]] = fadd half [[X_I0]], [[A_I0]]942; MIN16-NEXT: [[X_NEXT_I1]] = fadd half [[X_I1]], [[A_I1]]943; MIN16-NEXT: [[IDX_NEXT]] = add i64 [[IDX]], 1944; MIN16-NEXT: [[CC:%.*]] = icmp ult i64 [[IDX_NEXT]], [[BOUND:%.*]]945; MIN16-NEXT: br i1 [[CC]], label [[LOOP]], label [[END:%.*]]946; MIN16: end:947; MIN16-NEXT: store half [[X_NEXT_I0]], ptr [[BASE]], align 4948; MIN16-NEXT: store half [[X_NEXT_I1]], ptr [[BASE_I1]], align 2949; MIN16-NEXT: ret void950;951; MIN32-LABEL: @phi_v2f16(952; MIN32-NEXT: entry:953; MIN32-NEXT: br label [[LOOP:%.*]]954; MIN32: loop:955; MIN32-NEXT: [[X:%.*]] = phi <2 x half> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP]] ]956; MIN32-NEXT: [[IDX:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[IDX_NEXT:%.*]], [[LOOP]] ]957; MIN32-NEXT: [[P:%.*]] = getelementptr <2 x half>, ptr [[BASE:%.*]], i64 [[IDX]]958; MIN32-NEXT: [[A:%.*]] = load <2 x half>, ptr [[P]], align 2959; MIN32-NEXT: [[X_NEXT]] = fadd <2 x half> [[X]], [[A]]960; MIN32-NEXT: [[IDX_NEXT]] = add i64 [[IDX]], 1961; MIN32-NEXT: [[CC:%.*]] = icmp ult i64 [[IDX_NEXT]], [[BOUND:%.*]]962; MIN32-NEXT: br i1 [[CC]], label [[LOOP]], label [[END:%.*]]963; MIN32: end:964; MIN32-NEXT: store <2 x half> [[X_NEXT]], ptr [[BASE]], align 4965; MIN32-NEXT: ret void966;967; MIN64-LABEL: @phi_v2f16(968; MIN64-NEXT: entry:969; MIN64-NEXT: br label [[LOOP:%.*]]970; MIN64: loop:971; MIN64-NEXT: [[X:%.*]] = phi <2 x half> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP]] ]972; MIN64-NEXT: [[IDX:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[IDX_NEXT:%.*]], [[LOOP]] ]973; MIN64-NEXT: [[P:%.*]] = getelementptr <2 x half>, ptr [[BASE:%.*]], i64 [[IDX]]974; MIN64-NEXT: [[A:%.*]] = load <2 x half>, ptr [[P]], align 2975; MIN64-NEXT: [[X_NEXT]] = fadd <2 x half> [[X]], [[A]]976; MIN64-NEXT: [[IDX_NEXT]] = add i64 [[IDX]], 1977; MIN64-NEXT: [[CC:%.*]] = icmp ult i64 [[IDX_NEXT]], [[BOUND:%.*]]978; MIN64-NEXT: br i1 [[CC]], label [[LOOP]], label [[END:%.*]]979; MIN64: end:980; MIN64-NEXT: store <2 x half> [[X_NEXT]], ptr [[BASE]], align 4981; MIN64-NEXT: ret void982;983entry:984 br label %loop985 986loop:987 %x = phi <2 x half> [ zeroinitializer, %entry ], [ %x.next, %loop ]988 %idx = phi i64 [ 0, %entry ], [ %idx.next, %loop ]989 %p = getelementptr <2 x half>, ptr %base, i64 %idx990 %a = load <2 x half>, ptr %p, align 2991 %x.next = fadd <2 x half> %x, %a992 %idx.next = add i64 %idx, 1993 %cc = icmp ult i64 %idx.next, %bound994 br i1 %cc, label %loop, label %end995 996end:997 store <2 x half> %x.next, ptr %base998 ret void999}1000 1001define void @phi_v3f16(ptr %base, i64 %bound) {1002; MIN16-LABEL: @phi_v3f16(1003; MIN16-NEXT: entry:1004; MIN16-NEXT: [[BASE_I1:%.*]] = getelementptr half, ptr [[BASE:%.*]], i32 11005; MIN16-NEXT: [[BASE_I2:%.*]] = getelementptr half, ptr [[BASE]], i32 21006; MIN16-NEXT: br label [[LOOP:%.*]]1007; MIN16: loop:1008; MIN16-NEXT: [[X_I0:%.*]] = phi half [ 0xH0000, [[ENTRY:%.*]] ], [ [[X_NEXT_I0:%.*]], [[LOOP]] ]1009; MIN16-NEXT: [[X_I1:%.*]] = phi half [ 0xH0000, [[ENTRY]] ], [ [[X_NEXT_I1:%.*]], [[LOOP]] ]1010; MIN16-NEXT: [[X_I2:%.*]] = phi half [ 0xH0000, [[ENTRY]] ], [ [[X_NEXT_I2:%.*]], [[LOOP]] ]1011; MIN16-NEXT: [[IDX:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[IDX_NEXT:%.*]], [[LOOP]] ]1012; MIN16-NEXT: [[P:%.*]] = getelementptr <3 x half>, ptr [[BASE]], i64 [[IDX]]1013; MIN16-NEXT: [[A_I0:%.*]] = load half, ptr [[P]], align 21014; MIN16-NEXT: [[P_I1:%.*]] = getelementptr half, ptr [[P]], i32 11015; MIN16-NEXT: [[A_I1:%.*]] = load half, ptr [[P_I1]], align 21016; MIN16-NEXT: [[P_I2:%.*]] = getelementptr half, ptr [[P]], i32 21017; MIN16-NEXT: [[A_I2:%.*]] = load half, ptr [[P_I2]], align 21018; MIN16-NEXT: [[X_NEXT_I0]] = fadd half [[X_I0]], [[A_I0]]1019; MIN16-NEXT: [[X_NEXT_I1]] = fadd half [[X_I1]], [[A_I1]]1020; MIN16-NEXT: [[X_NEXT_I2]] = fadd half [[X_I2]], [[A_I2]]1021; MIN16-NEXT: [[IDX_NEXT]] = add i64 [[IDX]], 11022; MIN16-NEXT: [[CC:%.*]] = icmp ult i64 [[IDX_NEXT]], [[BOUND:%.*]]1023; MIN16-NEXT: br i1 [[CC]], label [[LOOP]], label [[END:%.*]]1024; MIN16: end:1025; MIN16-NEXT: store half [[X_NEXT_I0]], ptr [[BASE]], align 81026; MIN16-NEXT: store half [[X_NEXT_I1]], ptr [[BASE_I1]], align 21027; MIN16-NEXT: store half [[X_NEXT_I2]], ptr [[BASE_I2]], align 41028; MIN16-NEXT: ret void1029;1030; MIN32-LABEL: @phi_v3f16(1031; MIN32-NEXT: entry:1032; MIN32-NEXT: [[BASE_I1:%.*]] = getelementptr <2 x half>, ptr [[BASE:%.*]], i32 11033; MIN32-NEXT: br label [[LOOP:%.*]]1034; MIN32: loop:1035; MIN32-NEXT: [[X_I0:%.*]] = phi <2 x half> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[X_NEXT_I0:%.*]], [[LOOP]] ]1036; MIN32-NEXT: [[X_I1:%.*]] = phi half [ 0xH0000, [[ENTRY]] ], [ [[X_NEXT_I1:%.*]], [[LOOP]] ]1037; MIN32-NEXT: [[IDX:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[IDX_NEXT:%.*]], [[LOOP]] ]1038; MIN32-NEXT: [[P:%.*]] = getelementptr <3 x half>, ptr [[BASE]], i64 [[IDX]]1039; MIN32-NEXT: [[A_I0:%.*]] = load <2 x half>, ptr [[P]], align 21040; MIN32-NEXT: [[P_I1:%.*]] = getelementptr <2 x half>, ptr [[P]], i32 11041; MIN32-NEXT: [[A_I1:%.*]] = load half, ptr [[P_I1]], align 21042; MIN32-NEXT: [[X_NEXT_I0]] = fadd <2 x half> [[X_I0]], [[A_I0]]1043; MIN32-NEXT: [[X_NEXT_I1]] = fadd half [[X_I1]], [[A_I1]]1044; MIN32-NEXT: [[IDX_NEXT]] = add i64 [[IDX]], 11045; MIN32-NEXT: [[CC:%.*]] = icmp ult i64 [[IDX_NEXT]], [[BOUND:%.*]]1046; MIN32-NEXT: br i1 [[CC]], label [[LOOP]], label [[END:%.*]]1047; MIN32: end:1048; MIN32-NEXT: store <2 x half> [[X_NEXT_I0]], ptr [[BASE]], align 81049; MIN32-NEXT: store half [[X_NEXT_I1]], ptr [[BASE_I1]], align 41050; MIN32-NEXT: ret void1051;1052; MIN64-LABEL: @phi_v3f16(1053; MIN64-NEXT: entry:1054; MIN64-NEXT: br label [[LOOP:%.*]]1055; MIN64: loop:1056; MIN64-NEXT: [[X:%.*]] = phi <3 x half> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP]] ]1057; MIN64-NEXT: [[IDX:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[IDX_NEXT:%.*]], [[LOOP]] ]1058; MIN64-NEXT: [[P:%.*]] = getelementptr <3 x half>, ptr [[BASE:%.*]], i64 [[IDX]]1059; MIN64-NEXT: [[A:%.*]] = load <3 x half>, ptr [[P]], align 21060; MIN64-NEXT: [[X_NEXT]] = fadd <3 x half> [[X]], [[A]]1061; MIN64-NEXT: [[IDX_NEXT]] = add i64 [[IDX]], 11062; MIN64-NEXT: [[CC:%.*]] = icmp ult i64 [[IDX_NEXT]], [[BOUND:%.*]]1063; MIN64-NEXT: br i1 [[CC]], label [[LOOP]], label [[END:%.*]]1064; MIN64: end:1065; MIN64-NEXT: store <3 x half> [[X_NEXT]], ptr [[BASE]], align 81066; MIN64-NEXT: ret void1067;1068entry:1069 br label %loop1070 1071loop:1072 %x = phi <3 x half> [ zeroinitializer, %entry ], [ %x.next, %loop ]1073 %idx = phi i64 [ 0, %entry ], [ %idx.next, %loop ]1074 %p = getelementptr <3 x half>, ptr %base, i64 %idx1075 %a = load <3 x half>, ptr %p, align 21076 %x.next = fadd <3 x half> %x, %a1077 %idx.next = add i64 %idx, 11078 %cc = icmp ult i64 %idx.next, %bound1079 br i1 %cc, label %loop, label %end1080 1081end:1082 store <3 x half> %x.next, ptr %base1083 ret void1084}1085 1086define void @phi_v4f16(ptr %base, i64 %bound) {1087; MIN16-LABEL: @phi_v4f16(1088; MIN16-NEXT: entry:1089; MIN16-NEXT: [[BASE_I1:%.*]] = getelementptr half, ptr [[BASE:%.*]], i32 11090; MIN16-NEXT: [[BASE_I2:%.*]] = getelementptr half, ptr [[BASE]], i32 21091; MIN16-NEXT: [[BASE_I3:%.*]] = getelementptr half, ptr [[BASE]], i32 31092; MIN16-NEXT: br label [[LOOP:%.*]]1093; MIN16: loop:1094; MIN16-NEXT: [[X_I0:%.*]] = phi half [ 0xH0000, [[ENTRY:%.*]] ], [ [[X_NEXT_I0:%.*]], [[LOOP]] ]1095; MIN16-NEXT: [[X_I1:%.*]] = phi half [ 0xH0000, [[ENTRY]] ], [ [[X_NEXT_I1:%.*]], [[LOOP]] ]1096; MIN16-NEXT: [[X_I2:%.*]] = phi half [ 0xH0000, [[ENTRY]] ], [ [[X_NEXT_I2:%.*]], [[LOOP]] ]1097; MIN16-NEXT: [[X_I3:%.*]] = phi half [ 0xH0000, [[ENTRY]] ], [ [[X_NEXT_I3:%.*]], [[LOOP]] ]1098; MIN16-NEXT: [[IDX:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[IDX_NEXT:%.*]], [[LOOP]] ]1099; MIN16-NEXT: [[P:%.*]] = getelementptr <4 x half>, ptr [[BASE]], i64 [[IDX]]1100; MIN16-NEXT: [[A_I0:%.*]] = load half, ptr [[P]], align 21101; MIN16-NEXT: [[P_I1:%.*]] = getelementptr half, ptr [[P]], i32 11102; MIN16-NEXT: [[A_I1:%.*]] = load half, ptr [[P_I1]], align 21103; MIN16-NEXT: [[P_I2:%.*]] = getelementptr half, ptr [[P]], i32 21104; MIN16-NEXT: [[A_I2:%.*]] = load half, ptr [[P_I2]], align 21105; MIN16-NEXT: [[P_I3:%.*]] = getelementptr half, ptr [[P]], i32 31106; MIN16-NEXT: [[A_I3:%.*]] = load half, ptr [[P_I3]], align 21107; MIN16-NEXT: [[X_NEXT_I0]] = fadd half [[X_I0]], [[A_I0]]1108; MIN16-NEXT: [[X_NEXT_I1]] = fadd half [[X_I1]], [[A_I1]]1109; MIN16-NEXT: [[X_NEXT_I2]] = fadd half [[X_I2]], [[A_I2]]1110; MIN16-NEXT: [[X_NEXT_I3]] = fadd half [[X_I3]], [[A_I3]]1111; MIN16-NEXT: [[IDX_NEXT]] = add i64 [[IDX]], 11112; MIN16-NEXT: [[CC:%.*]] = icmp ult i64 [[IDX_NEXT]], [[BOUND:%.*]]1113; MIN16-NEXT: br i1 [[CC]], label [[LOOP]], label [[END:%.*]]1114; MIN16: end:1115; MIN16-NEXT: store half [[X_NEXT_I0]], ptr [[BASE]], align 81116; MIN16-NEXT: store half [[X_NEXT_I1]], ptr [[BASE_I1]], align 21117; MIN16-NEXT: store half [[X_NEXT_I2]], ptr [[BASE_I2]], align 41118; MIN16-NEXT: store half [[X_NEXT_I3]], ptr [[BASE_I3]], align 21119; MIN16-NEXT: ret void1120;1121; MIN32-LABEL: @phi_v4f16(1122; MIN32-NEXT: entry:1123; MIN32-NEXT: [[BASE_I1:%.*]] = getelementptr <2 x half>, ptr [[BASE:%.*]], i32 11124; MIN32-NEXT: br label [[LOOP:%.*]]1125; MIN32: loop:1126; MIN32-NEXT: [[X_I0:%.*]] = phi <2 x half> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[X_NEXT_I0:%.*]], [[LOOP]] ]1127; MIN32-NEXT: [[X_I1:%.*]] = phi <2 x half> [ zeroinitializer, [[ENTRY]] ], [ [[X_NEXT_I1:%.*]], [[LOOP]] ]1128; MIN32-NEXT: [[IDX:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[IDX_NEXT:%.*]], [[LOOP]] ]1129; MIN32-NEXT: [[P:%.*]] = getelementptr <4 x half>, ptr [[BASE]], i64 [[IDX]]1130; MIN32-NEXT: [[A_I0:%.*]] = load <2 x half>, ptr [[P]], align 21131; MIN32-NEXT: [[P_I1:%.*]] = getelementptr <2 x half>, ptr [[P]], i32 11132; MIN32-NEXT: [[A_I1:%.*]] = load <2 x half>, ptr [[P_I1]], align 21133; MIN32-NEXT: [[X_NEXT_I0]] = fadd <2 x half> [[X_I0]], [[A_I0]]1134; MIN32-NEXT: [[X_NEXT_I1]] = fadd <2 x half> [[X_I1]], [[A_I1]]1135; MIN32-NEXT: [[IDX_NEXT]] = add i64 [[IDX]], 11136; MIN32-NEXT: [[CC:%.*]] = icmp ult i64 [[IDX_NEXT]], [[BOUND:%.*]]1137; MIN32-NEXT: br i1 [[CC]], label [[LOOP]], label [[END:%.*]]1138; MIN32: end:1139; MIN32-NEXT: store <2 x half> [[X_NEXT_I0]], ptr [[BASE]], align 81140; MIN32-NEXT: store <2 x half> [[X_NEXT_I1]], ptr [[BASE_I1]], align 41141; MIN32-NEXT: ret void1142;1143; MIN64-LABEL: @phi_v4f16(1144; MIN64-NEXT: entry:1145; MIN64-NEXT: br label [[LOOP:%.*]]1146; MIN64: loop:1147; MIN64-NEXT: [[X:%.*]] = phi <4 x half> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP]] ]1148; MIN64-NEXT: [[IDX:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[IDX_NEXT:%.*]], [[LOOP]] ]1149; MIN64-NEXT: [[P:%.*]] = getelementptr <4 x half>, ptr [[BASE:%.*]], i64 [[IDX]]1150; MIN64-NEXT: [[A:%.*]] = load <4 x half>, ptr [[P]], align 21151; MIN64-NEXT: [[X_NEXT]] = fadd <4 x half> [[X]], [[A]]1152; MIN64-NEXT: [[IDX_NEXT]] = add i64 [[IDX]], 11153; MIN64-NEXT: [[CC:%.*]] = icmp ult i64 [[IDX_NEXT]], [[BOUND:%.*]]1154; MIN64-NEXT: br i1 [[CC]], label [[LOOP]], label [[END:%.*]]1155; MIN64: end:1156; MIN64-NEXT: store <4 x half> [[X_NEXT]], ptr [[BASE]], align 81157; MIN64-NEXT: ret void1158;1159entry:1160 br label %loop1161 1162loop:1163 %x = phi <4 x half> [ zeroinitializer, %entry ], [ %x.next, %loop ]1164 %idx = phi i64 [ 0, %entry ], [ %idx.next, %loop ]1165 %p = getelementptr <4 x half>, ptr %base, i64 %idx1166 %a = load <4 x half>, ptr %p, align 21167 %x.next = fadd <4 x half> %x, %a1168 %idx.next = add i64 %idx, 11169 %cc = icmp ult i64 %idx.next, %bound1170 br i1 %cc, label %loop, label %end1171 1172end:1173 store <4 x half> %x.next, ptr %base1174 ret void1175}1176 1177define <2 x half> @call_v2f16(<2 x half> %a, <2 x half> %b) {1178; MIN16-LABEL: @call_v2f16(1179; MIN16-NEXT: [[A_I0:%.*]] = extractelement <2 x half> [[A:%.*]], i64 01180; MIN16-NEXT: [[B_I0:%.*]] = extractelement <2 x half> [[B:%.*]], i64 01181; MIN16-NEXT: [[R_I0:%.*]] = call half @llvm.minnum.f16(half [[A_I0]], half [[B_I0]])1182; MIN16-NEXT: [[A_I1:%.*]] = extractelement <2 x half> [[A]], i64 11183; MIN16-NEXT: [[B_I1:%.*]] = extractelement <2 x half> [[B]], i64 11184; MIN16-NEXT: [[R_I1:%.*]] = call half @llvm.minnum.f16(half [[A_I1]], half [[B_I1]])1185; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <2 x half> poison, half [[R_I0]], i64 01186; MIN16-NEXT: [[R:%.*]] = insertelement <2 x half> [[R_UPTO0]], half [[R_I1]], i64 11187; MIN16-NEXT: ret <2 x half> [[R]]1188;1189; MIN32-LABEL: @call_v2f16(1190; MIN32-NEXT: [[R:%.*]] = call <2 x half> @llvm.minnum.v2f16(<2 x half> [[A:%.*]], <2 x half> [[B:%.*]])1191; MIN32-NEXT: ret <2 x half> [[R]]1192;1193; MIN64-LABEL: @call_v2f16(1194; MIN64-NEXT: [[R:%.*]] = call <2 x half> @llvm.minnum.v2f16(<2 x half> [[A:%.*]], <2 x half> [[B:%.*]])1195; MIN64-NEXT: ret <2 x half> [[R]]1196;1197 %r = call <2 x half> @llvm.minnum.v2f16(<2 x half> %a, <2 x half> %b)1198 ret <2 x half> %r1199}1200 1201define <3 x half> @call_v3f16(<3 x half> %a, <3 x half> %b) {1202; MIN16-LABEL: @call_v3f16(1203; MIN16-NEXT: [[A_I0:%.*]] = extractelement <3 x half> [[A:%.*]], i64 01204; MIN16-NEXT: [[B_I0:%.*]] = extractelement <3 x half> [[B:%.*]], i64 01205; MIN16-NEXT: [[R_I0:%.*]] = call half @llvm.minnum.f16(half [[A_I0]], half [[B_I0]])1206; MIN16-NEXT: [[A_I1:%.*]] = extractelement <3 x half> [[A]], i64 11207; MIN16-NEXT: [[B_I1:%.*]] = extractelement <3 x half> [[B]], i64 11208; MIN16-NEXT: [[R_I1:%.*]] = call half @llvm.minnum.f16(half [[A_I1]], half [[B_I1]])1209; MIN16-NEXT: [[A_I2:%.*]] = extractelement <3 x half> [[A]], i64 21210; MIN16-NEXT: [[B_I2:%.*]] = extractelement <3 x half> [[B]], i64 21211; MIN16-NEXT: [[R_I2:%.*]] = call half @llvm.minnum.f16(half [[A_I2]], half [[B_I2]])1212; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <3 x half> poison, half [[R_I0]], i64 01213; MIN16-NEXT: [[R_UPTO1:%.*]] = insertelement <3 x half> [[R_UPTO0]], half [[R_I1]], i64 11214; MIN16-NEXT: [[R:%.*]] = insertelement <3 x half> [[R_UPTO1]], half [[R_I2]], i64 21215; MIN16-NEXT: ret <3 x half> [[R]]1216;1217; MIN32-LABEL: @call_v3f16(1218; MIN32-NEXT: [[A_I0:%.*]] = shufflevector <3 x half> [[A:%.*]], <3 x half> poison, <2 x i32> <i32 0, i32 1>1219; MIN32-NEXT: [[B_I0:%.*]] = shufflevector <3 x half> [[B:%.*]], <3 x half> poison, <2 x i32> <i32 0, i32 1>1220; MIN32-NEXT: [[R_I0:%.*]] = call <2 x half> @llvm.minnum.v2f16(<2 x half> [[A_I0]], <2 x half> [[B_I0]])1221; MIN32-NEXT: [[A_I1:%.*]] = extractelement <3 x half> [[A]], i64 21222; MIN32-NEXT: [[B_I1:%.*]] = extractelement <3 x half> [[B]], i64 21223; MIN32-NEXT: [[R_I1:%.*]] = call half @llvm.minnum.f16(half [[A_I1]], half [[B_I1]])1224; MIN32-NEXT: [[TMP1:%.*]] = shufflevector <2 x half> [[R_I0]], <2 x half> [[R_I0]], <3 x i32> <i32 0, i32 1, i32 poison>1225; MIN32-NEXT: [[R:%.*]] = insertelement <3 x half> [[TMP1]], half [[R_I1]], i64 21226; MIN32-NEXT: ret <3 x half> [[R]]1227;1228; MIN64-LABEL: @call_v3f16(1229; MIN64-NEXT: [[R:%.*]] = call <3 x half> @llvm.minnum.v3f16(<3 x half> [[A:%.*]], <3 x half> [[B:%.*]])1230; MIN64-NEXT: ret <3 x half> [[R]]1231;1232 %r = call <3 x half> @llvm.minnum.v3f16(<3 x half> %a, <3 x half> %b)1233 ret <3 x half> %r1234}1235 1236define <4 x half> @call_v4f16(<4 x half> %a, <4 x half> %b) {1237; MIN16-LABEL: @call_v4f16(1238; MIN16-NEXT: [[A_I0:%.*]] = extractelement <4 x half> [[A:%.*]], i64 01239; MIN16-NEXT: [[B_I0:%.*]] = extractelement <4 x half> [[B:%.*]], i64 01240; MIN16-NEXT: [[R_I0:%.*]] = call half @llvm.minnum.f16(half [[A_I0]], half [[B_I0]])1241; MIN16-NEXT: [[A_I1:%.*]] = extractelement <4 x half> [[A]], i64 11242; MIN16-NEXT: [[B_I1:%.*]] = extractelement <4 x half> [[B]], i64 11243; MIN16-NEXT: [[R_I1:%.*]] = call half @llvm.minnum.f16(half [[A_I1]], half [[B_I1]])1244; MIN16-NEXT: [[A_I2:%.*]] = extractelement <4 x half> [[A]], i64 21245; MIN16-NEXT: [[B_I2:%.*]] = extractelement <4 x half> [[B]], i64 21246; MIN16-NEXT: [[R_I2:%.*]] = call half @llvm.minnum.f16(half [[A_I2]], half [[B_I2]])1247; MIN16-NEXT: [[A_I3:%.*]] = extractelement <4 x half> [[A]], i64 31248; MIN16-NEXT: [[B_I3:%.*]] = extractelement <4 x half> [[B]], i64 31249; MIN16-NEXT: [[R_I3:%.*]] = call half @llvm.minnum.f16(half [[A_I3]], half [[B_I3]])1250; MIN16-NEXT: [[R_UPTO0:%.*]] = insertelement <4 x half> poison, half [[R_I0]], i64 01251; MIN16-NEXT: [[R_UPTO1:%.*]] = insertelement <4 x half> [[R_UPTO0]], half [[R_I1]], i64 11252; MIN16-NEXT: [[R_UPTO2:%.*]] = insertelement <4 x half> [[R_UPTO1]], half [[R_I2]], i64 21253; MIN16-NEXT: [[R:%.*]] = insertelement <4 x half> [[R_UPTO2]], half [[R_I3]], i64 31254; MIN16-NEXT: ret <4 x half> [[R]]1255;1256; MIN32-LABEL: @call_v4f16(1257; MIN32-NEXT: [[A_I0:%.*]] = shufflevector <4 x half> [[A:%.*]], <4 x half> poison, <2 x i32> <i32 0, i32 1>1258; MIN32-NEXT: [[B_I0:%.*]] = shufflevector <4 x half> [[B:%.*]], <4 x half> poison, <2 x i32> <i32 0, i32 1>1259; MIN32-NEXT: [[R_I0:%.*]] = call <2 x half> @llvm.minnum.v2f16(<2 x half> [[A_I0]], <2 x half> [[B_I0]])1260; MIN32-NEXT: [[A_I1:%.*]] = shufflevector <4 x half> [[A]], <4 x half> poison, <2 x i32> <i32 2, i32 3>1261; MIN32-NEXT: [[B_I1:%.*]] = shufflevector <4 x half> [[B]], <4 x half> poison, <2 x i32> <i32 2, i32 3>1262; MIN32-NEXT: [[R_I1:%.*]] = call <2 x half> @llvm.minnum.v2f16(<2 x half> [[A_I1]], <2 x half> [[B_I1]])1263; MIN32-NEXT: [[TMP1:%.*]] = shufflevector <2 x half> [[R_I0]], <2 x half> [[R_I0]], <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>1264; MIN32-NEXT: [[TMP2:%.*]] = shufflevector <2 x half> [[R_I1]], <2 x half> [[R_I1]], <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>1265; MIN32-NEXT: [[R:%.*]] = shufflevector <4 x half> [[TMP1]], <4 x half> [[TMP2]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>1266; MIN32-NEXT: ret <4 x half> [[R]]1267;1268; MIN64-LABEL: @call_v4f16(1269; MIN64-NEXT: [[R:%.*]] = call <4 x half> @llvm.minnum.v4f16(<4 x half> [[A:%.*]], <4 x half> [[B:%.*]])1270; MIN64-NEXT: ret <4 x half> [[R]]1271;1272 %r = call <4 x half> @llvm.minnum.v4f16(<4 x half> %a, <4 x half> %b)1273 ret <4 x half> %r1274}1275 1276define <3 x i32> @uadd_with_overflow_v3i32(<3 x i32> %a, <3 x i32> %b) {1277; CHECK-LABEL: @uadd_with_overflow_v3i32(1278; CHECK-NEXT: [[T:%.*]] = call { <3 x i32>, <3 x i1> } @llvm.uadd.with.overflow.v3i32(<3 x i32> [[A:%.*]], <3 x i32> [[B:%.*]])1279; CHECK-NEXT: [[R:%.*]] = extractvalue { <3 x i32>, <3 x i1> } [[T]], 01280; CHECK-NEXT: ret <3 x i32> [[R]]1281;1282 %t = call { <3 x i32>, <3 x i1> } @llvm.uadd.with.overflow.v3i32(<3 x i32> %a, <3 x i32> %b)1283 %r = extractvalue { <3 x i32>, <3 x i1> } %t, 01284 ret <3 x i32> %r1285}1286 1287define noundef <2 x half> @frexp_v2f16(<2 x half> noundef %h) {1288; MIN16-LABEL: @frexp_v2f16(1289; MIN16-NEXT: [[H_I0:%.*]] = extractelement <2 x half> [[H:%.*]], i64 01290; MIN16-NEXT: [[R_I0:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[H_I0]])1291; MIN16-NEXT: [[H_I1:%.*]] = extractelement <2 x half> [[H]], i64 11292; MIN16-NEXT: [[R_I1:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[H_I1]])1293; MIN16-NEXT: [[E0_ELEM0:%.*]] = extractvalue { half, i32 } [[R_I0]], 01294; MIN16-NEXT: [[E0_ELEM01:%.*]] = extractvalue { half, i32 } [[R_I1]], 01295; MIN16-NEXT: [[E0_UPTO0:%.*]] = insertelement <2 x half> poison, half [[E0_ELEM0]], i64 01296; MIN16-NEXT: [[E0:%.*]] = insertelement <2 x half> [[E0_UPTO0]], half [[E0_ELEM01]], i64 11297; MIN16-NEXT: ret <2 x half> [[E0]]1298;1299; MIN32-LABEL: @frexp_v2f16(1300; MIN32-NEXT: [[R:%.*]] = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> [[H:%.*]])1301; MIN32-NEXT: [[E0:%.*]] = extractvalue { <2 x half>, <2 x i32> } [[R]], 01302; MIN32-NEXT: ret <2 x half> [[E0]]1303;1304; MIN64-LABEL: @frexp_v2f16(1305; MIN64-NEXT: [[R:%.*]] = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> [[H:%.*]])1306; MIN64-NEXT: [[E0:%.*]] = extractvalue { <2 x half>, <2 x i32> } [[R]], 01307; MIN64-NEXT: ret <2 x half> [[E0]]1308;1309 %r = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x half> %h)1310 %e0 = extractvalue { <2 x half>, <2 x i32> } %r, 01311 ret <2 x half> %e01312}1313 1314declare <2 x half> @llvm.minnum.v2f16(<2 x half>, <2 x half>)1315declare <3 x half> @llvm.minnum.v3f16(<3 x half>, <3 x half>)1316declare <4 x half> @llvm.minnum.v4f16(<4 x half>, <4 x half>)1317