609 lines · plain
1; RUN: opt -mattr=+simd128 -passes=loop-vectorize %s | llc -mtriple=wasm32 -mattr=+simd128 -verify-machineinstrs -o - | FileCheck %s2; RUN: opt -mattr=+simd128 -passes=loop-vectorize -vectorizer-maximize-bandwidth %s | llc -mtriple=wasm32 -mattr=+simd128 -verify-machineinstrs -o - | FileCheck %s --check-prefix=MAX-BANDWIDTH3 4target triple = "wasm32"5 6define hidden i32 @accumulate_add_u8_u8(ptr noundef readonly %a, ptr noundef readonly %b, i32 noundef %N) {7; CHECK-LABEL: accumulate_add_u8_u8:8; CHECK: loop9; CHECK: v128.load32_zero10; CHECK: i16x8.extend_low_i8x16_u11; CHECK: i32x4.extend_low_i16x8_u12; CHECK: i32x4.add13; CHECK: v128.load32_zero14; CHECK: i16x8.extend_low_i8x16_u15; CHECK: i32x4.extend_low_i16x8_u16; CHECK: i32x4.add17 18; MAX-BANDWIDTH: loop19; MAX-BANDWIDTH: v128.load20; MAX-BANDWIDTH: i16x8.extadd_pairwise_i8x16_u21; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_u22; MAX-BANDWIDTH: v128.load23; MAX-BANDWIDTH: i16x8.extadd_pairwise_i8x16_u24; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_u25; MAX-BANDWIDTH: i32x4.add26; MAX-BANDWIDTH: i32x4.add27 28entry:29 %cmp8.not = icmp eq i32 %N, 030 br i1 %cmp8.not, label %for.cond.cleanup, label %for.body31 32for.cond.cleanup: ; preds = %for.body, %entry33 %result.0.lcssa = phi i32 [ 0, %entry ], [ %add3, %for.body ]34 ret i32 %result.0.lcssa35 36for.body: ; preds = %entry, %for.body37 %i.010 = phi i32 [ %inc, %for.body ], [ 0, %entry ]38 %result.09 = phi i32 [ %add3, %for.body ], [ 0, %entry ]39 %arrayidx = getelementptr inbounds nuw i8, ptr %a, i32 %i.01040 %0 = load i8, ptr %arrayidx, align 141 %conv = zext i8 %0 to i3242 %arrayidx1 = getelementptr inbounds nuw i8, ptr %b, i32 %i.01043 %1 = load i8, ptr %arrayidx1, align 144 %conv2 = zext i8 %1 to i3245 %add = add i32 %result.09, %conv46 %add3 = add i32 %add, %conv247 %inc = add nuw i32 %i.010, 148 %exitcond.not = icmp eq i32 %inc, %N49 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body50}51 52define hidden i32 @accumulate_add_s8_s8(ptr noundef readonly %a, ptr noundef readonly %b, i32 noundef %N) {53; CHECK-LABEL: accumulate_add_s8_s8:54; CHECK: loop55; CHECK: v128.load32_zero56; CHECK: i16x8.extend_low_i8x16_s57; CHECK: i32x4.extend_low_i16x8_s58; CHECK: i32x4.add59; CHECK: v128.load32_zero60; CHECK: i16x8.extend_low_i8x16_s61; CHECK: i32x4.extend_low_i16x8_s62; CHECK: i32x4.add63 64; MAX-BANDWIDTH: loop65; MAX-BANDWIDTH: v128.load66; MAX-BANDWIDTH: i16x8.extadd_pairwise_i8x16_s67; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_s68; MAX-BANDWIDTH: v128.load69; MAX-BANDWIDTH: i16x8.extadd_pairwise_i8x16_s70; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_s71; MAX-BANDWIDTH: i32x4.add72; MAX-BANDWIDTH: i32x4.add73entry:74 %cmp8.not = icmp eq i32 %N, 075 br i1 %cmp8.not, label %for.cond.cleanup, label %for.body76 77for.cond.cleanup: ; preds = %for.body, %entry78 %result.0.lcssa = phi i32 [ 0, %entry ], [ %add3, %for.body ]79 ret i32 %result.0.lcssa80 81for.body: ; preds = %entry, %for.body82 %i.010 = phi i32 [ %inc, %for.body ], [ 0, %entry ]83 %result.09 = phi i32 [ %add3, %for.body ], [ 0, %entry ]84 %arrayidx = getelementptr inbounds nuw i8, ptr %a, i32 %i.01085 %0 = load i8, ptr %arrayidx, align 186 %conv = sext i8 %0 to i3287 %arrayidx1 = getelementptr inbounds nuw i8, ptr %b, i32 %i.01088 %1 = load i8, ptr %arrayidx1, align 189 %conv2 = sext i8 %1 to i3290 %add = add i32 %result.09, %conv91 %add3 = add i32 %add, %conv292 %inc = add nuw i32 %i.010, 193 %exitcond.not = icmp eq i32 %inc, %N94 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body95}96 97define hidden i32 @accumulate_add_s8_u8(ptr noundef readonly %a, ptr noundef readonly %b, i32 noundef %N) {98; CHECK-LABEL: accumulate_add_s8_u8:99; CHECK: loop100; CHECK: v128.load32_zero101; CHECK: i16x8.extend_low_i8x16_s102; CHECK: i32x4.extend_low_i16x8_s103; CHECK: i32x4.add104; CHECK: v128.load32_zero105; CHECK: i16x8.extend_low_i8x16_u106; CHECK: i32x4.extend_low_i16x8_u107; CHECK: i32x4.add108 109; MAX-BANDWIDTH: loop110; MAX-BANDWIDTH: v128.load111; MAX-BANDWIDTH: i16x8.extadd_pairwise_i8x16_u112; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_u113; MAX-BANDWIDTH: v128.load114; MAX-BANDWIDTH: i16x8.extadd_pairwise_i8x16_s115; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_s116; MAX-BANDWIDTH: i32x4.add117entry:118 %cmp8.not = icmp eq i32 %N, 0119 br i1 %cmp8.not, label %for.cond.cleanup, label %for.body120 121for.cond.cleanup: ; preds = %for.body, %entry122 %result.0.lcssa = phi i32 [ 0, %entry ], [ %add3, %for.body ]123 ret i32 %result.0.lcssa124 125for.body: ; preds = %entry, %for.body126 %i.010 = phi i32 [ %inc, %for.body ], [ 0, %entry ]127 %result.09 = phi i32 [ %add3, %for.body ], [ 0, %entry ]128 %arrayidx = getelementptr inbounds nuw i8, ptr %a, i32 %i.010129 %0 = load i8, ptr %arrayidx, align 1130 %conv = sext i8 %0 to i32131 %arrayidx1 = getelementptr inbounds nuw i8, ptr %b, i32 %i.010132 %1 = load i8, ptr %arrayidx1, align 1133 %conv2 = zext i8 %1 to i32134 %add = add i32 %result.09, %conv135 %add3 = add i32 %add, %conv2136 %inc = add nuw i32 %i.010, 1137 %exitcond.not = icmp eq i32 %inc, %N138 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body139}140 141define hidden i32 @accumulate_add_s8_s16(ptr noundef readonly %a, ptr noundef readonly %b, i32 noundef %N) {142; CHECK-LABEL: accumulate_add_s8_s16:143; CHECK: loop144; CHECK: v128.load32_zero145; CHECK: i16x8.extend_low_i8x16_s146; CHECK: i32x4.extend_low_i16x8_s147; CHECK: i32x4.add148; CHECK: i32x4.load16x4_s149; CHECK: i32x4.add150 151; MAX-BANDWIDTH: loop152; MAX-BANDWIDTH: v128.load153; MAX-BANDWIDTH: i16x8.extend_low_i8x16_s154; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s155; MAX-BANDWIDTH: i32x4.add156; MAX-BANDWIDTH: v128.load157; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s158; MAX-BANDWIDTH: i32x4.add159; MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0160; MAX-BANDWIDTH: i16x8.extend_low_i8x16_s161; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s162; MAX-BANDWIDTH: i32x4.add163; MAX-BANDWIDTH: v128.load164; MAX-BANDWIDTH: i32x4.extend_high_i16x8_s165; MAX-BANDWIDTH: i32x4.add166; MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0167; MAX-BANDWIDTH: i16x8.extend_low_i8x16_s168; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s169; MAX-BANDWIDTH: i32x4.add170; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s171; MAX-BANDWIDTH: i32x4.add172; MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0173; MAX-BANDWIDTH: i16x8.extend_low_i8x16_s174; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s175; MAX-BANDWIDTH: i32x4.add176; MAX-BANDWIDTH: i32x4.extend_high_i16x8_s177; MAX-BANDWIDTH: i32x4.add178entry:179 %cmp8.not = icmp eq i32 %N, 0180 br i1 %cmp8.not, label %for.cond.cleanup, label %for.body181 182for.cond.cleanup: ; preds = %for.body, %entry183 %result.0.lcssa = phi i32 [ 0, %entry ], [ %add3, %for.body ]184 ret i32 %result.0.lcssa185 186for.body: ; preds = %entry, %for.body187 %i.010 = phi i32 [ %inc, %for.body ], [ 0, %entry ]188 %result.09 = phi i32 [ %add3, %for.body ], [ 0, %entry ]189 %arrayidx = getelementptr inbounds nuw i8, ptr %a, i32 %i.010190 %0 = load i8, ptr %arrayidx, align 1191 %conv = sext i8 %0 to i32192 %arrayidx1 = getelementptr inbounds nuw i16, ptr %b, i32 %i.010193 %1 = load i16, ptr %arrayidx1, align 2194 %conv2 = sext i16 %1 to i32195 %add = add i32 %result.09, %conv196 %add3 = add i32 %add, %conv2197 %inc = add nuw i32 %i.010, 1198 %exitcond.not = icmp eq i32 %inc, %N199 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body200}201 202define hidden i32 @accumulate_shr_u8(ptr noundef readonly %a, i32 noundef %N) {203; CHECK-LABEL: accumulate_shr_u8:204; CHECK: loop205; CHECK: v128.load32_zero206; CHECK: i8x16.shr_u207; CHECK: i16x8.extend_low_i8x16_u208; CHECK: i32x4.extend_low_i16x8_u209; CHECK: i32x4.add210 211; MAX-BANDWIDTH: loop212; MAX-BANDWIDTH: v128.load213; MAX-BANDWIDTH: i8x16.shr_u214; MAX-BANDWIDTH: i16x8.extadd_pairwise_i8x16_u215; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_u216; MAX-BANDWIDTH: i32x4.add217entry:218 %cmp4.not = icmp eq i32 %N, 0219 br i1 %cmp4.not, label %for.cond.cleanup, label %for.body220 221for.cond.cleanup: ; preds = %for.body, %entry222 %result.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]223 ret i32 %result.0.lcssa224 225for.body: ; preds = %entry, %for.body226 %i.06 = phi i32 [ %inc, %for.body ], [ 0, %entry ]227 %result.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]228 %arrayidx = getelementptr inbounds nuw i8, ptr %a, i32 %i.06229 %0 = load i8, ptr %arrayidx, align 1230 %1 = lshr i8 %0, 1231 %shr = zext nneg i8 %1 to i32232 %add = add i32 %result.05, %shr233 %inc = add nuw i32 %i.06, 1234 %exitcond.not = icmp eq i32 %inc, %N235 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body236}237 238define hidden i32 @accumulate_shr_s8(ptr noundef readonly %a, i32 noundef %N) {239; CHECK-LABEL: accumulate_shr_s8:240; CHECK: loop241; CHECK: v128.load32_zero242; CHECK: i8x16.shr_s243; CHECK: i16x8.extend_low_i8x16_s244; CHECK: i32x4.extend_low_i16x8_s245; CHECK: i32x4.add246 247; MAX-BANDWIDTH: loop248; MAX-BANDWIDTH: v128.load249; MAX-BANDWIDTH: i8x16.shr_s250; MAX-BANDWIDTH: i16x8.extadd_pairwise_i8x16_s251; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_s252; MAX-BANDWIDTH: i32x4.add253entry:254 %cmp4.not = icmp eq i32 %N, 0255 br i1 %cmp4.not, label %for.cond.cleanup, label %for.body256 257for.cond.cleanup: ; preds = %for.body, %entry258 %result.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]259 ret i32 %result.0.lcssa260 261for.body: ; preds = %entry, %for.body262 %i.06 = phi i32 [ %inc, %for.body ], [ 0, %entry ]263 %result.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]264 %arrayidx = getelementptr inbounds nuw i8, ptr %a, i32 %i.06265 %0 = load i8, ptr %arrayidx, align 1266 %1 = ashr i8 %0, 1267 %shr = sext i8 %1 to i32268 %add = add nsw i32 %result.05, %shr269 %inc = add nuw i32 %i.06, 1270 %exitcond.not = icmp eq i32 %inc, %N271 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body272}273 274define hidden i32 @accumulate_max_u8_u8(ptr noundef readonly %a, ptr noundef readonly %b, i32 noundef %N) {275; CHECK-LABEL: accumulate_max_u8_u8:276; CHECK: loop277; CHECK: v128.load32_zero278; CHECK: v128.load32_zero279; CHECK: i8x16.max_u280; CHECK: i16x8.extend_low_i8x16_u281; CHECK: i32x4.extend_low_i16x8_u282; CHECK: i32x4.add283 284; MAX-BANDWIDTH: loop285; MAX-BANDWIDTH: v128.load286; MAX-BANDWIDTH: v128.load287; MAX-BANDWIDTH: i8x16.max_u288; MAX-BANDWIDTH: i16x8.extadd_pairwise_i8x16_u289; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_u290; MAX-BANDWIDTH: i32x4.add291entry:292 %cmp17.not = icmp eq i32 %N, 0293 br i1 %cmp17.not, label %for.cond.cleanup, label %for.body294 295for.cond.cleanup: ; preds = %for.body, %entry296 %result.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]297 ret i32 %result.0.lcssa298 299for.body: ; preds = %entry, %for.body300 %i.019 = phi i32 [ %inc, %for.body ], [ 0, %entry ]301 %result.018 = phi i32 [ %add, %for.body ], [ 0, %entry ]302 %arrayidx = getelementptr inbounds nuw i8, ptr %a, i32 %i.019303 %0 = load i8, ptr %arrayidx, align 1304 %arrayidx1 = getelementptr inbounds nuw i8, ptr %b, i32 %i.019305 %1 = load i8, ptr %arrayidx1, align 1306 %. = tail call i8 @llvm.umax.i8(i8 %0, i8 %1)307 %cond = zext i8 %. to i32308 %add = add i32 %result.018, %cond309 %inc = add nuw i32 %i.019, 1310 %exitcond.not = icmp eq i32 %inc, %N311 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body312}313 314define hidden i32 @accumulate_min_s8_s8(ptr noundef readonly %a, ptr noundef readonly %b, i32 noundef %N) {315; CHECK-LABEL: accumulate_min_s8_s8:316; CHECK: loop317; CHECK: v128.load32_zero318; CHECK: v128.load32_zero319; CHECK: i8x16.min_s320; CHECK: i16x8.extend_low_i8x16_s321; CHECK: i32x4.extend_low_i16x8_s322; CHECK: i32x4.add323 324; MAX-BANDWIDTH: loop325; MAX-BANDWIDTH: v128.load326; MAX-BANDWIDTH: v128.load327; MAX-BANDWIDTH: i8x16.min_s328; MAX-BANDWIDTH: i16x8.extadd_pairwise_i8x16_s329; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_s330; MAX-BANDWIDTH: i32x4.add331entry:332 %cmp17.not = icmp eq i32 %N, 0333 br i1 %cmp17.not, label %for.cond.cleanup, label %for.body334 335for.cond.cleanup: ; preds = %for.body, %entry336 %result.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]337 ret i32 %result.0.lcssa338 339for.body: ; preds = %entry, %for.body340 %i.019 = phi i32 [ %inc, %for.body ], [ 0, %entry ]341 %result.018 = phi i32 [ %add, %for.body ], [ 0, %entry ]342 %arrayidx = getelementptr inbounds nuw i8, ptr %a, i32 %i.019343 %0 = load i8, ptr %arrayidx, align 1344 %arrayidx1 = getelementptr inbounds nuw i8, ptr %b, i32 %i.019345 %1 = load i8, ptr %arrayidx1, align 1346 %. = tail call i8 @llvm.smin.i8(i8 %0, i8 %1)347 %cond = sext i8 %. to i32348 %add = add nsw i32 %result.018, %cond349 %inc = add nuw i32 %i.019, 1350 %exitcond.not = icmp eq i32 %inc, %N351 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body352}353 354define hidden i32 @accumulate_add_u16_u16(ptr noundef readonly %a, ptr noundef readonly %b, i32 noundef %N) {355; CHECK-LABEL: accumulate_add_u16_u16:356; CHECK: loop357; CHECK: i32x4.load16x4_u358; CHECK: i32x4.add359; CHECK: i32x4.load16x4_u360; CHECK: i32x4.add361 362; MAX-BANDWIDTH: loop363; MAX-BANDWIDTH: v128.load364; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_u365; MAX-BANDWIDTH: v128.load366; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_u367; MAX-BANDWIDTH: i32x4.add368; MAX-BANDWIDTH: i32x4.add369entry:370 %cmp8.not = icmp eq i32 %N, 0371 br i1 %cmp8.not, label %for.cond.cleanup, label %for.body372 373for.cond.cleanup: ; preds = %for.body, %entry374 %result.0.lcssa = phi i32 [ 0, %entry ], [ %add3, %for.body ]375 ret i32 %result.0.lcssa376 377for.body: ; preds = %entry, %for.body378 %i.010 = phi i32 [ %inc, %for.body ], [ 0, %entry ]379 %result.09 = phi i32 [ %add3, %for.body ], [ 0, %entry ]380 %arrayidx = getelementptr inbounds nuw i16, ptr %a, i32 %i.010381 %0 = load i16, ptr %arrayidx, align 2382 %conv = zext i16 %0 to i32383 %arrayidx1 = getelementptr inbounds nuw i16, ptr %b, i32 %i.010384 %1 = load i16, ptr %arrayidx1, align 2385 %conv2 = zext i16 %1 to i32386 %add = add i32 %result.09, %conv387 %add3 = add i32 %add, %conv2388 %inc = add nuw i32 %i.010, 1389 %exitcond.not = icmp eq i32 %inc, %N390 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body391}392 393define hidden i32 @accumulate_add_s16_s16(ptr noundef readonly %a, ptr noundef readonly %b, i32 noundef %N) {394; CHECK-LABEL: accumulate_add_s16_s16:395; CHECK: loop396; CHECK: i32x4.load16x4_s397; CHECK: i32x4.add398; CHECK: i32x4.load16x4_s399; CHECK: i32x4.add400 401; MAX-BANDWIDTH: loop402; MAX-BANDWIDTH: v128.load403; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_s404; MAX-BANDWIDTH: v128.load405; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_s406; MAX-BANDWIDTH: i32x4.add407; MAX-BANDWIDTH: i32x4.add408entry:409 %cmp8.not = icmp eq i32 %N, 0410 br i1 %cmp8.not, label %for.cond.cleanup, label %for.body411 412for.cond.cleanup: ; preds = %for.body, %entry413 %result.0.lcssa = phi i32 [ 0, %entry ], [ %add3, %for.body ]414 ret i32 %result.0.lcssa415 416for.body: ; preds = %entry, %for.body417 %i.010 = phi i32 [ %inc, %for.body ], [ 0, %entry ]418 %result.09 = phi i32 [ %add3, %for.body ], [ 0, %entry ]419 %arrayidx = getelementptr inbounds nuw i16, ptr %a, i32 %i.010420 %0 = load i16, ptr %arrayidx, align 2421 %conv = sext i16 %0 to i32422 %arrayidx1 = getelementptr inbounds nuw i16, ptr %b, i32 %i.010423 %1 = load i16, ptr %arrayidx1, align 2424 %conv2 = sext i16 %1 to i32425 %add = add i32 %result.09, %conv426 %add3 = add i32 %add, %conv2427 %inc = add nuw i32 %i.010, 1428 %exitcond.not = icmp eq i32 %inc, %N429 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body430}431 432define hidden i32 @accumulate_shr_u16(ptr noundef readonly %a, i32 noundef %N) {433; CHECK-LABEL: accumulate_shr_u16:434; CHECK: loop435; CHECK: v128.load64_zero436; CHECK: i16x8.shr_u437; CHECK: i32x4.extend_low_i16x8_u438; CHECK: i32x4.add439 440; MAX-BANDWIDTH: loop441; MAX-BANDWIDTH: v128.load442; MAX-BANDWIDTH: i16x8.shr_u443; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_u444; MAX-BANDWIDTH: i32x4.add445entry:446 %cmp4.not = icmp eq i32 %N, 0447 br i1 %cmp4.not, label %for.cond.cleanup, label %for.body448 449for.cond.cleanup: ; preds = %for.body, %entry450 %result.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]451 ret i32 %result.0.lcssa452 453for.body: ; preds = %entry, %for.body454 %i.06 = phi i32 [ %inc, %for.body ], [ 0, %entry ]455 %result.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]456 %arrayidx = getelementptr inbounds nuw i16, ptr %a, i32 %i.06457 %0 = load i16, ptr %arrayidx, align 2458 %1 = lshr i16 %0, 1459 %shr = zext nneg i16 %1 to i32460 %add = add i32 %result.05, %shr461 %inc = add nuw i32 %i.06, 1462 %exitcond.not = icmp eq i32 %inc, %N463 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body464}465 466define hidden i32 @accumulate_shr_s16(ptr noundef readonly %a, i32 noundef %N) {467; CHECK-LABEL: accumulate_shr_s16:468; CHECK: loop469; CHECK: v128.load64_zero470; CHECK: i16x8.shr_s471; CHECK: i32x4.extend_low_i16x8_s472; CHECK: i32x4.add473 474; MAX-BANDWIDTH: loop475; MAX-BANDWIDTH: v128.load476; MAX-BANDWIDTH: i16x8.shr_s477; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_s478; MAX-BANDWIDTH: i32x4.add479entry:480 %cmp4.not = icmp eq i32 %N, 0481 br i1 %cmp4.not, label %for.cond.cleanup, label %for.body482 483for.cond.cleanup: ; preds = %for.body, %entry484 %result.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]485 ret i32 %result.0.lcssa486 487for.body: ; preds = %entry, %for.body488 %i.06 = phi i32 [ %inc, %for.body ], [ 0, %entry ]489 %result.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]490 %arrayidx = getelementptr inbounds nuw i16, ptr %a, i32 %i.06491 %0 = load i16, ptr %arrayidx, align 2492 %1 = ashr i16 %0, 1493 %shr = sext i16 %1 to i32494 %add = add nsw i32 %result.05, %shr495 %inc = add nuw i32 %i.06, 1496 %exitcond.not = icmp eq i32 %inc, %N497 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body498}499 500define hidden i32 @accumulate_sub_s8_s8(ptr noundef readonly %a, ptr noundef readonly %b, i32 noundef %N) {501; CHECK-LABEL: accumulate_sub_s8_s8:502; CHECK: loop503; CHECK: v128.load32_zero504; CHECK: i16x8.extend_low_i8x16_s505; CHECK: i32x4.extend_low_i16x8_s506; CHECK: i32x4.add507; CHECK: v128.load32_zero508; CHECK: i16x8.extend_low_i8x16_s509; CHECK: i32x4.extend_low_i16x8_s510; CHECK: i32x4.sub511 512; MAX-BANDWIDTH: loop513; MAX-BANDWIDTH: v128.load514; MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0515; MAX-BANDWIDTH: i16x8.extend_low_i8x16_s516; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s517; MAX-BANDWIDTH: i32x4.add518; MAX-BANDWIDTH: v128.load519; MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0520; MAX-BANDWIDTH: i16x8.extend_low_i8x16_s521; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s522; MAX-BANDWIDTH: i32x4.sub523; MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0524; MAX-BANDWIDTH: i16x8.extend_low_i8x16_s525; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s526; MAX-BANDWIDTH: i32x4.add527; MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0528; MAX-BANDWIDTH: i16x8.extend_low_i8x16_s529; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s530; MAX-BANDWIDTH: i32x4.sub531; MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0532; MAX-BANDWIDTH: i16x8.extend_low_i8x16_s533; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s534; MAX-BANDWIDTH: i32x4.add535; MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0536; MAX-BANDWIDTH: i16x8.extend_low_i8x16_s537; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s538; MAX-BANDWIDTH: i32x4.sub539entry:540 %cmp7.not = icmp eq i32 %N, 0541 br i1 %cmp7.not, label %for.cond.cleanup, label %for.body542 543for.cond.cleanup: ; preds = %for.body, %entry544 %result.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]545 ret i32 %result.0.lcssa546 547for.body: ; preds = %entry, %for.body548 %i.09 = phi i32 [ %inc, %for.body ], [ 0, %entry ]549 %result.08 = phi i32 [ %add, %for.body ], [ 0, %entry ]550 %arrayidx = getelementptr inbounds nuw i8, ptr %a, i32 %i.09551 %0 = load i8, ptr %arrayidx, align 1552 %conv = sext i8 %0 to i32553 %arrayidx1 = getelementptr inbounds nuw i8, ptr %b, i32 %i.09554 %1 = load i8, ptr %arrayidx1, align 1555 %conv2 = sext i8 %1 to i32556 %sub = add i32 %result.08, %conv557 %add = sub i32 %sub, %conv2558 %inc = add nuw i32 %i.09, 1559 %exitcond.not = icmp eq i32 %inc, %N560 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body561}562 563define hidden i32 @accumulate_sub_s16_s16(ptr noundef readonly %a, ptr noundef readonly %b, i32 noundef %N) {564; CHECK-LABEL: accumulate_sub_s16_s16:565; CHECK: loop566; CHECK: i32x4.load16x4_s567; CHECK: i32x4.add568; CHECK: i32x4.load16x4_s569; CHECK: i32x4.sub570 571; MAX-BANDWIDTH: loop572; MAX-BANDWIDTH: v128.load573; MAX-BANDWIDTH: i32x4.extend_high_i16x8_s574; MAX-BANDWIDTH: i32x4.add575; MAX-BANDWIDTH: v128.load576; MAX-BANDWIDTH: i32x4.extend_high_i16x8_s577; MAX-BANDWIDTH: i32x4.sub578; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s579; MAX-BANDWIDTH: i32x4.add580; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s581; MAX-BANDWIDTH: i32x4.sub582entry:583 %cmp7.not = icmp eq i32 %N, 0584 br i1 %cmp7.not, label %for.cond.cleanup, label %for.body585 586for.cond.cleanup: ; preds = %for.body, %entry587 %result.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]588 ret i32 %result.0.lcssa589 590for.body: ; preds = %entry, %for.body591 %i.09 = phi i32 [ %inc, %for.body ], [ 0, %entry ]592 %result.08 = phi i32 [ %add, %for.body ], [ 0, %entry ]593 %arrayidx = getelementptr inbounds nuw i16, ptr %a, i32 %i.09594 %0 = load i16, ptr %arrayidx, align 2595 %conv = sext i16 %0 to i32596 %arrayidx1 = getelementptr inbounds nuw i16, ptr %b, i32 %i.09597 %1 = load i16, ptr %arrayidx1, align 2598 %conv2 = sext i16 %1 to i32599 %sub = add i32 %result.08, %conv600 %add = sub i32 %sub, %conv2601 %inc = add nuw i32 %i.09, 1602 %exitcond.not = icmp eq i32 %inc, %N603 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body604}605 606declare i8 @llvm.umax.i8(i8, i8)607 608declare i8 @llvm.smin.i8(i8, i8)609