brintos

brintos / llvm-project-archived public Read only

0
0
Text · 21.8 KiB · a599f46 Raw
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