606 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; RUN: opt -mattr=+simd128,+relaxed-simd -passes=loop-vectorize -vectorizer-maximize-bandwidth %s | llc -mtriple=wasm32 -mattr=+simd128,+relaxed-simd -verify-machineinstrs -o - | FileCheck %s --check-prefix=RELAXED-MAX-BANDWIDTH4 5target triple = "wasm32"6 7define hidden i32 @i32_mac_s8(ptr nocapture noundef readonly %a, ptr nocapture noundef readonly %b, i32 noundef %N) {8; CHECK-LABEL: i32_mac_s8:9; CHECK: v128.load32_zero 0:p2align=010; CHECK: i16x8.extend_low_i8x16_s11; CHECK: v128.load32_zero 0:p2align=012; CHECK: i16x8.extend_low_i8x16_s13; CHECK: i32x4.extmul_low_i16x8_s14; CHECK: i32x4.add15 16; MAX-BANDWIDTH: v128.load17; MAX-BANDWIDTH: v128.load18; MAX-BANDWIDTH: i16x8.extmul_low_i8x16_s19; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_s20; MAX-BANDWIDTH: i16x8.extmul_high_i8x16_s21; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_s22; MAX-BANDWIDTH: i32x4.add23; MAX-BANDWIDTH: i32x4.add24 25; RELAXED-MAX-BANDWIDTH: v128.load26; RELAXED-MAX-BANDWIDTH: v128.load27; RELAXED-MAX-BANDWIDTH: i32x4.relaxed_dot_i8x16_i7x16_add_s28 29entry:30 %cmp7.not = icmp eq i32 %N, 031 br i1 %cmp7.not, label %for.cond.cleanup, label %for.body32 33for.cond.cleanup: ; preds = %for.body, %entry34 %res.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]35 ret i32 %res.0.lcssa36 37for.body: ; preds = %entry, %for.body38 %i.09 = phi i32 [ %inc, %for.body ], [ 0, %entry ]39 %res.08 = phi i32 [ %add, %for.body ], [ 0, %entry ]40 %arrayidx = getelementptr inbounds i8, ptr %a, i32 %i.0941 %0 = load i8, ptr %arrayidx, align 142 %conv = sext i8 %0 to i3243 %arrayidx1 = getelementptr inbounds i8, ptr %b, i32 %i.0944 %1 = load i8, ptr %arrayidx1, align 145 %conv2 = sext i8 %1 to i3246 %mul = mul nsw i32 %conv2, %conv47 %add = add nsw i32 %mul, %res.0848 %inc = add nuw i32 %i.09, 149 %exitcond.not = icmp eq i32 %inc, %N50 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body51}52 53define hidden i32 @i32_mac_u8_s8(ptr nocapture noundef readonly %a, ptr nocapture noundef readonly %b, i32 noundef %N) {54; CHECK-LABEL: i32_mac_u8_s8:55; CHECK: loop56; CHECK: v128.load32_zero57; CHECK: i16x8.extend_low_i8x16_u58; CHECK: i32x4.extend_low_i16x8_u59; CHECK: v128.load32_zero60; CHECK: i16x8.extend_low_i8x16_s61; CHECK: i32x4.extend_low_i16x8_s62; CHECK: i32x4.mul63; CHECK: i32x4.add64 65; MAX-BANDWIDTH: loop66; MAX-BANDWIDTH: v128.load67; MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 068; MAX-BANDWIDTH: i16x8.extend_low_i8x16_u69; MAX-BANDWIDTH: i32x4.extend_low_i16x8_u70; MAX-BANDWIDTH: v128.load71; MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 072; MAX-BANDWIDTH: i16x8.extend_low_i8x16_s73; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s74; MAX-BANDWIDTH: i32x4.mul75; MAX-BANDWIDTH: i32x4.add76; MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 077; MAX-BANDWIDTH: i16x8.extend_low_i8x16_u78; MAX-BANDWIDTH: i32x4.extend_low_i16x8_u79; MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 080; MAX-BANDWIDTH: i16x8.extend_low_i8x16_s81; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s82; MAX-BANDWIDTH: i32x4.mul83; MAX-BANDWIDTH: i32x4.add84; MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 085; MAX-BANDWIDTH: i16x8.extend_low_i8x16_u86; MAX-BANDWIDTH: i32x4.extend_low_i16x8_u87; MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 088; MAX-BANDWIDTH: i16x8.extend_low_i8x16_s89; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s90; MAX-BANDWIDTH: i32x4.mul91; MAX-BANDWIDTH: i32x4.add92; MAX-BANDWIDTH: i16x8.extend_low_i8x16_u93; MAX-BANDWIDTH: i32x4.extend_low_i16x8_u94; MAX-BANDWIDTH: i16x8.extend_low_i8x16_s95; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s96; MAX-BANDWIDTH: i32x4.mul97; MAX-BANDWIDTH: i32x4.add98 99; RELAXED-MAX-BANDWIDTH: loop100; RELAXED-MAX-BANDWIDTH: v128.load101; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0102; RELAXED-MAX-BANDWIDTH: i16x8.extend_low_i8x16_u103; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_u104; RELAXED-MAX-BANDWIDTH: v128.load105; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0106; RELAXED-MAX-BANDWIDTH: i16x8.extend_low_i8x16_s107; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_s108; RELAXED-MAX-BANDWIDTH: i32x4.mul109; RELAXED-MAX-BANDWIDTH: i32x4.add110; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0111; RELAXED-MAX-BANDWIDTH: i16x8.extend_low_i8x16_u112; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_u113; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0114; RELAXED-MAX-BANDWIDTH: i16x8.extend_low_i8x16_s115; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_s116; RELAXED-MAX-BANDWIDTH: i32x4.mul117; RELAXED-MAX-BANDWIDTH: i32x4.add118; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0119; RELAXED-MAX-BANDWIDTH: i16x8.extend_low_i8x16_u120; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_u121; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0122; RELAXED-MAX-BANDWIDTH: i16x8.extend_low_i8x16_s123; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_s124; RELAXED-MAX-BANDWIDTH: i32x4.mul125; RELAXED-MAX-BANDWIDTH: i32x4.add126; RELAXED-MAX-BANDWIDTH: i16x8.extend_low_i8x16_u127; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_u128; RELAXED-MAX-BANDWIDTH: i16x8.extend_low_i8x16_s129; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_s130; RELAXED-MAX-BANDWIDTH: i32x4.mul131; RELAXED-MAX-BANDWIDTH: i32x4.add132entry:133 %cmp7.not = icmp eq i32 %N, 0134 br i1 %cmp7.not, label %for.cond.cleanup, label %for.body135 136for.cond.cleanup: ; preds = %for.body, %entry137 %res.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]138 ret i32 %res.0.lcssa139 140for.body: ; preds = %entry, %for.body141 %i.09 = phi i32 [ %inc, %for.body ], [ 0, %entry ]142 %res.08 = phi i32 [ %add, %for.body ], [ 0, %entry ]143 %arrayidx = getelementptr inbounds i8, ptr %a, i32 %i.09144 %0 = load i8, ptr %arrayidx, align 1145 %conv = sext i8 %0 to i32146 %arrayidx1 = getelementptr inbounds i8, ptr %b, i32 %i.09147 %1 = load i8, ptr %arrayidx1, align 1148 %conv2 = zext i8 %1 to i32149 %mul = mul nsw i32 %conv2, %conv150 %add = add nsw i32 %mul, %res.08151 %inc = add nuw i32 %i.09, 1152 %exitcond.not = icmp eq i32 %inc, %N153 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body154}155 156define hidden i32 @i32_mac_s16(ptr nocapture noundef readonly %a, ptr nocapture noundef readonly %b, i32 noundef %N) {157; CHECK-LABEL: i32_mac_s16:158; CHECK: i32x4.load16x4_s 0:p2align=1159; CHECK: i32x4.load16x4_s 0:p2align=1160; CHECK: i32x4.mul161; CHECK: i32x4.add162 163; MAX-BANDWIDTH: v128.load164; MAX-BANDWIDTH: v128.load165; MAX-BANDWIDTH: i32x4.dot_i16x8_s166; MAX-BANDWIDTH: i32x4.add167 168; RELAXED-MAX-BANDWIDTH: v128.load169; RELAXED-MAX-BANDWIDTH: v128.load170; RELAXED-MAX-BANDWIDTH: i32x4.dot_i16x8_s171; RELAXED-MAX-BANDWIDTH: i32x4.add172 173entry:174 %cmp7.not = icmp eq i32 %N, 0175 br i1 %cmp7.not, label %for.cond.cleanup, label %for.body176 177for.cond.cleanup: ; preds = %for.body, %entry178 %res.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]179 ret i32 %res.0.lcssa180 181for.body: ; preds = %entry, %for.body182 %i.09 = phi i32 [ %inc, %for.body ], [ 0, %entry ]183 %res.08 = phi i32 [ %add, %for.body ], [ 0, %entry ]184 %arrayidx = getelementptr inbounds i16, ptr %a, i32 %i.09185 %0 = load i16, ptr %arrayidx, align 2186 %conv = sext i16 %0 to i32187 %arrayidx1 = getelementptr inbounds i16, ptr %b, i32 %i.09188 %1 = load i16, ptr %arrayidx1, align 2189 %conv2 = sext i16 %1 to i32190 %mul = mul nsw i32 %conv2, %conv191 %add = add nsw i32 %mul, %res.08192 %inc = add nuw i32 %i.09, 1193 %exitcond.not = icmp eq i32 %inc, %N194 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body195}196 197define hidden i64 @i64_mac_s16(ptr nocapture noundef readonly %a, ptr nocapture noundef readonly %b, i32 noundef %N) {198; CHECK-LABEL: i64_mac_s16:199; CHECK: v128.load32_zero 0:p2align=1200; CHECK: i32x4.extend_low_i16x8_s201; CHECK: v128.load32_zero 0:p2align=1202; CHECK: i32x4.extend_low_i16x8_s203; CHECK: i64x2.extmul_low_i32x4_s204; CHECK: i64x2.add205 206; MAX-BANDWIDTH: v128.load207; MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1208; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s209; MAX-BANDWIDTH: v128.load210; MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1211; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s212; MAX-BANDWIDTH: i64x2.extmul_low_i32x4_s213; MAX-BANDWIDTH: i64x2.add214; MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1215; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s216; MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1217; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s218; MAX-BANDWIDTH: i64x2.extmul_low_i32x4_s219; MAX-BANDWIDTH: i64x2.add220; MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1221; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s222; MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1223; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s224; MAX-BANDWIDTH: i64x2.extmul_low_i32x4_s225; MAX-BANDWIDTH: i64x2.add226; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s227; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s228; MAX-BANDWIDTH: i64x2.extmul_low_i32x4_s229; MAX-BANDWIDTH: i64x2.add230 231; RELAXED-MAX-BANDWIDTH: v128.load232; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1233; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_s234; RELAXED-MAX-BANDWIDTH: v128.load235; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1236; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_s237; RELAXED-MAX-BANDWIDTH: i64x2.extmul_low_i32x4_s238; RELAXED-MAX-BANDWIDTH: i64x2.add239; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1240; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_s241; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1242; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_s243; RELAXED-MAX-BANDWIDTH: i64x2.extmul_low_i32x4_s244; RELAXED-MAX-BANDWIDTH: i64x2.add245; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1246; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_s247; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1248; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_s249; RELAXED-MAX-BANDWIDTH: i64x2.extmul_low_i32x4_s250; RELAXED-MAX-BANDWIDTH: i64x2.add251; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_s252; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_s253; RELAXED-MAX-BANDWIDTH: i64x2.extmul_low_i32x4_s254; RELAXED-MAX-BANDWIDTH: i64x2.add255 256entry:257 %cmp7.not = icmp eq i32 %N, 0258 br i1 %cmp7.not, label %for.cond.cleanup, label %for.body259 260for.cond.cleanup: ; preds = %for.body, %entry261 %res.0.lcssa = phi i64 [ 0, %entry ], [ %add, %for.body ]262 ret i64 %res.0.lcssa263 264for.body: ; preds = %entry, %for.body265 %i.09 = phi i32 [ %inc, %for.body ], [ 0, %entry ]266 %res.08 = phi i64 [ %add, %for.body ], [ 0, %entry ]267 %arrayidx = getelementptr inbounds i16, ptr %a, i32 %i.09268 %0 = load i16, ptr %arrayidx, align 2269 %conv = sext i16 %0 to i64270 %arrayidx1 = getelementptr inbounds i16, ptr %b, i32 %i.09271 %1 = load i16, ptr %arrayidx1, align 2272 %conv2 = sext i16 %1 to i64273 %mul = mul nsw i64 %conv2, %conv274 %add = add nsw i64 %mul, %res.08275 %inc = add nuw i32 %i.09, 1276 %exitcond.not = icmp eq i32 %inc, %N277 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body278}279 280define hidden i64 @i64_mac_s32(ptr nocapture noundef readonly %a, ptr nocapture noundef readonly %b, i32 noundef %N) {281; CHECK-LABEL: i64_mac_s32:282; CHECK: v128.load64_zero 0:p2align=2283; CHECK: v128.load64_zero 0:p2align=2284; CHECK: i32x4.mul285; CHECK: i64x2.extend_low_i32x4_s286; CHECK: i64x2.add287 288; MAX-BANDWIDTH: v128.load289; MAX-BANDWIDTH: v128.load290; MAX-BANDWIDTH: i32x4.mul291; MAX-BANDWIDTH: i64x2.extend_high_i32x4_s292; MAX-BANDWIDTH: i64x2.add293; MAX-BANDWIDTH: i64x2.extend_low_i32x4_s294; MAX-BANDWIDTH: i64x2.add295 296; RELAXED-MAX-BANDWIDTH: v128.load297; RELAXED-MAX-BANDWIDTH: v128.load298; RELAXED-MAX-BANDWIDTH: i32x4.mul299; RELAXED-MAX-BANDWIDTH: i64x2.extend_high_i32x4_s300; RELAXED-MAX-BANDWIDTH: i64x2.add301; RELAXED-MAX-BANDWIDTH: i64x2.extend_low_i32x4_s302; RELAXED-MAX-BANDWIDTH: i64x2.add303 304entry:305 %cmp6.not = icmp eq i32 %N, 0306 br i1 %cmp6.not, label %for.cond.cleanup, label %for.body307 308for.cond.cleanup: ; preds = %for.body, %entry309 %res.0.lcssa = phi i64 [ 0, %entry ], [ %add, %for.body ]310 ret i64 %res.0.lcssa311 312for.body: ; preds = %entry, %for.body313 %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]314 %res.07 = phi i64 [ %add, %for.body ], [ 0, %entry ]315 %arrayidx = getelementptr inbounds i32, ptr %a, i32 %i.08316 %0 = load i32, ptr %arrayidx, align 4317 %arrayidx1 = getelementptr inbounds i32, ptr %b, i32 %i.08318 %1 = load i32, ptr %arrayidx1, align 4319 %mul = mul i32 %1, %0320 %conv = sext i32 %mul to i64321 %add = add i64 %res.07, %conv322 %inc = add nuw i32 %i.08, 1323 %exitcond.not = icmp eq i32 %inc, %N324 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body325}326 327define hidden i32 @i32_mac_u8(ptr nocapture noundef readonly %a, ptr nocapture noundef readonly %b, i32 noundef %N) {328; CHECK-LABEL: i32_mac_u8:329; CHECK: v128.load32_zero 0:p2align=0330; CHECK: i16x8.extend_low_i8x16_u331; CHECK: v128.load32_zero 0:p2align=0332; CHECK: i16x8.extend_low_i8x16_u333; CHECK: i32x4.extmul_low_i16x8_u334; CHECK: i32x4.add335 336; MAX-BANDWIDTH: v128.load337; MAX-BANDWIDTH: v128.load338; MAX-BANDWIDTH: i16x8.extmul_low_i8x16_u339; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_u340; MAX-BANDWIDTH: i16x8.extmul_high_i8x16_u341; MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_u342; MAX-BANDWIDTH: i32x4.add343; MAX-BANDWIDTH: i32x4.add344 345; RELAXED-MAX-BANDWIDTH: v128.load346; RELAXED-MAX-BANDWIDTH: v128.load347; RELAXED-MAX-BANDWIDTH: i16x8.extmul_low_i8x16_u348; RELAXED-MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_u349; RELAXED-MAX-BANDWIDTH: i16x8.extmul_high_i8x16_u350; RELAXED-MAX-BANDWIDTH: i32x4.extadd_pairwise_i16x8_u351; RELAXED-MAX-BANDWIDTH: i32x4.add352; RELAXED-MAX-BANDWIDTH: i32x4.add353 354entry:355 %cmp7.not = icmp eq i32 %N, 0356 br i1 %cmp7.not, label %for.cond.cleanup, label %for.body357 358for.cond.cleanup: ; preds = %for.body, %entry359 %res.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]360 ret i32 %res.0.lcssa361 362for.body: ; preds = %entry, %for.body363 %i.09 = phi i32 [ %inc, %for.body ], [ 0, %entry ]364 %res.08 = phi i32 [ %add, %for.body ], [ 0, %entry ]365 %arrayidx = getelementptr inbounds i8, ptr %a, i32 %i.09366 %0 = load i8, ptr %arrayidx, align 1367 %conv = zext i8 %0 to i32368 %arrayidx1 = getelementptr inbounds i8, ptr %b, i32 %i.09369 %1 = load i8, ptr %arrayidx1, align 1370 %conv2 = zext i8 %1 to i32371 %mul = mul nuw nsw i32 %conv2, %conv372 %add = add i32 %mul, %res.08373 %inc = add nuw i32 %i.09, 1374 %exitcond.not = icmp eq i32 %inc, %N375 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body376}377 378define hidden i32 @i32_mac_u16(ptr nocapture noundef readonly %a, ptr nocapture noundef readonly %b, i32 noundef %N) {379; CHECK-LABEL: i32_mac_u16:380; CHECK: i32x4.load16x4_u 0:p2align=1381; CHECK: i32x4.load16x4_u 0:p2align=1382; CHECK: i32x4.mul383; CHECK: i32x4.add384 385; MAX-BANDWIDTH: v128.load386; MAX-BANDWIDTH: v128.load387; MAX-BANDWIDTH: i32x4.extmul_low_i16x8_u388; MAX-BANDWIDTH: i32x4.extmul_high_i16x8_u389; MAX-BANDWIDTH: i32x4.add390; MAX-BANDWIDTH: i32x4.add391 392; RELAXED-MAX-BANDWIDTH: v128.load393; RELAXED-MAX-BANDWIDTH: v128.load394; RELAXED-MAX-BANDWIDTH: i32x4.extmul_low_i16x8_u395; RELAXED-MAX-BANDWIDTH: i32x4.extmul_high_i16x8_u396; RELAXED-MAX-BANDWIDTH: i32x4.add397; RELAXED-MAX-BANDWIDTH: i32x4.add398 399entry:400 %cmp7.not = icmp eq i32 %N, 0401 br i1 %cmp7.not, label %for.cond.cleanup, label %for.body402 403for.cond.cleanup: ; preds = %for.body, %entry404 %res.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]405 ret i32 %res.0.lcssa406 407for.body: ; preds = %entry, %for.body408 %i.09 = phi i32 [ %inc, %for.body ], [ 0, %entry ]409 %res.08 = phi i32 [ %add, %for.body ], [ 0, %entry ]410 %arrayidx = getelementptr inbounds i16, ptr %a, i32 %i.09411 %0 = load i16, ptr %arrayidx, align 2412 %conv = zext i16 %0 to i32413 %arrayidx1 = getelementptr inbounds i16, ptr %b, i32 %i.09414 %1 = load i16, ptr %arrayidx1, align 2415 %conv2 = zext i16 %1 to i32416 %mul = mul nuw nsw i32 %conv2, %conv417 %add = add i32 %mul, %res.08418 %inc = add nuw i32 %i.09, 1419 %exitcond.not = icmp eq i32 %inc, %N420 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body421}422 423define hidden i32 @i32_mac_u16_s16(ptr nocapture noundef readonly %a, ptr nocapture noundef readonly %b, i32 noundef %N) {424; CHECK-LABEL: i32_mac_u16_s16:425; CHECK: i32x4.load16x4_s 0:p2align=1426; CHECK: i32x4.load16x4_u 0:p2align=1427; CHECK: i32x4.mul428; CHECK: i32x4.add429 430; MAX-BANDWIDTH: v128.load431; MAX-BANDWIDTH: i32x4.extend_high_i16x8_s432; MAX-BANDWIDTH: v128.load433; MAX-BANDWIDTH: i32x4.extend_high_i16x8_u434; MAX-BANDWIDTH: i32x4.mul435; MAX-BANDWIDTH: i32x4.extend_low_i16x8_s436; MAX-BANDWIDTH: i32x4.extend_low_i16x8_u437; MAX-BANDWIDTH: i32x4.mul438; MAX-BANDWIDTH: i32x4.add439; MAX-BANDWIDTH: i32x4.add440 441; RELAXED-MAX-BANDWIDTH: v128.load442; RELAXED-MAX-BANDWIDTH: i32x4.extend_high_i16x8_s443; RELAXED-MAX-BANDWIDTH: v128.load444; RELAXED-MAX-BANDWIDTH: i32x4.extend_high_i16x8_u445; RELAXED-MAX-BANDWIDTH: i32x4.mul446; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_s447; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_u448; RELAXED-MAX-BANDWIDTH: i32x4.mul449; RELAXED-MAX-BANDWIDTH: i32x4.add450; RELAXED-MAX-BANDWIDTH: i32x4.add451 452entry:453 %cmp7.not = icmp eq i32 %N, 0454 br i1 %cmp7.not, label %for.cond.cleanup, label %for.body455 456for.cond.cleanup: ; preds = %for.body, %entry457 %res.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]458 ret i32 %res.0.lcssa459 460for.body: ; preds = %entry, %for.body461 %i.09 = phi i32 [ %inc, %for.body ], [ 0, %entry ]462 %res.08 = phi i32 [ %add, %for.body ], [ 0, %entry ]463 %arrayidx = getelementptr inbounds i16, ptr %a, i32 %i.09464 %0 = load i16, ptr %arrayidx, align 2465 %conv = zext i16 %0 to i32466 %arrayidx1 = getelementptr inbounds i16, ptr %b, i32 %i.09467 %1 = load i16, ptr %arrayidx1, align 2468 %conv2 = sext i16 %1 to i32469 %mul = mul nuw nsw i32 %conv2, %conv470 %add = add i32 %mul, %res.08471 %inc = add nuw i32 %i.09, 1472 %exitcond.not = icmp eq i32 %inc, %N473 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body474}475 476define hidden i64 @i64_mac_u16(ptr nocapture noundef readonly %a, ptr nocapture noundef readonly %b, i32 noundef %N) {477; CHECK-LABEL: i64_mac_u16:478; CHECK: v128.load32_zero 0:p2align=1479; CHECK: i32x4.extend_low_i16x8_u480; CHECK: v128.load32_zero 0:p2align=1481; CHECK: i32x4.extend_low_i16x8_u482; CHECK: i64x2.extmul_low_i32x4_u483; CHECK: i64x2.add484 485; MAX-BANDWIDTH: v128.load486; MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1487; MAX-BANDWIDTH: i32x4.extend_low_i16x8_u488; MAX-BANDWIDTH: v128.load489; MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1490; MAX-BANDWIDTH: i32x4.extend_low_i16x8_u491; MAX-BANDWIDTH: i64x2.extmul_low_i32x4_u492; MAX-BANDWIDTH: i64x2.add493; MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1494; MAX-BANDWIDTH: i32x4.extend_low_i16x8_u495; MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1496; MAX-BANDWIDTH: i32x4.extend_low_i16x8_u497; MAX-BANDWIDTH: i64x2.extmul_low_i32x4_u498; MAX-BANDWIDTH: i64x2.add499; MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1500; MAX-BANDWIDTH: i32x4.extend_low_i16x8_u501; MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1502; MAX-BANDWIDTH: i32x4.extend_low_i16x8_u503; MAX-BANDWIDTH: i64x2.extmul_low_i32x4_u504; MAX-BANDWIDTH: i64x2.add505; MAX-BANDWIDTH: i32x4.extend_low_i16x8_u506; MAX-BANDWIDTH: i32x4.extend_low_i16x8_u507; MAX-BANDWIDTH: i64x2.extmul_low_i32x4_u508; MAX-BANDWIDTH: i64x2.add509 510; RELAXED-MAX-BANDWIDTH: v128.load511; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1512; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_u513; RELAXED-MAX-BANDWIDTH: v128.load514; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1515; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_u516; RELAXED-MAX-BANDWIDTH: i64x2.extmul_low_i32x4_u517; RELAXED-MAX-BANDWIDTH: i64x2.add518; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1519; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_u520; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 8, 9, 10, 11, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1521; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_u522; RELAXED-MAX-BANDWIDTH: i64x2.extmul_low_i32x4_u523; RELAXED-MAX-BANDWIDTH: i64x2.add524; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1525; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_u526; RELAXED-MAX-BANDWIDTH: i8x16.shuffle 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1527; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_u528; RELAXED-MAX-BANDWIDTH: i64x2.extmul_low_i32x4_u529; RELAXED-MAX-BANDWIDTH: i64x2.add530; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_u531; RELAXED-MAX-BANDWIDTH: i32x4.extend_low_i16x8_u532; RELAXED-MAX-BANDWIDTH: i64x2.extmul_low_i32x4_u533; RELAXED-MAX-BANDWIDTH: i64x2.add534 535 536entry:537 %cmp8.not = icmp eq i32 %N, 0538 br i1 %cmp8.not, label %for.cond.cleanup, label %for.body539 540for.cond.cleanup: ; preds = %for.body, %entry541 %res.0.lcssa = phi i64 [ 0, %entry ], [ %add, %for.body ]542 ret i64 %res.0.lcssa543 544for.body: ; preds = %entry, %for.body545 %i.010 = phi i32 [ %inc, %for.body ], [ 0, %entry ]546 %res.09 = phi i64 [ %add, %for.body ], [ 0, %entry ]547 %arrayidx = getelementptr inbounds i16, ptr %a, i32 %i.010548 %0 = load i16, ptr %arrayidx, align 2549 %conv = zext i16 %0 to i64550 %arrayidx1 = getelementptr inbounds i16, ptr %b, i32 %i.010551 %1 = load i16, ptr %arrayidx1, align 2552 %conv2 = zext i16 %1 to i64553 %mul = mul nuw nsw i64 %conv2, %conv554 %add = add i64 %mul, %res.09555 %inc = add nuw i32 %i.010, 1556 %exitcond.not = icmp eq i32 %inc, %N557 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body558}559 560define hidden i64 @i64_mac_u32(ptr nocapture noundef readonly %a, ptr nocapture noundef readonly %b, i32 noundef %N) {561; CHECK-LABEL: i64_mac_u32:562; CHECK: v128.load64_zero 0:p2align=2563; CHECK: v128.load64_zero 0:p2align=2564; CHECK: i32x4.mul565; CHECK: i64x2.extend_low_i32x4_u566; CHECK: i64x2.add567 568; MAX-BANDWIDTH: v128.load569; MAX-BANDWIDTH: v128.load570; MAX-BANDWIDTH: i32x4.mul571; MAX-BANDWIDTH: i64x2.extend_high_i32x4_u572; MAX-BANDWIDTH: i64x2.add573; MAX-BANDWIDTH: i64x2.extend_low_i32x4_u574; MAX-BANDWIDTH: i64x2.add575 576; RELAXED-MAX-BANDWIDTH: v128.load577; RELAXED-MAX-BANDWIDTH: v128.load578; RELAXED-MAX-BANDWIDTH: i32x4.mul579; RELAXED-MAX-BANDWIDTH: i64x2.extend_high_i32x4_u580; RELAXED-MAX-BANDWIDTH: i64x2.add581; RELAXED-MAX-BANDWIDTH: i64x2.extend_low_i32x4_u582; RELAXED-MAX-BANDWIDTH: i64x2.add583 584entry:585 %cmp6.not = icmp eq i32 %N, 0586 br i1 %cmp6.not, label %for.cond.cleanup, label %for.body587 588for.cond.cleanup: ; preds = %for.body, %entry589 %res.0.lcssa = phi i64 [ 0, %entry ], [ %add, %for.body ]590 ret i64 %res.0.lcssa591 592for.body: ; preds = %entry, %for.body593 %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]594 %res.07 = phi i64 [ %add, %for.body ], [ 0, %entry ]595 %arrayidx = getelementptr inbounds i32, ptr %a, i32 %i.08596 %0 = load i32, ptr %arrayidx, align 4597 %arrayidx1 = getelementptr inbounds i32, ptr %b, i32 %i.08598 %1 = load i32, ptr %arrayidx1, align 4599 %mul = mul i32 %1, %0600 %conv = zext i32 %mul to i64601 %add = add i64 %res.07, %conv602 %inc = add nuw i32 %i.08, 1603 %exitcond.not = icmp eq i32 %inc, %N604 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body605}606