405 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii -passes=slp-vectorizer %s | FileCheck -check-prefixes=GCN,GFX7 %s3; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -passes=slp-vectorizer %s | FileCheck -check-prefixes=GCN,GFX8 %s4; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -passes=slp-vectorizer %s | FileCheck -check-prefixes=GCN,GFX9 %s5 6define <2 x i16> @uadd_sat_v2i16(<2 x i16> %arg0, <2 x i16> %arg1) {7; GFX7-LABEL: @uadd_sat_v2i16(8; GFX7-NEXT: bb:9; GFX7-NEXT: [[ARG0_0:%.*]] = extractelement <2 x i16> [[ARG0:%.*]], i64 010; GFX7-NEXT: [[ARG0_1:%.*]] = extractelement <2 x i16> [[ARG0]], i64 111; GFX7-NEXT: [[ARG1_0:%.*]] = extractelement <2 x i16> [[ARG1:%.*]], i64 012; GFX7-NEXT: [[ARG1_1:%.*]] = extractelement <2 x i16> [[ARG1]], i64 113; GFX7-NEXT: [[ADD_0:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_0]], i16 [[ARG1_0]])14; GFX7-NEXT: [[ADD_1:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_1]], i16 [[ARG1_1]])15; GFX7-NEXT: [[INS_0:%.*]] = insertelement <2 x i16> undef, i16 [[ADD_0]], i64 016; GFX7-NEXT: [[INS_1:%.*]] = insertelement <2 x i16> [[INS_0]], i16 [[ADD_1]], i64 117; GFX7-NEXT: ret <2 x i16> [[INS_1]]18;19; GFX8-LABEL: @uadd_sat_v2i16(20; GFX8-NEXT: bb:21; GFX8-NEXT: [[ARG0_0:%.*]] = extractelement <2 x i16> [[ARG0:%.*]], i64 022; GFX8-NEXT: [[ARG0_1:%.*]] = extractelement <2 x i16> [[ARG0]], i64 123; GFX8-NEXT: [[ARG1_0:%.*]] = extractelement <2 x i16> [[ARG1:%.*]], i64 024; GFX8-NEXT: [[ARG1_1:%.*]] = extractelement <2 x i16> [[ARG1]], i64 125; GFX8-NEXT: [[ADD_0:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_0]], i16 [[ARG1_0]])26; GFX8-NEXT: [[ADD_1:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_1]], i16 [[ARG1_1]])27; GFX8-NEXT: [[INS_0:%.*]] = insertelement <2 x i16> undef, i16 [[ADD_0]], i64 028; GFX8-NEXT: [[INS_1:%.*]] = insertelement <2 x i16> [[INS_0]], i16 [[ADD_1]], i64 129; GFX8-NEXT: ret <2 x i16> [[INS_1]]30;31; GFX9-LABEL: @uadd_sat_v2i16(32; GFX9-NEXT: bb:33; GFX9-NEXT: [[TMP0:%.*]] = call <2 x i16> @llvm.umin.v2i16(<2 x i16> [[ARG0:%.*]], <2 x i16> [[ARG1:%.*]])34; GFX9-NEXT: ret <2 x i16> [[TMP0]]35;36bb:37 %arg0.0 = extractelement <2 x i16> %arg0, i64 038 %arg0.1 = extractelement <2 x i16> %arg0, i64 139 %arg1.0 = extractelement <2 x i16> %arg1, i64 040 %arg1.1 = extractelement <2 x i16> %arg1, i64 141 %add.0 = call i16 @llvm.umin.i16(i16 %arg0.0, i16 %arg1.0)42 %add.1 = call i16 @llvm.umin.i16(i16 %arg0.1, i16 %arg1.1)43 %ins.0 = insertelement <2 x i16> undef, i16 %add.0, i64 044 %ins.1 = insertelement <2 x i16> %ins.0, i16 %add.1, i64 145 ret <2 x i16> %ins.146}47 48define <2 x i16> @usub_sat_v2i16(<2 x i16> %arg0, <2 x i16> %arg1) {49; GFX7-LABEL: @usub_sat_v2i16(50; GFX7-NEXT: bb:51; GFX7-NEXT: [[ARG0_0:%.*]] = extractelement <2 x i16> [[ARG0:%.*]], i64 052; GFX7-NEXT: [[ARG0_1:%.*]] = extractelement <2 x i16> [[ARG0]], i64 153; GFX7-NEXT: [[ARG1_0:%.*]] = extractelement <2 x i16> [[ARG1:%.*]], i64 054; GFX7-NEXT: [[ARG1_1:%.*]] = extractelement <2 x i16> [[ARG1]], i64 155; GFX7-NEXT: [[ADD_0:%.*]] = call i16 @llvm.umax.i16(i16 [[ARG0_0]], i16 [[ARG1_0]])56; GFX7-NEXT: [[ADD_1:%.*]] = call i16 @llvm.umax.i16(i16 [[ARG0_1]], i16 [[ARG1_1]])57; GFX7-NEXT: [[INS_0:%.*]] = insertelement <2 x i16> undef, i16 [[ADD_0]], i64 058; GFX7-NEXT: [[INS_1:%.*]] = insertelement <2 x i16> [[INS_0]], i16 [[ADD_1]], i64 159; GFX7-NEXT: ret <2 x i16> [[INS_1]]60;61; GFX8-LABEL: @usub_sat_v2i16(62; GFX8-NEXT: bb:63; GFX8-NEXT: [[ARG0_0:%.*]] = extractelement <2 x i16> [[ARG0:%.*]], i64 064; GFX8-NEXT: [[ARG0_1:%.*]] = extractelement <2 x i16> [[ARG0]], i64 165; GFX8-NEXT: [[ARG1_0:%.*]] = extractelement <2 x i16> [[ARG1:%.*]], i64 066; GFX8-NEXT: [[ARG1_1:%.*]] = extractelement <2 x i16> [[ARG1]], i64 167; GFX8-NEXT: [[ADD_0:%.*]] = call i16 @llvm.umax.i16(i16 [[ARG0_0]], i16 [[ARG1_0]])68; GFX8-NEXT: [[ADD_1:%.*]] = call i16 @llvm.umax.i16(i16 [[ARG0_1]], i16 [[ARG1_1]])69; GFX8-NEXT: [[INS_0:%.*]] = insertelement <2 x i16> undef, i16 [[ADD_0]], i64 070; GFX8-NEXT: [[INS_1:%.*]] = insertelement <2 x i16> [[INS_0]], i16 [[ADD_1]], i64 171; GFX8-NEXT: ret <2 x i16> [[INS_1]]72;73; GFX9-LABEL: @usub_sat_v2i16(74; GFX9-NEXT: bb:75; GFX9-NEXT: [[TMP0:%.*]] = call <2 x i16> @llvm.umax.v2i16(<2 x i16> [[ARG0:%.*]], <2 x i16> [[ARG1:%.*]])76; GFX9-NEXT: ret <2 x i16> [[TMP0]]77;78bb:79 %arg0.0 = extractelement <2 x i16> %arg0, i64 080 %arg0.1 = extractelement <2 x i16> %arg0, i64 181 %arg1.0 = extractelement <2 x i16> %arg1, i64 082 %arg1.1 = extractelement <2 x i16> %arg1, i64 183 %add.0 = call i16 @llvm.umax.i16(i16 %arg0.0, i16 %arg1.0)84 %add.1 = call i16 @llvm.umax.i16(i16 %arg0.1, i16 %arg1.1)85 %ins.0 = insertelement <2 x i16> undef, i16 %add.0, i64 086 %ins.1 = insertelement <2 x i16> %ins.0, i16 %add.1, i64 187 ret <2 x i16> %ins.188}89 90define <2 x i16> @sadd_sat_v2i16(<2 x i16> %arg0, <2 x i16> %arg1) {91; GFX7-LABEL: @sadd_sat_v2i16(92; GFX7-NEXT: bb:93; GFX7-NEXT: [[ARG0_0:%.*]] = extractelement <2 x i16> [[ARG0:%.*]], i64 094; GFX7-NEXT: [[ARG0_1:%.*]] = extractelement <2 x i16> [[ARG0]], i64 195; GFX7-NEXT: [[ARG1_0:%.*]] = extractelement <2 x i16> [[ARG1:%.*]], i64 096; GFX7-NEXT: [[ARG1_1:%.*]] = extractelement <2 x i16> [[ARG1]], i64 197; GFX7-NEXT: [[ADD_0:%.*]] = call i16 @llvm.smin.i16(i16 [[ARG0_0]], i16 [[ARG1_0]])98; GFX7-NEXT: [[ADD_1:%.*]] = call i16 @llvm.smin.i16(i16 [[ARG0_1]], i16 [[ARG1_1]])99; GFX7-NEXT: [[INS_0:%.*]] = insertelement <2 x i16> undef, i16 [[ADD_0]], i64 0100; GFX7-NEXT: [[INS_1:%.*]] = insertelement <2 x i16> [[INS_0]], i16 [[ADD_1]], i64 1101; GFX7-NEXT: ret <2 x i16> [[INS_1]]102;103; GFX8-LABEL: @sadd_sat_v2i16(104; GFX8-NEXT: bb:105; GFX8-NEXT: [[ARG0_0:%.*]] = extractelement <2 x i16> [[ARG0:%.*]], i64 0106; GFX8-NEXT: [[ARG0_1:%.*]] = extractelement <2 x i16> [[ARG0]], i64 1107; GFX8-NEXT: [[ARG1_0:%.*]] = extractelement <2 x i16> [[ARG1:%.*]], i64 0108; GFX8-NEXT: [[ARG1_1:%.*]] = extractelement <2 x i16> [[ARG1]], i64 1109; GFX8-NEXT: [[ADD_0:%.*]] = call i16 @llvm.smin.i16(i16 [[ARG0_0]], i16 [[ARG1_0]])110; GFX8-NEXT: [[ADD_1:%.*]] = call i16 @llvm.smin.i16(i16 [[ARG0_1]], i16 [[ARG1_1]])111; GFX8-NEXT: [[INS_0:%.*]] = insertelement <2 x i16> undef, i16 [[ADD_0]], i64 0112; GFX8-NEXT: [[INS_1:%.*]] = insertelement <2 x i16> [[INS_0]], i16 [[ADD_1]], i64 1113; GFX8-NEXT: ret <2 x i16> [[INS_1]]114;115; GFX9-LABEL: @sadd_sat_v2i16(116; GFX9-NEXT: bb:117; GFX9-NEXT: [[TMP0:%.*]] = call <2 x i16> @llvm.smin.v2i16(<2 x i16> [[ARG0:%.*]], <2 x i16> [[ARG1:%.*]])118; GFX9-NEXT: ret <2 x i16> [[TMP0]]119;120bb:121 %arg0.0 = extractelement <2 x i16> %arg0, i64 0122 %arg0.1 = extractelement <2 x i16> %arg0, i64 1123 %arg1.0 = extractelement <2 x i16> %arg1, i64 0124 %arg1.1 = extractelement <2 x i16> %arg1, i64 1125 %add.0 = call i16 @llvm.smin.i16(i16 %arg0.0, i16 %arg1.0)126 %add.1 = call i16 @llvm.smin.i16(i16 %arg0.1, i16 %arg1.1)127 %ins.0 = insertelement <2 x i16> undef, i16 %add.0, i64 0128 %ins.1 = insertelement <2 x i16> %ins.0, i16 %add.1, i64 1129 ret <2 x i16> %ins.1130}131 132define <2 x i16> @ssub_sat_v2i16(<2 x i16> %arg0, <2 x i16> %arg1) {133; GFX7-LABEL: @ssub_sat_v2i16(134; GFX7-NEXT: bb:135; GFX7-NEXT: [[ARG0_0:%.*]] = extractelement <2 x i16> [[ARG0:%.*]], i64 0136; GFX7-NEXT: [[ARG0_1:%.*]] = extractelement <2 x i16> [[ARG0]], i64 1137; GFX7-NEXT: [[ARG1_0:%.*]] = extractelement <2 x i16> [[ARG1:%.*]], i64 0138; GFX7-NEXT: [[ARG1_1:%.*]] = extractelement <2 x i16> [[ARG1]], i64 1139; GFX7-NEXT: [[ADD_0:%.*]] = call i16 @llvm.smax.i16(i16 [[ARG0_0]], i16 [[ARG1_0]])140; GFX7-NEXT: [[ADD_1:%.*]] = call i16 @llvm.smax.i16(i16 [[ARG0_1]], i16 [[ARG1_1]])141; GFX7-NEXT: [[INS_0:%.*]] = insertelement <2 x i16> undef, i16 [[ADD_0]], i64 0142; GFX7-NEXT: [[INS_1:%.*]] = insertelement <2 x i16> [[INS_0]], i16 [[ADD_1]], i64 1143; GFX7-NEXT: ret <2 x i16> [[INS_1]]144;145; GFX8-LABEL: @ssub_sat_v2i16(146; GFX8-NEXT: bb:147; GFX8-NEXT: [[ARG0_0:%.*]] = extractelement <2 x i16> [[ARG0:%.*]], i64 0148; GFX8-NEXT: [[ARG0_1:%.*]] = extractelement <2 x i16> [[ARG0]], i64 1149; GFX8-NEXT: [[ARG1_0:%.*]] = extractelement <2 x i16> [[ARG1:%.*]], i64 0150; GFX8-NEXT: [[ARG1_1:%.*]] = extractelement <2 x i16> [[ARG1]], i64 1151; GFX8-NEXT: [[ADD_0:%.*]] = call i16 @llvm.smax.i16(i16 [[ARG0_0]], i16 [[ARG1_0]])152; GFX8-NEXT: [[ADD_1:%.*]] = call i16 @llvm.smax.i16(i16 [[ARG0_1]], i16 [[ARG1_1]])153; GFX8-NEXT: [[INS_0:%.*]] = insertelement <2 x i16> undef, i16 [[ADD_0]], i64 0154; GFX8-NEXT: [[INS_1:%.*]] = insertelement <2 x i16> [[INS_0]], i16 [[ADD_1]], i64 1155; GFX8-NEXT: ret <2 x i16> [[INS_1]]156;157; GFX9-LABEL: @ssub_sat_v2i16(158; GFX9-NEXT: bb:159; GFX9-NEXT: [[TMP0:%.*]] = call <2 x i16> @llvm.smax.v2i16(<2 x i16> [[ARG0:%.*]], <2 x i16> [[ARG1:%.*]])160; GFX9-NEXT: ret <2 x i16> [[TMP0]]161;162bb:163 %arg0.0 = extractelement <2 x i16> %arg0, i64 0164 %arg0.1 = extractelement <2 x i16> %arg0, i64 1165 %arg1.0 = extractelement <2 x i16> %arg1, i64 0166 %arg1.1 = extractelement <2 x i16> %arg1, i64 1167 %add.0 = call i16 @llvm.smax.i16(i16 %arg0.0, i16 %arg1.0)168 %add.1 = call i16 @llvm.smax.i16(i16 %arg0.1, i16 %arg1.1)169 %ins.0 = insertelement <2 x i16> undef, i16 %add.0, i64 0170 %ins.1 = insertelement <2 x i16> %ins.0, i16 %add.1, i64 1171 ret <2 x i16> %ins.1172}173 174define <2 x i32> @uadd_sat_v2i32(<2 x i32> %arg0, <2 x i32> %arg1) {175; GCN-LABEL: @uadd_sat_v2i32(176; GCN-NEXT: bb:177; GCN-NEXT: [[ARG0_0:%.*]] = extractelement <2 x i32> [[ARG0:%.*]], i64 0178; GCN-NEXT: [[ARG0_1:%.*]] = extractelement <2 x i32> [[ARG0]], i64 1179; GCN-NEXT: [[ARG1_0:%.*]] = extractelement <2 x i32> [[ARG1:%.*]], i64 0180; GCN-NEXT: [[ARG1_1:%.*]] = extractelement <2 x i32> [[ARG1]], i64 1181; GCN-NEXT: [[ADD_0:%.*]] = call i32 @llvm.umin.i32(i32 [[ARG0_0]], i32 [[ARG1_0]])182; GCN-NEXT: [[ADD_1:%.*]] = call i32 @llvm.umin.i32(i32 [[ARG0_1]], i32 [[ARG1_1]])183; GCN-NEXT: [[INS_0:%.*]] = insertelement <2 x i32> undef, i32 [[ADD_0]], i64 0184; GCN-NEXT: [[INS_1:%.*]] = insertelement <2 x i32> [[INS_0]], i32 [[ADD_1]], i64 1185; GCN-NEXT: ret <2 x i32> [[INS_1]]186;187bb:188 %arg0.0 = extractelement <2 x i32> %arg0, i64 0189 %arg0.1 = extractelement <2 x i32> %arg0, i64 1190 %arg1.0 = extractelement <2 x i32> %arg1, i64 0191 %arg1.1 = extractelement <2 x i32> %arg1, i64 1192 %add.0 = call i32 @llvm.umin.i32(i32 %arg0.0, i32 %arg1.0)193 %add.1 = call i32 @llvm.umin.i32(i32 %arg0.1, i32 %arg1.1)194 %ins.0 = insertelement <2 x i32> undef, i32 %add.0, i64 0195 %ins.1 = insertelement <2 x i32> %ins.0, i32 %add.1, i64 1196 ret <2 x i32> %ins.1197}198 199define <2 x i32> @usub_sat_v2i32(<2 x i32> %arg0, <2 x i32> %arg1) {200; GCN-LABEL: @usub_sat_v2i32(201; GCN-NEXT: bb:202; GCN-NEXT: [[ARG0_0:%.*]] = extractelement <2 x i32> [[ARG0:%.*]], i64 0203; GCN-NEXT: [[ARG0_1:%.*]] = extractelement <2 x i32> [[ARG0]], i64 1204; GCN-NEXT: [[ARG1_0:%.*]] = extractelement <2 x i32> [[ARG1:%.*]], i64 0205; GCN-NEXT: [[ARG1_1:%.*]] = extractelement <2 x i32> [[ARG1]], i64 1206; GCN-NEXT: [[ADD_0:%.*]] = call i32 @llvm.umax.i32(i32 [[ARG0_0]], i32 [[ARG1_0]])207; GCN-NEXT: [[ADD_1:%.*]] = call i32 @llvm.umax.i32(i32 [[ARG0_1]], i32 [[ARG1_1]])208; GCN-NEXT: [[INS_0:%.*]] = insertelement <2 x i32> undef, i32 [[ADD_0]], i64 0209; GCN-NEXT: [[INS_1:%.*]] = insertelement <2 x i32> [[INS_0]], i32 [[ADD_1]], i64 1210; GCN-NEXT: ret <2 x i32> [[INS_1]]211;212bb:213 %arg0.0 = extractelement <2 x i32> %arg0, i64 0214 %arg0.1 = extractelement <2 x i32> %arg0, i64 1215 %arg1.0 = extractelement <2 x i32> %arg1, i64 0216 %arg1.1 = extractelement <2 x i32> %arg1, i64 1217 %add.0 = call i32 @llvm.umax.i32(i32 %arg0.0, i32 %arg1.0)218 %add.1 = call i32 @llvm.umax.i32(i32 %arg0.1, i32 %arg1.1)219 %ins.0 = insertelement <2 x i32> undef, i32 %add.0, i64 0220 %ins.1 = insertelement <2 x i32> %ins.0, i32 %add.1, i64 1221 ret <2 x i32> %ins.1222}223 224define <2 x i32> @sadd_sat_v2i32(<2 x i32> %arg0, <2 x i32> %arg1) {225; GCN-LABEL: @sadd_sat_v2i32(226; GCN-NEXT: bb:227; GCN-NEXT: [[ARG0_0:%.*]] = extractelement <2 x i32> [[ARG0:%.*]], i64 0228; GCN-NEXT: [[ARG0_1:%.*]] = extractelement <2 x i32> [[ARG0]], i64 1229; GCN-NEXT: [[ARG1_0:%.*]] = extractelement <2 x i32> [[ARG1:%.*]], i64 0230; GCN-NEXT: [[ARG1_1:%.*]] = extractelement <2 x i32> [[ARG1]], i64 1231; GCN-NEXT: [[ADD_0:%.*]] = call i32 @llvm.smin.i32(i32 [[ARG0_0]], i32 [[ARG1_0]])232; GCN-NEXT: [[ADD_1:%.*]] = call i32 @llvm.smin.i32(i32 [[ARG0_1]], i32 [[ARG1_1]])233; GCN-NEXT: [[INS_0:%.*]] = insertelement <2 x i32> undef, i32 [[ADD_0]], i64 0234; GCN-NEXT: [[INS_1:%.*]] = insertelement <2 x i32> [[INS_0]], i32 [[ADD_1]], i64 1235; GCN-NEXT: ret <2 x i32> [[INS_1]]236;237bb:238 %arg0.0 = extractelement <2 x i32> %arg0, i64 0239 %arg0.1 = extractelement <2 x i32> %arg0, i64 1240 %arg1.0 = extractelement <2 x i32> %arg1, i64 0241 %arg1.1 = extractelement <2 x i32> %arg1, i64 1242 %add.0 = call i32 @llvm.smin.i32(i32 %arg0.0, i32 %arg1.0)243 %add.1 = call i32 @llvm.smin.i32(i32 %arg0.1, i32 %arg1.1)244 %ins.0 = insertelement <2 x i32> undef, i32 %add.0, i64 0245 %ins.1 = insertelement <2 x i32> %ins.0, i32 %add.1, i64 1246 ret <2 x i32> %ins.1247}248 249define <2 x i32> @ssub_sat_v2i32(<2 x i32> %arg0, <2 x i32> %arg1) {250; GCN-LABEL: @ssub_sat_v2i32(251; GCN-NEXT: bb:252; GCN-NEXT: [[ARG0_0:%.*]] = extractelement <2 x i32> [[ARG0:%.*]], i64 0253; GCN-NEXT: [[ARG0_1:%.*]] = extractelement <2 x i32> [[ARG0]], i64 1254; GCN-NEXT: [[ARG1_0:%.*]] = extractelement <2 x i32> [[ARG1:%.*]], i64 0255; GCN-NEXT: [[ARG1_1:%.*]] = extractelement <2 x i32> [[ARG1]], i64 1256; GCN-NEXT: [[ADD_0:%.*]] = call i32 @llvm.smax.i32(i32 [[ARG0_0]], i32 [[ARG1_0]])257; GCN-NEXT: [[ADD_1:%.*]] = call i32 @llvm.smax.i32(i32 [[ARG0_1]], i32 [[ARG1_1]])258; GCN-NEXT: [[INS_0:%.*]] = insertelement <2 x i32> undef, i32 [[ADD_0]], i64 0259; GCN-NEXT: [[INS_1:%.*]] = insertelement <2 x i32> [[INS_0]], i32 [[ADD_1]], i64 1260; GCN-NEXT: ret <2 x i32> [[INS_1]]261;262bb:263 %arg0.0 = extractelement <2 x i32> %arg0, i64 0264 %arg0.1 = extractelement <2 x i32> %arg0, i64 1265 %arg1.0 = extractelement <2 x i32> %arg1, i64 0266 %arg1.1 = extractelement <2 x i32> %arg1, i64 1267 %add.0 = call i32 @llvm.smax.i32(i32 %arg0.0, i32 %arg1.0)268 %add.1 = call i32 @llvm.smax.i32(i32 %arg0.1, i32 %arg1.1)269 %ins.0 = insertelement <2 x i32> undef, i32 %add.0, i64 0270 %ins.1 = insertelement <2 x i32> %ins.0, i32 %add.1, i64 1271 ret <2 x i32> %ins.1272}273 274define <3 x i16> @uadd_sat_v3i16(<3 x i16> %arg0, <3 x i16> %arg1) {275; GFX7-LABEL: @uadd_sat_v3i16(276; GFX7-NEXT: bb:277; GFX7-NEXT: [[ARG0_0:%.*]] = extractelement <3 x i16> [[ARG0:%.*]], i64 0278; GFX7-NEXT: [[ARG0_1:%.*]] = extractelement <3 x i16> [[ARG0]], i64 1279; GFX7-NEXT: [[ARG0_2:%.*]] = extractelement <3 x i16> [[ARG0]], i64 2280; GFX7-NEXT: [[ARG1_0:%.*]] = extractelement <3 x i16> [[ARG1:%.*]], i64 0281; GFX7-NEXT: [[ARG1_1:%.*]] = extractelement <3 x i16> [[ARG1]], i64 1282; GFX7-NEXT: [[ARG1_2:%.*]] = extractelement <3 x i16> [[ARG1]], i64 2283; GFX7-NEXT: [[ADD_0:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_0]], i16 [[ARG1_0]])284; GFX7-NEXT: [[ADD_1:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_1]], i16 [[ARG1_1]])285; GFX7-NEXT: [[ADD_2:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_2]], i16 [[ARG1_2]])286; GFX7-NEXT: [[INS_0:%.*]] = insertelement <3 x i16> undef, i16 [[ADD_0]], i64 0287; GFX7-NEXT: [[INS_1:%.*]] = insertelement <3 x i16> [[INS_0]], i16 [[ADD_1]], i64 1288; GFX7-NEXT: [[INS_2:%.*]] = insertelement <3 x i16> [[INS_1]], i16 [[ADD_2]], i64 2289; GFX7-NEXT: ret <3 x i16> [[INS_2]]290;291; GFX8-LABEL: @uadd_sat_v3i16(292; GFX8-NEXT: bb:293; GFX8-NEXT: [[ARG0_0:%.*]] = extractelement <3 x i16> [[ARG0:%.*]], i64 0294; GFX8-NEXT: [[ARG0_1:%.*]] = extractelement <3 x i16> [[ARG0]], i64 1295; GFX8-NEXT: [[ARG0_2:%.*]] = extractelement <3 x i16> [[ARG0]], i64 2296; GFX8-NEXT: [[ARG1_0:%.*]] = extractelement <3 x i16> [[ARG1:%.*]], i64 0297; GFX8-NEXT: [[ARG1_1:%.*]] = extractelement <3 x i16> [[ARG1]], i64 1298; GFX8-NEXT: [[ARG1_2:%.*]] = extractelement <3 x i16> [[ARG1]], i64 2299; GFX8-NEXT: [[ADD_0:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_0]], i16 [[ARG1_0]])300; GFX8-NEXT: [[ADD_1:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_1]], i16 [[ARG1_1]])301; GFX8-NEXT: [[ADD_2:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_2]], i16 [[ARG1_2]])302; GFX8-NEXT: [[INS_0:%.*]] = insertelement <3 x i16> undef, i16 [[ADD_0]], i64 0303; GFX8-NEXT: [[INS_1:%.*]] = insertelement <3 x i16> [[INS_0]], i16 [[ADD_1]], i64 1304; GFX8-NEXT: [[INS_2:%.*]] = insertelement <3 x i16> [[INS_1]], i16 [[ADD_2]], i64 2305; GFX8-NEXT: ret <3 x i16> [[INS_2]]306;307; GFX9-LABEL: @uadd_sat_v3i16(308; GFX9-NEXT: bb:309; GFX9-NEXT: [[ARG0_2:%.*]] = extractelement <3 x i16> [[ARG0:%.*]], i64 2310; GFX9-NEXT: [[ARG1_2:%.*]] = extractelement <3 x i16> [[ARG1:%.*]], i64 2311; GFX9-NEXT: [[TMP3:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <2 x i32> <i32 0, i32 1>312; GFX9-NEXT: [[TMP1:%.*]] = shufflevector <3 x i16> [[ARG1]], <3 x i16> poison, <2 x i32> <i32 0, i32 1>313; GFX9-NEXT: [[TMP2:%.*]] = call <2 x i16> @llvm.umin.v2i16(<2 x i16> [[TMP3]], <2 x i16> [[TMP1]])314; GFX9-NEXT: [[ADD_2:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_2]], i16 [[ARG1_2]])315; GFX9-NEXT: [[TMP0:%.*]] = shufflevector <2 x i16> [[TMP2]], <2 x i16> poison, <3 x i32> <i32 0, i32 1, i32 poison>316; GFX9-NEXT: [[INS_2:%.*]] = insertelement <3 x i16> [[TMP0]], i16 [[ADD_2]], i64 2317; GFX9-NEXT: ret <3 x i16> [[INS_2]]318;319bb:320 %arg0.0 = extractelement <3 x i16> %arg0, i64 0321 %arg0.1 = extractelement <3 x i16> %arg0, i64 1322 %arg0.2 = extractelement <3 x i16> %arg0, i64 2323 %arg1.0 = extractelement <3 x i16> %arg1, i64 0324 %arg1.1 = extractelement <3 x i16> %arg1, i64 1325 %arg1.2 = extractelement <3 x i16> %arg1, i64 2326 %add.0 = call i16 @llvm.umin.i16(i16 %arg0.0, i16 %arg1.0)327 %add.1 = call i16 @llvm.umin.i16(i16 %arg0.1, i16 %arg1.1)328 %add.2 = call i16 @llvm.umin.i16(i16 %arg0.2, i16 %arg1.2)329 %ins.0 = insertelement <3 x i16> undef, i16 %add.0, i64 0330 %ins.1 = insertelement <3 x i16> %ins.0, i16 %add.1, i64 1331 %ins.2 = insertelement <3 x i16> %ins.1, i16 %add.2, i64 2332 ret <3 x i16> %ins.2333}334 335define <4 x i16> @uadd_sat_v4i16(<4 x i16> %arg0, <4 x i16> %arg1) {336; GFX7-LABEL: @uadd_sat_v4i16(337; GFX7-NEXT: bb:338; GFX7-NEXT: [[ARG0_0:%.*]] = extractelement <4 x i16> [[ARG0:%.*]], i64 0339; GFX7-NEXT: [[ARG0_1:%.*]] = extractelement <4 x i16> [[ARG0]], i64 1340; GFX7-NEXT: [[ARG0_2:%.*]] = extractelement <4 x i16> [[ARG0]], i64 2341; GFX7-NEXT: [[ARG0_3:%.*]] = extractelement <4 x i16> [[ARG0]], i64 3342; GFX7-NEXT: [[ARG1_0:%.*]] = extractelement <4 x i16> [[ARG1:%.*]], i64 0343; GFX7-NEXT: [[ARG1_1:%.*]] = extractelement <4 x i16> [[ARG1]], i64 1344; GFX7-NEXT: [[ARG1_2:%.*]] = extractelement <4 x i16> [[ARG1]], i64 2345; GFX7-NEXT: [[ARG1_3:%.*]] = extractelement <4 x i16> [[ARG1]], i64 3346; GFX7-NEXT: [[ADD_0:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_0]], i16 [[ARG1_0]])347; GFX7-NEXT: [[ADD_1:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_1]], i16 [[ARG1_1]])348; GFX7-NEXT: [[ADD_2:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_2]], i16 [[ARG1_2]])349; GFX7-NEXT: [[ADD_3:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_3]], i16 [[ARG1_3]])350; GFX7-NEXT: [[INS_0:%.*]] = insertelement <4 x i16> undef, i16 [[ADD_0]], i64 0351; GFX7-NEXT: [[INS_1:%.*]] = insertelement <4 x i16> [[INS_0]], i16 [[ADD_1]], i64 1352; GFX7-NEXT: [[INS_2:%.*]] = insertelement <4 x i16> [[INS_1]], i16 [[ADD_2]], i64 2353; GFX7-NEXT: [[INS_3:%.*]] = insertelement <4 x i16> [[INS_2]], i16 [[ADD_3]], i64 3354; GFX7-NEXT: ret <4 x i16> [[INS_3]]355;356; GFX8-LABEL: @uadd_sat_v4i16(357; GFX8-NEXT: bb:358; GFX8-NEXT: [[ARG0_0:%.*]] = extractelement <4 x i16> [[ARG0:%.*]], i64 0359; GFX8-NEXT: [[ARG0_1:%.*]] = extractelement <4 x i16> [[ARG0]], i64 1360; GFX8-NEXT: [[ARG1_0:%.*]] = extractelement <4 x i16> [[ARG1:%.*]], i64 0361; GFX8-NEXT: [[ARG1_1:%.*]] = extractelement <4 x i16> [[ARG1]], i64 1362; GFX8-NEXT: [[ADD_0:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_0]], i16 [[ARG1_0]])363; GFX8-NEXT: [[ADD_1:%.*]] = call i16 @llvm.umin.i16(i16 [[ARG0_1]], i16 [[ARG1_1]])364; GFX8-NEXT: [[TMP0:%.*]] = shufflevector <4 x i16> [[ARG0]], <4 x i16> poison, <2 x i32> <i32 2, i32 3>365; GFX8-NEXT: [[TMP3:%.*]] = shufflevector <4 x i16> [[ARG1]], <4 x i16> poison, <2 x i32> <i32 2, i32 3>366; GFX8-NEXT: [[TMP1:%.*]] = call <2 x i16> @llvm.umin.v2i16(<2 x i16> [[TMP0]], <2 x i16> [[TMP3]])367; GFX8-NEXT: [[INS_0:%.*]] = insertelement <4 x i16> undef, i16 [[ADD_0]], i64 0368; GFX8-NEXT: [[INS_1:%.*]] = insertelement <4 x i16> [[INS_0]], i16 [[ADD_1]], i64 1369; GFX8-NEXT: [[TMP2:%.*]] = shufflevector <2 x i16> [[TMP1]], <2 x i16> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>370; GFX8-NEXT: [[INS_31:%.*]] = shufflevector <4 x i16> [[INS_1]], <4 x i16> [[TMP2]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>371; GFX8-NEXT: ret <4 x i16> [[INS_31]]372;373; GFX9-LABEL: @uadd_sat_v4i16(374; GFX9-NEXT: bb:375; GFX9-NEXT: [[TMP6:%.*]] = shufflevector <4 x i16> [[TMP1:%.*]], <4 x i16> poison, <2 x i32> <i32 0, i32 1>376; GFX9-NEXT: [[TMP7:%.*]] = shufflevector <4 x i16> [[ARG1:%.*]], <4 x i16> poison, <2 x i32> <i32 0, i32 1>377; GFX9-NEXT: [[TMP8:%.*]] = call <2 x i16> @llvm.umin.v2i16(<2 x i16> [[TMP6]], <2 x i16> [[TMP7]])378; GFX9-NEXT: [[TMP2:%.*]] = shufflevector <4 x i16> [[TMP1]], <4 x i16> poison, <2 x i32> <i32 2, i32 3>379; GFX9-NEXT: [[TMP4:%.*]] = shufflevector <4 x i16> [[ARG1]], <4 x i16> poison, <2 x i32> <i32 2, i32 3>380; GFX9-NEXT: [[TMP5:%.*]] = call <2 x i16> @llvm.umin.v2i16(<2 x i16> [[TMP2]], <2 x i16> [[TMP4]])381; GFX9-NEXT: [[TMP0:%.*]] = shufflevector <2 x i16> [[TMP8]], <2 x i16> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>382; GFX9-NEXT: [[TMP3:%.*]] = shufflevector <2 x i16> [[TMP5]], <2 x i16> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>383; GFX9-NEXT: [[INS_31:%.*]] = shufflevector <4 x i16> [[TMP0]], <4 x i16> [[TMP3]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>384; GFX9-NEXT: ret <4 x i16> [[INS_31]]385;386bb:387 %arg0.0 = extractelement <4 x i16> %arg0, i64 0388 %arg0.1 = extractelement <4 x i16> %arg0, i64 1389 %arg0.2 = extractelement <4 x i16> %arg0, i64 2390 %arg0.3 = extractelement <4 x i16> %arg0, i64 3391 %arg1.0 = extractelement <4 x i16> %arg1, i64 0392 %arg1.1 = extractelement <4 x i16> %arg1, i64 1393 %arg1.2 = extractelement <4 x i16> %arg1, i64 2394 %arg1.3 = extractelement <4 x i16> %arg1, i64 3395 %add.0 = call i16 @llvm.umin.i16(i16 %arg0.0, i16 %arg1.0)396 %add.1 = call i16 @llvm.umin.i16(i16 %arg0.1, i16 %arg1.1)397 %add.2 = call i16 @llvm.umin.i16(i16 %arg0.2, i16 %arg1.2)398 %add.3 = call i16 @llvm.umin.i16(i16 %arg0.3, i16 %arg1.3)399 %ins.0 = insertelement <4 x i16> undef, i16 %add.0, i64 0400 %ins.1 = insertelement <4 x i16> %ins.0, i16 %add.1, i64 1401 %ins.2 = insertelement <4 x i16> %ins.1, i16 %add.2, i64 2402 %ins.3 = insertelement <4 x i16> %ins.2, i16 %add.3, i64 3403 ret <4 x i16> %ins.3404}405