2890 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 62; RUN: opt < %s -passes=loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -prefer-inloop-reductions -S | FileCheck %s3; RUN: opt < %s -passes=loop-vectorize -force-vector-interleave=2 -force-vector-width=4 -prefer-inloop-reductions -S | FileCheck %s --check-prefix=CHECK-INTERLEAVED4 5target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"6 7define i32 @reduction_sum_single(ptr noalias nocapture %A) {8; CHECK-LABEL: define i32 @reduction_sum_single(9; CHECK-SAME: ptr noalias captures(none) [[A:%.*]]) {10; CHECK-NEXT: [[ENTRY:.*:]]11; CHECK-NEXT: br label %[[VECTOR_PH:.*]]12; CHECK: [[VECTOR_PH]]:13; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]14; CHECK: [[VECTOR_BODY]]:15; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]16; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP2:%.*]], %[[VECTOR_BODY]] ]17; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]18; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 419; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]])20; CHECK-NEXT: [[TMP2]] = add i32 [[VEC_PHI]], [[TMP1]]21; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 422; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 25623; CHECK-NEXT: br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]24; CHECK: [[MIDDLE_BLOCK]]:25; CHECK-NEXT: br [[DOT_CRIT_EDGE:label %.*]]26; CHECK: [[__CRIT_EDGE:.*:]]27; CHECK-NEXT: ret i32 [[TMP2]]28;29; CHECK-INTERLEAVED-LABEL: define i32 @reduction_sum_single(30; CHECK-INTERLEAVED-SAME: ptr noalias captures(none) [[A:%.*]]) {31; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]32; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]33; CHECK-INTERLEAVED: [[VECTOR_PH]]:34; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]35; CHECK-INTERLEAVED: [[VECTOR_BODY]]:36; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]37; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP3:%.*]], %[[VECTOR_BODY]] ]38; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP5:%.*]], %[[VECTOR_BODY]] ]39; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]40; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 441; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 442; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP1]], align 443; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]])44; CHECK-INTERLEAVED-NEXT: [[TMP3]] = add i32 [[VEC_PHI]], [[TMP2]]45; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD2]])46; CHECK-INTERLEAVED-NEXT: [[TMP5]] = add i32 [[VEC_PHI1]], [[TMP4]]47; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 848; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 25649; CHECK-INTERLEAVED-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]50; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:51; CHECK-INTERLEAVED-NEXT: [[SUM_0_LCSSA:%.*]] = add i32 [[TMP5]], [[TMP3]]52; CHECK-INTERLEAVED-NEXT: br [[DOT_CRIT_EDGE:label %.*]]53; CHECK-INTERLEAVED: [[__CRIT_EDGE:.*:]]54; CHECK-INTERLEAVED-NEXT: ret i32 [[SUM_0_LCSSA]]55;56entry:57 br label %.lr.ph58 59.lr.ph: ; preds = %entry, %.lr.ph60 %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]61 %sum.02 = phi i32 [ %l7, %.lr.ph ], [ 0, %entry ]62 %l2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv63 %l3 = load i32, ptr %l2, align 464 %l7 = add i32 %sum.02, %l365 %indvars.iv.next = add i64 %indvars.iv, 166 %lftr.wideiv = trunc i64 %indvars.iv.next to i3267 %exitcond = icmp eq i32 %lftr.wideiv, 25668 br i1 %exitcond, label %._crit_edge, label %.lr.ph69 70._crit_edge: ; preds = %.lr.ph71 %sum.0.lcssa = phi i32 [ %l7, %.lr.ph ]72 ret i32 %sum.0.lcssa73}74 75define i32 @reduction_sum(ptr noalias nocapture %A, ptr noalias nocapture %B) {76; CHECK-LABEL: define i32 @reduction_sum(77; CHECK-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {78; CHECK-NEXT: [[ENTRY:.*:]]79; CHECK-NEXT: br label %[[VECTOR_PH:.*]]80; CHECK: [[VECTOR_PH]]:81; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]82; CHECK: [[VECTOR_BODY]]:83; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]84; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP7:%.*]], %[[VECTOR_BODY]] ]85; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]86; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]87; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 488; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]89; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, ptr [[TMP1]], align 490; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[VEC_IND]])91; CHECK-NEXT: [[TMP3:%.*]] = add i32 [[VEC_PHI]], [[TMP2]]92; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]])93; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[TMP3]], [[TMP4]]94; CHECK-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD1]])95; CHECK-NEXT: [[TMP7]] = add i32 [[TMP5]], [[TMP6]]96; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 497; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 4)98; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 25699; CHECK-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]100; CHECK: [[MIDDLE_BLOCK]]:101; CHECK-NEXT: br [[DOT_CRIT_EDGE:label %.*]]102; CHECK: [[__CRIT_EDGE:.*:]]103; CHECK-NEXT: ret i32 [[TMP7]]104;105; CHECK-INTERLEAVED-LABEL: define i32 @reduction_sum(106; CHECK-INTERLEAVED-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {107; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]108; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]109; CHECK-INTERLEAVED: [[VECTOR_PH]]:110; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]111; CHECK-INTERLEAVED: [[VECTOR_BODY]]:112; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]113; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP13:%.*]], %[[VECTOR_BODY]] ]114; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP15:%.*]], %[[VECTOR_BODY]] ]115; CHECK-INTERLEAVED-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]116; CHECK-INTERLEAVED-NEXT: [[STEP_ADD:%.*]] = add <4 x i32> [[VEC_IND]], splat (i32 4)117; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]118; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 4119; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4120; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4121; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]122; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 4123; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4124; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x i32>, ptr [[TMP3]], align 4125; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[VEC_IND]])126; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = add i32 [[VEC_PHI]], [[TMP4]]127; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[STEP_ADD]])128; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = add i32 [[VEC_PHI1]], [[TMP6]]129; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]])130; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = add i32 [[TMP5]], [[TMP8]]131; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD2]])132; CHECK-INTERLEAVED-NEXT: [[TMP11:%.*]] = add i32 [[TMP7]], [[TMP10]]133; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD3]])134; CHECK-INTERLEAVED-NEXT: [[TMP13]] = add i32 [[TMP9]], [[TMP12]]135; CHECK-INTERLEAVED-NEXT: [[TMP14:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD4]])136; CHECK-INTERLEAVED-NEXT: [[TMP15]] = add i32 [[TMP11]], [[TMP14]]137; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8138; CHECK-INTERLEAVED-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[STEP_ADD]], splat (i32 4)139; CHECK-INTERLEAVED-NEXT: [[TMP16:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256140; CHECK-INTERLEAVED-NEXT: br i1 [[TMP16]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]141; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:142; CHECK-INTERLEAVED-NEXT: [[SUM_0_LCSSA:%.*]] = add i32 [[TMP15]], [[TMP13]]143; CHECK-INTERLEAVED-NEXT: br [[DOT_CRIT_EDGE:label %.*]]144; CHECK-INTERLEAVED: [[__CRIT_EDGE:.*:]]145; CHECK-INTERLEAVED-NEXT: ret i32 [[SUM_0_LCSSA]]146;147entry:148 br label %.lr.ph149 150.lr.ph: ; preds = %entry, %.lr.ph151 %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]152 %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ]153 %l2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv154 %l3 = load i32, ptr %l2, align 4155 %l4 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv156 %l5 = load i32, ptr %l4, align 4157 %l6 = trunc i64 %indvars.iv to i32158 %l7 = add i32 %sum.02, %l6159 %l8 = add i32 %l7, %l3160 %l9 = add i32 %l8, %l5161 %indvars.iv.next = add i64 %indvars.iv, 1162 %lftr.wideiv = trunc i64 %indvars.iv.next to i32163 %exitcond = icmp eq i32 %lftr.wideiv, 256164 br i1 %exitcond, label %._crit_edge, label %.lr.ph165 166._crit_edge: ; preds = %.lr.ph167 %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ]168 ret i32 %sum.0.lcssa169}170 171define i32 @reduction_sum_const(ptr noalias nocapture %A) {172; CHECK-LABEL: define i32 @reduction_sum_const(173; CHECK-SAME: ptr noalias captures(none) [[A:%.*]]) {174; CHECK-NEXT: [[ENTRY:.*:]]175; CHECK-NEXT: br label %[[VECTOR_PH:.*]]176; CHECK: [[VECTOR_PH]]:177; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]178; CHECK: [[VECTOR_BODY]]:179; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]180; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP3:%.*]], %[[VECTOR_BODY]] ]181; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]182; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4183; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]])184; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[VEC_PHI]], [[TMP1]]185; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> splat (i32 3))186; CHECK-NEXT: [[TMP3]] = add i32 [[TMP2]], [[TMP5]]187; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4188; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256189; CHECK-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]190; CHECK: [[MIDDLE_BLOCK]]:191; CHECK-NEXT: br [[DOT_CRIT_EDGE:label %.*]]192; CHECK: [[__CRIT_EDGE:.*:]]193; CHECK-NEXT: ret i32 [[TMP3]]194;195; CHECK-INTERLEAVED-LABEL: define i32 @reduction_sum_const(196; CHECK-INTERLEAVED-SAME: ptr noalias captures(none) [[A:%.*]]) {197; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]198; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]199; CHECK-INTERLEAVED: [[VECTOR_PH]]:200; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]201; CHECK-INTERLEAVED: [[VECTOR_BODY]]:202; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]203; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP6:%.*]], %[[VECTOR_BODY]] ]204; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP7:%.*]], %[[VECTOR_BODY]] ]205; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]206; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 4207; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4208; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4209; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]])210; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = add i32 [[VEC_PHI]], [[TMP2]]211; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD2]])212; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = add i32 [[VEC_PHI1]], [[TMP4]]213; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> splat (i32 3))214; CHECK-INTERLEAVED-NEXT: [[TMP6]] = add i32 [[TMP3]], [[TMP9]]215; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> splat (i32 3))216; CHECK-INTERLEAVED-NEXT: [[TMP7]] = add i32 [[TMP5]], [[TMP10]]217; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8218; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256219; CHECK-INTERLEAVED-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]220; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:221; CHECK-INTERLEAVED-NEXT: [[SUM_0_LCSSA:%.*]] = add i32 [[TMP7]], [[TMP6]]222; CHECK-INTERLEAVED-NEXT: br [[DOT_CRIT_EDGE:label %.*]]223; CHECK-INTERLEAVED: [[__CRIT_EDGE:.*:]]224; CHECK-INTERLEAVED-NEXT: ret i32 [[SUM_0_LCSSA]]225;226entry:227 br label %.lr.ph228 229.lr.ph: ; preds = %entry, %.lr.ph230 %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]231 %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ]232 %l2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv233 %l3 = load i32, ptr %l2, align 4234 %l7 = add i32 %sum.02, %l3235 %l9 = add i32 %l7, 3236 %indvars.iv.next = add i64 %indvars.iv, 1237 %lftr.wideiv = trunc i64 %indvars.iv.next to i32238 %exitcond = icmp eq i32 %lftr.wideiv, 256239 br i1 %exitcond, label %._crit_edge, label %.lr.ph240 241._crit_edge: ; preds = %.lr.ph242 %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ]243 ret i32 %sum.0.lcssa244}245 246define i32 @reduction_prod(ptr noalias nocapture %A, ptr noalias nocapture %B) {247; CHECK-LABEL: define i32 @reduction_prod(248; CHECK-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {249; CHECK-NEXT: [[ENTRY:.*:]]250; CHECK-NEXT: br label %[[VECTOR_PH:.*]]251; CHECK: [[VECTOR_PH]]:252; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]253; CHECK: [[VECTOR_BODY]]:254; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]255; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 1, %[[VECTOR_PH]] ], [ [[TMP7:%.*]], %[[VECTOR_BODY]] ]256; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]257; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]258; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4259; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]260; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4261; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[VEC_IND]])262; CHECK-NEXT: [[TMP3:%.*]] = mul i32 [[VEC_PHI]], [[TMP2]]263; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD]])264; CHECK-NEXT: [[TMP5:%.*]] = mul i32 [[TMP3]], [[TMP4]]265; CHECK-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD1]])266; CHECK-NEXT: [[TMP7]] = mul i32 [[TMP5]], [[TMP6]]267; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4268; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 4)269; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256270; CHECK-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]271; CHECK: [[MIDDLE_BLOCK]]:272; CHECK-NEXT: br [[DOT_CRIT_EDGE:label %.*]]273; CHECK: [[__CRIT_EDGE:.*:]]274; CHECK-NEXT: ret i32 [[TMP7]]275;276; CHECK-INTERLEAVED-LABEL: define i32 @reduction_prod(277; CHECK-INTERLEAVED-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {278; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]279; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]280; CHECK-INTERLEAVED: [[VECTOR_PH]]:281; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]282; CHECK-INTERLEAVED: [[VECTOR_BODY]]:283; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]284; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 1, %[[VECTOR_PH]] ], [ [[TMP13:%.*]], %[[VECTOR_BODY]] ]285; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 1, %[[VECTOR_PH]] ], [ [[TMP15:%.*]], %[[VECTOR_BODY]] ]286; CHECK-INTERLEAVED-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]287; CHECK-INTERLEAVED-NEXT: [[STEP_ADD:%.*]] = add <4 x i32> [[VEC_IND]], splat (i32 4)288; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]289; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 4290; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4291; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4292; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]293; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 4294; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4295; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x i32>, ptr [[TMP3]], align 4296; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[VEC_IND]])297; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = mul i32 [[VEC_PHI]], [[TMP4]]298; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[STEP_ADD]])299; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = mul i32 [[VEC_PHI1]], [[TMP6]]300; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD]])301; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = mul i32 [[TMP5]], [[TMP8]]302; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD2]])303; CHECK-INTERLEAVED-NEXT: [[TMP11:%.*]] = mul i32 [[TMP7]], [[TMP10]]304; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD3]])305; CHECK-INTERLEAVED-NEXT: [[TMP13]] = mul i32 [[TMP9]], [[TMP12]]306; CHECK-INTERLEAVED-NEXT: [[TMP14:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD4]])307; CHECK-INTERLEAVED-NEXT: [[TMP15]] = mul i32 [[TMP11]], [[TMP14]]308; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8309; CHECK-INTERLEAVED-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[STEP_ADD]], splat (i32 4)310; CHECK-INTERLEAVED-NEXT: [[TMP16:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256311; CHECK-INTERLEAVED-NEXT: br i1 [[TMP16]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]312; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:313; CHECK-INTERLEAVED-NEXT: [[PROD_0_LCSSA:%.*]] = mul i32 [[TMP15]], [[TMP13]]314; CHECK-INTERLEAVED-NEXT: br [[DOT_CRIT_EDGE:label %.*]]315; CHECK-INTERLEAVED: [[__CRIT_EDGE:.*:]]316; CHECK-INTERLEAVED-NEXT: ret i32 [[PROD_0_LCSSA]]317;318entry:319 br label %.lr.ph320 321.lr.ph: ; preds = %entry, %.lr.ph322 %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]323 %prod.02 = phi i32 [ %l9, %.lr.ph ], [ 1, %entry ]324 %l2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv325 %l3 = load i32, ptr %l2, align 4326 %l4 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv327 %l5 = load i32, ptr %l4, align 4328 %l6 = trunc i64 %indvars.iv to i32329 %l7 = mul i32 %prod.02, %l6330 %l8 = mul i32 %l7, %l3331 %l9 = mul i32 %l8, %l5332 %indvars.iv.next = add i64 %indvars.iv, 1333 %lftr.wideiv = trunc i64 %indvars.iv.next to i32334 %exitcond = icmp eq i32 %lftr.wideiv, 256335 br i1 %exitcond, label %._crit_edge, label %.lr.ph336 337._crit_edge: ; preds = %.lr.ph338 %prod.0.lcssa = phi i32 [ %l9, %.lr.ph ]339 ret i32 %prod.0.lcssa340}341 342define i32 @reduction_mix(ptr noalias nocapture %A, ptr noalias nocapture %B) {343; CHECK-LABEL: define i32 @reduction_mix(344; CHECK-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {345; CHECK-NEXT: [[ENTRY:.*:]]346; CHECK-NEXT: br label %[[VECTOR_PH:.*]]347; CHECK: [[VECTOR_PH]]:348; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]349; CHECK: [[VECTOR_BODY]]:350; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]351; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP6:%.*]], %[[VECTOR_BODY]] ]352; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]353; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]354; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4355; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]356; CHECK-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP8]], align 4357; CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[VEC_IND]])358; CHECK-NEXT: [[TMP4:%.*]] = add i32 [[VEC_PHI]], [[TMP3]]359; CHECK-NEXT: [[TMP2:%.*]] = mul nsw <4 x i32> [[WIDE_LOAD2]], [[WIDE_LOAD1]]360; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP2]])361; CHECK-NEXT: [[TMP6]] = add i32 [[TMP4]], [[TMP5]]362; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4363; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 4)364; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256365; CHECK-NEXT: br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]366; CHECK: [[MIDDLE_BLOCK]]:367; CHECK-NEXT: br [[DOT_CRIT_EDGE:label %.*]]368; CHECK: [[__CRIT_EDGE:.*:]]369; CHECK-NEXT: ret i32 [[TMP6]]370;371; CHECK-INTERLEAVED-LABEL: define i32 @reduction_mix(372; CHECK-INTERLEAVED-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {373; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]374; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]375; CHECK-INTERLEAVED: [[VECTOR_PH]]:376; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]377; CHECK-INTERLEAVED: [[VECTOR_BODY]]:378; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]379; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP10:%.*]], %[[VECTOR_BODY]] ]380; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP13:%.*]], %[[VECTOR_BODY]] ]381; CHECK-INTERLEAVED-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]382; CHECK-INTERLEAVED-NEXT: [[STEP_ADD:%.*]] = add <4 x i32> [[VEC_IND]], splat (i32 4)383; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]384; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 4385; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4386; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4387; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]388; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 4389; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4390; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x i32>, ptr [[TMP3]], align 4391; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[VEC_IND]])392; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = add i32 [[VEC_PHI]], [[TMP4]]393; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[STEP_ADD]])394; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = add i32 [[VEC_PHI1]], [[TMP6]]395; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = mul nsw <4 x i32> [[WIDE_LOAD3]], [[WIDE_LOAD]]396; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP8]])397; CHECK-INTERLEAVED-NEXT: [[TMP10]] = add i32 [[TMP5]], [[TMP9]]398; CHECK-INTERLEAVED-NEXT: [[TMP11:%.*]] = mul nsw <4 x i32> [[WIDE_LOAD4]], [[WIDE_LOAD2]]399; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP11]])400; CHECK-INTERLEAVED-NEXT: [[TMP13]] = add i32 [[TMP7]], [[TMP12]]401; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8402; CHECK-INTERLEAVED-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[STEP_ADD]], splat (i32 4)403; CHECK-INTERLEAVED-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256404; CHECK-INTERLEAVED-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]405; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:406; CHECK-INTERLEAVED-NEXT: [[SUM_0_LCSSA:%.*]] = add i32 [[TMP13]], [[TMP10]]407; CHECK-INTERLEAVED-NEXT: br [[DOT_CRIT_EDGE:label %.*]]408; CHECK-INTERLEAVED: [[__CRIT_EDGE:.*:]]409; CHECK-INTERLEAVED-NEXT: ret i32 [[SUM_0_LCSSA]]410;411entry:412 br label %.lr.ph413 414.lr.ph: ; preds = %entry, %.lr.ph415 %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]416 %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ]417 %l2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv418 %l3 = load i32, ptr %l2, align 4419 %l4 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv420 %l5 = load i32, ptr %l4, align 4421 %l6 = mul nsw i32 %l5, %l3422 %l7 = trunc i64 %indvars.iv to i32423 %l8 = add i32 %sum.02, %l7424 %l9 = add i32 %l8, %l6425 %indvars.iv.next = add i64 %indvars.iv, 1426 %lftr.wideiv = trunc i64 %indvars.iv.next to i32427 %exitcond = icmp eq i32 %lftr.wideiv, 256428 br i1 %exitcond, label %._crit_edge, label %.lr.ph429 430._crit_edge: ; preds = %.lr.ph431 %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ]432 ret i32 %sum.0.lcssa433}434 435define i32 @reduction_mul(ptr noalias nocapture %A, ptr noalias nocapture %B) {436; CHECK-LABEL: define i32 @reduction_mul(437; CHECK-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {438; CHECK-NEXT: [[ENTRY:.*:]]439; CHECK-NEXT: br label %[[VECTOR_PH:.*]]440; CHECK: [[VECTOR_PH]]:441; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]442; CHECK: [[VECTOR_BODY]]:443; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]444; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 19, %[[VECTOR_PH]] ], [ [[TMP5:%.*]], %[[VECTOR_BODY]] ]445; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]446; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4447; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]448; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4449; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD]])450; CHECK-NEXT: [[TMP3:%.*]] = mul i32 [[VEC_PHI]], [[TMP2]]451; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD1]])452; CHECK-NEXT: [[TMP5]] = mul i32 [[TMP3]], [[TMP4]]453; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4454; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256455; CHECK-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]456; CHECK: [[MIDDLE_BLOCK]]:457; CHECK-NEXT: br [[DOT_CRIT_EDGE:label %.*]]458; CHECK: [[__CRIT_EDGE:.*:]]459; CHECK-NEXT: ret i32 [[TMP5]]460;461; CHECK-INTERLEAVED-LABEL: define i32 @reduction_mul(462; CHECK-INTERLEAVED-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {463; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]464; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]465; CHECK-INTERLEAVED: [[VECTOR_PH]]:466; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]467; CHECK-INTERLEAVED: [[VECTOR_BODY]]:468; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]469; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 19, %[[VECTOR_PH]] ], [ [[TMP9:%.*]], %[[VECTOR_BODY]] ]470; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 1, %[[VECTOR_PH]] ], [ [[TMP11:%.*]], %[[VECTOR_BODY]] ]471; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]472; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 4473; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4474; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4475; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]476; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 4477; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4478; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x i32>, ptr [[TMP3]], align 4479; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD]])480; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = mul i32 [[VEC_PHI]], [[TMP4]]481; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD2]])482; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = mul i32 [[VEC_PHI1]], [[TMP6]]483; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD3]])484; CHECK-INTERLEAVED-NEXT: [[TMP9]] = mul i32 [[TMP5]], [[TMP8]]485; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD4]])486; CHECK-INTERLEAVED-NEXT: [[TMP11]] = mul i32 [[TMP7]], [[TMP10]]487; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8488; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256489; CHECK-INTERLEAVED-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]490; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:491; CHECK-INTERLEAVED-NEXT: [[SUM_0_LCSSA:%.*]] = mul i32 [[TMP11]], [[TMP9]]492; CHECK-INTERLEAVED-NEXT: br [[DOT_CRIT_EDGE:label %.*]]493; CHECK-INTERLEAVED: [[__CRIT_EDGE:.*:]]494; CHECK-INTERLEAVED-NEXT: ret i32 [[SUM_0_LCSSA]]495;496entry:497 br label %.lr.ph498 499.lr.ph: ; preds = %entry, %.lr.ph500 %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]501 %sum.02 = phi i32 [ %l7, %.lr.ph ], [ 19, %entry ]502 %l2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv503 %l3 = load i32, ptr %l2, align 4504 %l4 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv505 %l5 = load i32, ptr %l4, align 4506 %l6 = mul i32 %sum.02, %l3507 %l7 = mul i32 %l6, %l5508 %indvars.iv.next = add i64 %indvars.iv, 1509 %lftr.wideiv = trunc i64 %indvars.iv.next to i32510 %exitcond = icmp eq i32 %lftr.wideiv, 256511 br i1 %exitcond, label %._crit_edge, label %.lr.ph512 513._crit_edge: ; preds = %.lr.ph514 %sum.0.lcssa = phi i32 [ %l7, %.lr.ph ]515 ret i32 %sum.0.lcssa516}517 518define i32 @start_at_non_zero(ptr nocapture %in, ptr nocapture %coeff, ptr nocapture %out) {519; CHECK-LABEL: define i32 @start_at_non_zero(520; CHECK-SAME: ptr captures(none) [[IN:%.*]], ptr captures(none) [[COEFF:%.*]], ptr captures(none) [[OUT:%.*]]) {521; CHECK-NEXT: [[ENTRY:.*:]]522; CHECK-NEXT: br label %[[VECTOR_PH:.*]]523; CHECK: [[VECTOR_PH]]:524; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]525; CHECK: [[VECTOR_BODY]]:526; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]527; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 120, %[[VECTOR_PH]] ], [ [[TMP4:%.*]], %[[VECTOR_BODY]] ]528; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[IN]], i64 [[INDEX]]529; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4530; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[COEFF]], i64 [[INDEX]]531; CHECK-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP6]], align 4532; CHECK-NEXT: [[TMP2:%.*]] = mul nsw <4 x i32> [[WIDE_LOAD2]], [[WIDE_LOAD1]]533; CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP2]])534; CHECK-NEXT: [[TMP4]] = add i32 [[VEC_PHI]], [[TMP3]]535; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4536; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256537; CHECK-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]538; CHECK: [[MIDDLE_BLOCK]]:539; CHECK-NEXT: br label %[[FOR_END:.*]]540; CHECK: [[FOR_END]]:541; CHECK-NEXT: ret i32 [[TMP4]]542;543; CHECK-INTERLEAVED-LABEL: define i32 @start_at_non_zero(544; CHECK-INTERLEAVED-SAME: ptr captures(none) [[IN:%.*]], ptr captures(none) [[COEFF:%.*]], ptr captures(none) [[OUT:%.*]]) {545; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]546; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]547; CHECK-INTERLEAVED: [[VECTOR_PH]]:548; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]549; CHECK-INTERLEAVED: [[VECTOR_BODY]]:550; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]551; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 120, %[[VECTOR_PH]] ], [ [[TMP6:%.*]], %[[VECTOR_BODY]] ]552; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP9:%.*]], %[[VECTOR_BODY]] ]553; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[IN]], i64 [[INDEX]]554; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 4555; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4556; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4557; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[COEFF]], i64 [[INDEX]]558; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 4559; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4560; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x i32>, ptr [[TMP3]], align 4561; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = mul nsw <4 x i32> [[WIDE_LOAD3]], [[WIDE_LOAD]]562; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP4]])563; CHECK-INTERLEAVED-NEXT: [[TMP6]] = add i32 [[VEC_PHI]], [[TMP5]]564; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = mul nsw <4 x i32> [[WIDE_LOAD4]], [[WIDE_LOAD2]]565; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP7]])566; CHECK-INTERLEAVED-NEXT: [[TMP9]] = add i32 [[VEC_PHI1]], [[TMP8]]567; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8568; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256569; CHECK-INTERLEAVED-NEXT: br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]570; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:571; CHECK-INTERLEAVED-NEXT: [[BIN_RDX:%.*]] = add i32 [[TMP9]], [[TMP6]]572; CHECK-INTERLEAVED-NEXT: br label %[[FOR_END:.*]]573; CHECK-INTERLEAVED: [[FOR_END]]:574; CHECK-INTERLEAVED-NEXT: ret i32 [[BIN_RDX]]575;576entry:577 br label %for.body578 579for.body: ; preds = %entry, %for.body580 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]581 %sum.09 = phi i32 [ %add, %for.body ], [ 120, %entry ]582 %arrayidx = getelementptr inbounds i32, ptr %in, i64 %indvars.iv583 %l0 = load i32, ptr %arrayidx, align 4584 %arrayidx2 = getelementptr inbounds i32, ptr %coeff, i64 %indvars.iv585 %l1 = load i32, ptr %arrayidx2, align 4586 %mul = mul nsw i32 %l1, %l0587 %add = add nsw i32 %mul, %sum.09588 %indvars.iv.next = add i64 %indvars.iv, 1589 %lftr.wideiv = trunc i64 %indvars.iv.next to i32590 %exitcond = icmp eq i32 %lftr.wideiv, 256591 br i1 %exitcond, label %for.end, label %for.body592 593for.end: ; preds = %for.body, %entry594 %sum.0.lcssa = phi i32 [ %add, %for.body ]595 ret i32 %sum.0.lcssa596}597 598define i32 @reduction_and(ptr nocapture %A, ptr nocapture %B) {599; CHECK-LABEL: define i32 @reduction_and(600; CHECK-SAME: ptr captures(none) [[A:%.*]], ptr captures(none) [[B:%.*]]) {601; CHECK-NEXT: [[ENTRY:.*:]]602; CHECK-NEXT: br label %[[VECTOR_PH:.*]]603; CHECK: [[VECTOR_PH]]:604; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]605; CHECK: [[VECTOR_BODY]]:606; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]607; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ -1, %[[VECTOR_PH]] ], [ [[TMP5:%.*]], %[[VECTOR_BODY]] ]608; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]609; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4610; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]611; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4612; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> [[WIDE_LOAD]])613; CHECK-NEXT: [[TMP3:%.*]] = and i32 [[VEC_PHI]], [[TMP2]]614; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> [[WIDE_LOAD1]])615; CHECK-NEXT: [[TMP5]] = and i32 [[TMP3]], [[TMP4]]616; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4617; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256618; CHECK-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]619; CHECK: [[MIDDLE_BLOCK]]:620; CHECK-NEXT: br label %[[FOR_END:.*]]621; CHECK: [[FOR_END]]:622; CHECK-NEXT: ret i32 [[TMP5]]623;624; CHECK-INTERLEAVED-LABEL: define i32 @reduction_and(625; CHECK-INTERLEAVED-SAME: ptr captures(none) [[A:%.*]], ptr captures(none) [[B:%.*]]) {626; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]627; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]628; CHECK-INTERLEAVED: [[VECTOR_PH]]:629; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]630; CHECK-INTERLEAVED: [[VECTOR_BODY]]:631; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]632; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ -1, %[[VECTOR_PH]] ], [ [[TMP9:%.*]], %[[VECTOR_BODY]] ]633; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ -1, %[[VECTOR_PH]] ], [ [[TMP11:%.*]], %[[VECTOR_BODY]] ]634; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]635; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 4636; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4637; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4638; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]639; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 4640; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4641; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x i32>, ptr [[TMP3]], align 4642; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> [[WIDE_LOAD]])643; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = and i32 [[VEC_PHI]], [[TMP4]]644; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> [[WIDE_LOAD2]])645; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = and i32 [[VEC_PHI1]], [[TMP6]]646; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> [[WIDE_LOAD3]])647; CHECK-INTERLEAVED-NEXT: [[TMP9]] = and i32 [[TMP5]], [[TMP8]]648; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> [[WIDE_LOAD4]])649; CHECK-INTERLEAVED-NEXT: [[TMP11]] = and i32 [[TMP7]], [[TMP10]]650; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8651; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256652; CHECK-INTERLEAVED-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]653; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:654; CHECK-INTERLEAVED-NEXT: [[RESULT_0_LCSSA:%.*]] = and i32 [[TMP11]], [[TMP9]]655; CHECK-INTERLEAVED-NEXT: br label %[[FOR_END:.*]]656; CHECK-INTERLEAVED: [[FOR_END]]:657; CHECK-INTERLEAVED-NEXT: ret i32 [[RESULT_0_LCSSA]]658;659entry:660 br label %for.body661 662for.body: ; preds = %entry, %for.body663 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]664 %result.08 = phi i32 [ %and, %for.body ], [ -1, %entry ]665 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %indvars.iv666 %l0 = load i32, ptr %arrayidx, align 4667 %arrayidx2 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv668 %l1 = load i32, ptr %arrayidx2, align 4669 %add = and i32 %result.08, %l0670 %and = and i32 %add, %l1671 %indvars.iv.next = add i64 %indvars.iv, 1672 %lftr.wideiv = trunc i64 %indvars.iv.next to i32673 %exitcond = icmp eq i32 %lftr.wideiv, 256674 br i1 %exitcond, label %for.end, label %for.body675 676for.end: ; preds = %for.body, %entry677 %result.0.lcssa = phi i32 [ %and, %for.body ]678 ret i32 %result.0.lcssa679}680 681define i32 @reduction_or(ptr nocapture %A, ptr nocapture %B) {682; CHECK-LABEL: define i32 @reduction_or(683; CHECK-SAME: ptr captures(none) [[A:%.*]], ptr captures(none) [[B:%.*]]) {684; CHECK-NEXT: [[ENTRY:.*:]]685; CHECK-NEXT: br label %[[VECTOR_PH:.*]]686; CHECK: [[VECTOR_PH]]:687; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]688; CHECK: [[VECTOR_BODY]]:689; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]690; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP4:%.*]], %[[VECTOR_BODY]] ]691; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]692; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4693; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]694; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4695; CHECK-NEXT: [[TMP2:%.*]] = add nsw <4 x i32> [[WIDE_LOAD1]], [[WIDE_LOAD]]696; CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> [[TMP2]])697; CHECK-NEXT: [[TMP4]] = or i32 [[VEC_PHI]], [[TMP3]]698; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4699; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256700; CHECK-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]701; CHECK: [[MIDDLE_BLOCK]]:702; CHECK-NEXT: br label %[[FOR_END:.*]]703; CHECK: [[FOR_END]]:704; CHECK-NEXT: ret i32 [[TMP4]]705;706; CHECK-INTERLEAVED-LABEL: define i32 @reduction_or(707; CHECK-INTERLEAVED-SAME: ptr captures(none) [[A:%.*]], ptr captures(none) [[B:%.*]]) {708; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]709; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]710; CHECK-INTERLEAVED: [[VECTOR_PH]]:711; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]712; CHECK-INTERLEAVED: [[VECTOR_BODY]]:713; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]714; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP7:%.*]], %[[VECTOR_BODY]] ]715; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP9:%.*]], %[[VECTOR_BODY]] ]716; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]717; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 4718; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4719; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4720; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]721; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 4722; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4723; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x i32>, ptr [[TMP3]], align 4724; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = add nsw <4 x i32> [[WIDE_LOAD3]], [[WIDE_LOAD]]725; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = add nsw <4 x i32> [[WIDE_LOAD4]], [[WIDE_LOAD2]]726; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> [[TMP4]])727; CHECK-INTERLEAVED-NEXT: [[TMP7]] = or i32 [[VEC_PHI]], [[TMP6]]728; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> [[TMP5]])729; CHECK-INTERLEAVED-NEXT: [[TMP9]] = or i32 [[VEC_PHI1]], [[TMP8]]730; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8731; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256732; CHECK-INTERLEAVED-NEXT: br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]733; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:734; CHECK-INTERLEAVED-NEXT: [[RESULT_0_LCSSA:%.*]] = or i32 [[TMP9]], [[TMP7]]735; CHECK-INTERLEAVED-NEXT: br label %[[FOR_END:.*]]736; CHECK-INTERLEAVED: [[FOR_END]]:737; CHECK-INTERLEAVED-NEXT: ret i32 [[RESULT_0_LCSSA]]738;739entry:740 br label %for.body741 742for.body: ; preds = %entry, %for.body743 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]744 %result.08 = phi i32 [ %or, %for.body ], [ 0, %entry ]745 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %indvars.iv746 %l0 = load i32, ptr %arrayidx, align 4747 %arrayidx2 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv748 %l1 = load i32, ptr %arrayidx2, align 4749 %add = add nsw i32 %l1, %l0750 %or = or i32 %add, %result.08751 %indvars.iv.next = add i64 %indvars.iv, 1752 %lftr.wideiv = trunc i64 %indvars.iv.next to i32753 %exitcond = icmp eq i32 %lftr.wideiv, 256754 br i1 %exitcond, label %for.end, label %for.body755 756for.end: ; preds = %for.body, %entry757 %result.0.lcssa = phi i32 [ %or, %for.body ]758 ret i32 %result.0.lcssa759}760 761define i32 @reduction_xor(ptr nocapture %A, ptr nocapture %B) {762; CHECK-LABEL: define i32 @reduction_xor(763; CHECK-SAME: ptr captures(none) [[A:%.*]], ptr captures(none) [[B:%.*]]) {764; CHECK-NEXT: [[ENTRY:.*:]]765; CHECK-NEXT: br label %[[VECTOR_PH:.*]]766; CHECK: [[VECTOR_PH]]:767; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]768; CHECK: [[VECTOR_BODY]]:769; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]770; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP4:%.*]], %[[VECTOR_BODY]] ]771; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]772; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4773; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]774; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4775; CHECK-NEXT: [[TMP2:%.*]] = add nsw <4 x i32> [[WIDE_LOAD1]], [[WIDE_LOAD]]776; CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> [[TMP2]])777; CHECK-NEXT: [[TMP4]] = xor i32 [[VEC_PHI]], [[TMP3]]778; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4779; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256780; CHECK-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]781; CHECK: [[MIDDLE_BLOCK]]:782; CHECK-NEXT: br label %[[FOR_END:.*]]783; CHECK: [[FOR_END]]:784; CHECK-NEXT: ret i32 [[TMP4]]785;786; CHECK-INTERLEAVED-LABEL: define i32 @reduction_xor(787; CHECK-INTERLEAVED-SAME: ptr captures(none) [[A:%.*]], ptr captures(none) [[B:%.*]]) {788; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]789; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]790; CHECK-INTERLEAVED: [[VECTOR_PH]]:791; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]792; CHECK-INTERLEAVED: [[VECTOR_BODY]]:793; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]794; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP7:%.*]], %[[VECTOR_BODY]] ]795; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP9:%.*]], %[[VECTOR_BODY]] ]796; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]797; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 4798; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4799; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4800; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]801; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 4802; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4803; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x i32>, ptr [[TMP3]], align 4804; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = add nsw <4 x i32> [[WIDE_LOAD3]], [[WIDE_LOAD]]805; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = add nsw <4 x i32> [[WIDE_LOAD4]], [[WIDE_LOAD2]]806; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> [[TMP4]])807; CHECK-INTERLEAVED-NEXT: [[TMP7]] = xor i32 [[VEC_PHI]], [[TMP6]]808; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> [[TMP5]])809; CHECK-INTERLEAVED-NEXT: [[TMP9]] = xor i32 [[VEC_PHI1]], [[TMP8]]810; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8811; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256812; CHECK-INTERLEAVED-NEXT: br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]813; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:814; CHECK-INTERLEAVED-NEXT: [[RESULT_0_LCSSA:%.*]] = xor i32 [[TMP9]], [[TMP7]]815; CHECK-INTERLEAVED-NEXT: br label %[[FOR_END:.*]]816; CHECK-INTERLEAVED: [[FOR_END]]:817; CHECK-INTERLEAVED-NEXT: ret i32 [[RESULT_0_LCSSA]]818;819entry:820 br label %for.body821 822for.body: ; preds = %entry, %for.body823 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]824 %result.08 = phi i32 [ %xor, %for.body ], [ 0, %entry ]825 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %indvars.iv826 %l0 = load i32, ptr %arrayidx, align 4827 %arrayidx2 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv828 %l1 = load i32, ptr %arrayidx2, align 4829 %add = add nsw i32 %l1, %l0830 %xor = xor i32 %add, %result.08831 %indvars.iv.next = add i64 %indvars.iv, 1832 %lftr.wideiv = trunc i64 %indvars.iv.next to i32833 %exitcond = icmp eq i32 %lftr.wideiv, 256834 br i1 %exitcond, label %for.end, label %for.body835 836for.end: ; preds = %for.body, %entry837 %result.0.lcssa = phi i32 [ %xor, %for.body ]838 ret i32 %result.0.lcssa839}840 841define float @reduction_fadd(ptr nocapture %A, ptr nocapture %B) {842; CHECK-LABEL: define float @reduction_fadd(843; CHECK-SAME: ptr captures(none) [[A:%.*]], ptr captures(none) [[B:%.*]]) {844; CHECK-NEXT: [[ENTRY:.*:]]845; CHECK-NEXT: br label %[[VECTOR_PH:.*]]846; CHECK: [[VECTOR_PH]]:847; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]848; CHECK: [[VECTOR_BODY]]:849; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]850; CHECK-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, %[[VECTOR_PH]] ], [ [[TMP3:%.*]], %[[VECTOR_BODY]] ]851; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]852; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP0]], align 4853; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]854; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x float>, ptr [[TMP1]], align 4855; CHECK-NEXT: [[TMP2:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[WIDE_LOAD]])856; CHECK-NEXT: [[TMP5:%.*]] = fadd fast float [[VEC_PHI]], [[TMP2]]857; CHECK-NEXT: [[TMP6:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[WIDE_LOAD1]])858; CHECK-NEXT: [[TMP3]] = fadd fast float [[TMP5]], [[TMP6]]859; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4860; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256861; CHECK-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]862; CHECK: [[MIDDLE_BLOCK]]:863; CHECK-NEXT: br label %[[FOR_END:.*]]864; CHECK: [[FOR_END]]:865; CHECK-NEXT: ret float [[TMP3]]866;867; CHECK-INTERLEAVED-LABEL: define float @reduction_fadd(868; CHECK-INTERLEAVED-SAME: ptr captures(none) [[A:%.*]], ptr captures(none) [[B:%.*]]) {869; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]870; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]871; CHECK-INTERLEAVED: [[VECTOR_PH]]:872; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]873; CHECK-INTERLEAVED: [[VECTOR_BODY]]:874; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]875; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, %[[VECTOR_PH]] ], [ [[TMP6:%.*]], %[[VECTOR_BODY]] ]876; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi float [ 0.000000e+00, %[[VECTOR_PH]] ], [ [[TMP7:%.*]], %[[VECTOR_BODY]] ]877; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]878; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[TMP0]], i64 4879; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP0]], align 4880; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x float>, ptr [[TMP1]], align 4881; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]882; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i64 4883; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x float>, ptr [[TMP2]], align 4884; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x float>, ptr [[TMP3]], align 4885; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[WIDE_LOAD]])886; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = fadd fast float [[VEC_PHI]], [[TMP4]]887; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[WIDE_LOAD2]])888; CHECK-INTERLEAVED-NEXT: [[TMP11:%.*]] = fadd fast float [[VEC_PHI1]], [[TMP9]]889; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[WIDE_LOAD3]])890; CHECK-INTERLEAVED-NEXT: [[TMP6]] = fadd fast float [[TMP5]], [[TMP12]]891; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[WIDE_LOAD4]])892; CHECK-INTERLEAVED-NEXT: [[TMP7]] = fadd fast float [[TMP11]], [[TMP10]]893; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8894; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256895; CHECK-INTERLEAVED-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]896; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:897; CHECK-INTERLEAVED-NEXT: [[RESULT_0_LCSSA:%.*]] = fadd fast float [[TMP7]], [[TMP6]]898; CHECK-INTERLEAVED-NEXT: br label %[[FOR_END:.*]]899; CHECK-INTERLEAVED: [[FOR_END]]:900; CHECK-INTERLEAVED-NEXT: ret float [[RESULT_0_LCSSA]]901;902entry:903 br label %for.body904 905for.body: ; preds = %entry, %for.body906 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]907 %result.08 = phi float [ %fadd, %for.body ], [ 0.0, %entry ]908 %arrayidx = getelementptr inbounds float, ptr %A, i64 %indvars.iv909 %l0 = load float, ptr %arrayidx, align 4910 %arrayidx2 = getelementptr inbounds float, ptr %B, i64 %indvars.iv911 %l1 = load float, ptr %arrayidx2, align 4912 %add = fadd fast float %result.08, %l0913 %fadd = fadd fast float %add, %l1914 %indvars.iv.next = add i64 %indvars.iv, 1915 %lftr.wideiv = trunc i64 %indvars.iv.next to i32916 %exitcond = icmp eq i32 %lftr.wideiv, 256917 br i1 %exitcond, label %for.end, label %for.body918 919for.end: ; preds = %for.body, %entry920 %result.0.lcssa = phi float [ %fadd, %for.body ]921 ret float %result.0.lcssa922}923 924define float @reduction_fmul(ptr nocapture %A, ptr nocapture %B) {925; CHECK-LABEL: define float @reduction_fmul(926; CHECK-SAME: ptr captures(none) [[A:%.*]], ptr captures(none) [[B:%.*]]) {927; CHECK-NEXT: [[ENTRY:.*:]]928; CHECK-NEXT: br label %[[VECTOR_PH:.*]]929; CHECK: [[VECTOR_PH]]:930; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]931; CHECK: [[VECTOR_BODY]]:932; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]933; CHECK-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, %[[VECTOR_PH]] ], [ [[TMP5:%.*]], %[[VECTOR_BODY]] ]934; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]935; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP0]], align 4936; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]937; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x float>, ptr [[TMP1]], align 4938; CHECK-NEXT: [[TMP2:%.*]] = call fast float @llvm.vector.reduce.fmul.v4f32(float 1.000000e+00, <4 x float> [[WIDE_LOAD]])939; CHECK-NEXT: [[TMP3:%.*]] = fmul fast float [[VEC_PHI]], [[TMP2]]940; CHECK-NEXT: [[TMP4:%.*]] = call fast float @llvm.vector.reduce.fmul.v4f32(float 1.000000e+00, <4 x float> [[WIDE_LOAD1]])941; CHECK-NEXT: [[TMP5]] = fmul fast float [[TMP3]], [[TMP4]]942; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4943; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256944; CHECK-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]945; CHECK: [[MIDDLE_BLOCK]]:946; CHECK-NEXT: br label %[[FOR_END:.*]]947; CHECK: [[FOR_END]]:948; CHECK-NEXT: ret float [[TMP5]]949;950; CHECK-INTERLEAVED-LABEL: define float @reduction_fmul(951; CHECK-INTERLEAVED-SAME: ptr captures(none) [[A:%.*]], ptr captures(none) [[B:%.*]]) {952; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]953; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]954; CHECK-INTERLEAVED: [[VECTOR_PH]]:955; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]956; CHECK-INTERLEAVED: [[VECTOR_BODY]]:957; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]958; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, %[[VECTOR_PH]] ], [ [[TMP9:%.*]], %[[VECTOR_BODY]] ]959; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi float [ 1.000000e+00, %[[VECTOR_PH]] ], [ [[TMP11:%.*]], %[[VECTOR_BODY]] ]960; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]961; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[TMP0]], i64 4962; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP0]], align 4963; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x float>, ptr [[TMP1]], align 4964; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]965; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i64 4966; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x float>, ptr [[TMP2]], align 4967; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x float>, ptr [[TMP3]], align 4968; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = call fast float @llvm.vector.reduce.fmul.v4f32(float 1.000000e+00, <4 x float> [[WIDE_LOAD]])969; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = fmul fast float [[VEC_PHI]], [[TMP4]]970; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = call fast float @llvm.vector.reduce.fmul.v4f32(float 1.000000e+00, <4 x float> [[WIDE_LOAD2]])971; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = fmul fast float [[VEC_PHI1]], [[TMP6]]972; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = call fast float @llvm.vector.reduce.fmul.v4f32(float 1.000000e+00, <4 x float> [[WIDE_LOAD3]])973; CHECK-INTERLEAVED-NEXT: [[TMP9]] = fmul fast float [[TMP5]], [[TMP8]]974; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = call fast float @llvm.vector.reduce.fmul.v4f32(float 1.000000e+00, <4 x float> [[WIDE_LOAD4]])975; CHECK-INTERLEAVED-NEXT: [[TMP11]] = fmul fast float [[TMP7]], [[TMP10]]976; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8977; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256978; CHECK-INTERLEAVED-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]979; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:980; CHECK-INTERLEAVED-NEXT: [[RESULT_0_LCSSA:%.*]] = fmul fast float [[TMP11]], [[TMP9]]981; CHECK-INTERLEAVED-NEXT: br label %[[FOR_END:.*]]982; CHECK-INTERLEAVED: [[FOR_END]]:983; CHECK-INTERLEAVED-NEXT: ret float [[RESULT_0_LCSSA]]984;985entry:986 br label %for.body987 988for.body: ; preds = %entry, %for.body989 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]990 %result.08 = phi float [ %fmul, %for.body ], [ 0.0, %entry ]991 %arrayidx = getelementptr inbounds float, ptr %A, i64 %indvars.iv992 %l0 = load float, ptr %arrayidx, align 4993 %arrayidx2 = getelementptr inbounds float, ptr %B, i64 %indvars.iv994 %l1 = load float, ptr %arrayidx2, align 4995 %add = fmul fast float %result.08, %l0996 %fmul = fmul fast float %add, %l1997 %indvars.iv.next = add i64 %indvars.iv, 1998 %lftr.wideiv = trunc i64 %indvars.iv.next to i32999 %exitcond = icmp eq i32 %lftr.wideiv, 2561000 br i1 %exitcond, label %for.end, label %for.body1001 1002for.end: ; preds = %for.body, %entry1003 %result.0.lcssa = phi float [ %fmul, %for.body ]1004 ret float %result.0.lcssa1005}1006 1007; We can create an in-loop reduction for sub-reductions with a sub and add-reduction1008define i32 @reduction_sub_lhs(ptr noalias nocapture %A) {1009; CHECK-LABEL: define i32 @reduction_sub_lhs(1010; CHECK-SAME: ptr noalias captures(none) [[A:%.*]]) {1011; CHECK-NEXT: [[ENTRY:.*:]]1012; CHECK-NEXT: br label %[[VECTOR_PH:.*]]1013; CHECK: [[VECTOR_PH]]:1014; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]1015; CHECK: [[VECTOR_BODY]]:1016; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1017; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 3, %[[VECTOR_PH]] ], [ [[TMP5:%.*]], %[[VECTOR_BODY]] ]1018; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]1019; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 41020; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]])1021; CHECK-NEXT: [[TMP5]] = sub i32 [[VEC_PHI]], [[TMP1]]1022; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 41023; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[INDEX_NEXT]], 2561024; CHECK-NEXT: br i1 [[TMP2]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]1025; CHECK: [[MIDDLE_BLOCK]]:1026; CHECK-NEXT: br label %[[FOR_END:.*]]1027; CHECK: [[FOR_END]]:1028; CHECK-NEXT: ret i32 [[TMP5]]1029;1030; CHECK-INTERLEAVED-LABEL: define i32 @reduction_sub_lhs(1031; CHECK-INTERLEAVED-SAME: ptr noalias captures(none) [[A:%.*]]) {1032; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]1033; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]1034; CHECK-INTERLEAVED: [[VECTOR_PH]]:1035; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]1036; CHECK-INTERLEAVED: [[VECTOR_BODY]]:1037; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1038; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 3, %[[VECTOR_PH]] ], [ [[TMP7:%.*]], %[[VECTOR_BODY]] ]1039; CHECK-INTERLEAVED-NEXT: [[VEC_PHI2:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP5:%.*]], %[[VECTOR_BODY]] ]1040; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]1041; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 41042; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 41043; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP1]], align 41044; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]])1045; CHECK-INTERLEAVED-NEXT: [[TMP7]] = sub i32 [[VEC_PHI1]], [[TMP4]]1046; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD2]])1047; CHECK-INTERLEAVED-NEXT: [[TMP5]] = sub i32 [[VEC_PHI2]], [[TMP6]]1048; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 81049; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 2561050; CHECK-INTERLEAVED-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]1051; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:1052; CHECK-INTERLEAVED-NEXT: [[BIN_RDX:%.*]] = add i32 [[TMP5]], [[TMP7]]1053; CHECK-INTERLEAVED-NEXT: br label %[[FOR_END:.*]]1054; CHECK-INTERLEAVED: [[FOR_END]]:1055; CHECK-INTERLEAVED-NEXT: ret i32 [[BIN_RDX]]1056;1057entry:1058 br label %for.body1059 1060for.body: ; preds = %entry, %for.body1061 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1062 %x.05 = phi i32 [ %sub, %for.body ], [ 3, %entry ]1063 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %indvars.iv1064 %l0 = load i32, ptr %arrayidx, align 41065 %sub = sub nsw i32 %x.05, %l01066 %indvars.iv.next = add i64 %indvars.iv, 11067 %lftr.wideiv = trunc i64 %indvars.iv.next to i321068 %exitcond = icmp eq i32 %lftr.wideiv, 2561069 br i1 %exitcond, label %for.end, label %for.body1070 1071for.end: ; preds = %for.body, %entry1072 %x.0.lcssa = phi i32 [ %sub, %for.body ]1073 ret i32 %x.0.lcssa1074}1075 1076; Conditional reductions with multi-input phis.1077define float @reduction_conditional(ptr %A, ptr %B, ptr %C, float %S) {1078; CHECK-LABEL: define float @reduction_conditional(1079; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], float [[S:%.*]]) {1080; CHECK-NEXT: [[ENTRY:.*:]]1081; CHECK-NEXT: br label %[[VECTOR_PH:.*]]1082; CHECK: [[VECTOR_PH]]:1083; CHECK-NEXT: [[TMP0:%.*]] = insertelement <4 x float> zeroinitializer, float [[S]], i32 01084; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]1085; CHECK: [[VECTOR_BODY]]:1086; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1087; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x float> [ [[TMP0]], %[[VECTOR_PH]] ], [ [[PREDPHI3:%.*]], %[[VECTOR_BODY]] ]1088; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]1089; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP1]], align 41090; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]1091; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x float>, ptr [[TMP2]], align 41092; CHECK-NEXT: [[TMP3:%.*]] = fcmp ogt <4 x float> [[WIDE_LOAD]], [[WIDE_LOAD1]]1093; CHECK-NEXT: [[TMP4:%.*]] = fcmp ogt <4 x float> [[WIDE_LOAD1]], splat (float 1.000000e+00)1094; CHECK-NEXT: [[TMP8:%.*]] = xor <4 x i1> [[TMP4]], splat (i1 true)1095; CHECK-NEXT: [[TMP6:%.*]] = fcmp ule <4 x float> [[WIDE_LOAD]], splat (float 2.000000e+00)1096; CHECK-NEXT: [[TMP7:%.*]] = fadd fast <4 x float> [[VEC_PHI]], [[WIDE_LOAD1]]1097; CHECK-NEXT: [[TMP5:%.*]] = select <4 x i1> [[TMP3]], <4 x i1> [[TMP4]], <4 x i1> zeroinitializer1098; CHECK-NEXT: [[TMP9:%.*]] = fadd fast <4 x float> [[VEC_PHI]], [[WIDE_LOAD]]1099; CHECK-NEXT: [[TMP10:%.*]] = select <4 x i1> [[TMP8]], <4 x i1> [[TMP6]], <4 x i1> zeroinitializer1100; CHECK-NEXT: [[TMP11:%.*]] = select <4 x i1> [[TMP3]], <4 x i1> [[TMP10]], <4 x i1> zeroinitializer1101; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP11]], <4 x float> [[VEC_PHI]], <4 x float> [[TMP7]]1102; CHECK-NEXT: [[PREDPHI2:%.*]] = select <4 x i1> [[TMP5]], <4 x float> [[TMP9]], <4 x float> [[PREDPHI]]1103; CHECK-NEXT: [[PREDPHI3]] = select <4 x i1> [[TMP3]], <4 x float> [[PREDPHI2]], <4 x float> [[VEC_PHI]]1104; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 41105; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1281106; CHECK-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]1107; CHECK: [[MIDDLE_BLOCK]]:1108; CHECK-NEXT: [[TMP13:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[PREDPHI3]])1109; CHECK-NEXT: br label %[[FOR_END:.*]]1110; CHECK: [[FOR_END]]:1111; CHECK-NEXT: ret float [[TMP13]]1112;1113; CHECK-INTERLEAVED-LABEL: define float @reduction_conditional(1114; CHECK-INTERLEAVED-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], float [[S:%.*]]) {1115; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]1116; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]1117; CHECK-INTERLEAVED: [[VECTOR_PH]]:1118; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = insertelement <4 x float> zeroinitializer, float [[S]], i32 01119; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]1120; CHECK-INTERLEAVED: [[VECTOR_BODY]]:1121; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1122; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi <4 x float> [ [[TMP0]], %[[VECTOR_PH]] ], [ [[PREDPHI6:%.*]], %[[VECTOR_BODY]] ]1123; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi <4 x float> [ zeroinitializer, %[[VECTOR_PH]] ], [ [[PREDPHI9:%.*]], %[[VECTOR_BODY]] ]1124; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]1125; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[TMP1]], i64 41126; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP1]], align 41127; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x float>, ptr [[TMP2]], align 41128; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]1129; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = getelementptr inbounds float, ptr [[TMP3]], i64 41130; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x float>, ptr [[TMP3]], align 41131; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x float>, ptr [[TMP4]], align 41132; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = fcmp ogt <4 x float> [[WIDE_LOAD]], [[WIDE_LOAD3]]1133; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = fcmp ogt <4 x float> [[WIDE_LOAD2]], [[WIDE_LOAD4]]1134; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = fcmp ogt <4 x float> [[WIDE_LOAD3]], splat (float 1.000000e+00)1135; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = fcmp ogt <4 x float> [[WIDE_LOAD4]], splat (float 1.000000e+00)1136; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = xor <4 x i1> [[TMP7]], splat (i1 true)1137; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = xor <4 x i1> [[TMP8]], splat (i1 true)1138; CHECK-INTERLEAVED-NEXT: [[TMP11:%.*]] = fcmp ule <4 x float> [[WIDE_LOAD]], splat (float 2.000000e+00)1139; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = fcmp ule <4 x float> [[WIDE_LOAD2]], splat (float 2.000000e+00)1140; CHECK-INTERLEAVED-NEXT: [[TMP13:%.*]] = fadd fast <4 x float> [[VEC_PHI]], [[WIDE_LOAD3]]1141; CHECK-INTERLEAVED-NEXT: [[TMP14:%.*]] = fadd fast <4 x float> [[VEC_PHI1]], [[WIDE_LOAD4]]1142; CHECK-INTERLEAVED-NEXT: [[TMP15:%.*]] = select <4 x i1> [[TMP5]], <4 x i1> [[TMP7]], <4 x i1> zeroinitializer1143; CHECK-INTERLEAVED-NEXT: [[TMP16:%.*]] = select <4 x i1> [[TMP6]], <4 x i1> [[TMP8]], <4 x i1> zeroinitializer1144; CHECK-INTERLEAVED-NEXT: [[TMP17:%.*]] = fadd fast <4 x float> [[VEC_PHI]], [[WIDE_LOAD]]1145; CHECK-INTERLEAVED-NEXT: [[TMP18:%.*]] = fadd fast <4 x float> [[VEC_PHI1]], [[WIDE_LOAD2]]1146; CHECK-INTERLEAVED-NEXT: [[TMP19:%.*]] = select <4 x i1> [[TMP9]], <4 x i1> [[TMP11]], <4 x i1> zeroinitializer1147; CHECK-INTERLEAVED-NEXT: [[TMP21:%.*]] = select <4 x i1> [[TMP10]], <4 x i1> [[TMP12]], <4 x i1> zeroinitializer1148; CHECK-INTERLEAVED-NEXT: [[TMP20:%.*]] = select <4 x i1> [[TMP5]], <4 x i1> [[TMP19]], <4 x i1> zeroinitializer1149; CHECK-INTERLEAVED-NEXT: [[TMP22:%.*]] = select <4 x i1> [[TMP6]], <4 x i1> [[TMP21]], <4 x i1> zeroinitializer1150; CHECK-INTERLEAVED-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP20]], <4 x float> [[VEC_PHI]], <4 x float> [[TMP13]]1151; CHECK-INTERLEAVED-NEXT: [[PREDPHI5:%.*]] = select <4 x i1> [[TMP15]], <4 x float> [[TMP17]], <4 x float> [[PREDPHI]]1152; CHECK-INTERLEAVED-NEXT: [[PREDPHI6]] = select <4 x i1> [[TMP5]], <4 x float> [[PREDPHI5]], <4 x float> [[VEC_PHI]]1153; CHECK-INTERLEAVED-NEXT: [[PREDPHI7:%.*]] = select <4 x i1> [[TMP22]], <4 x float> [[VEC_PHI1]], <4 x float> [[TMP14]]1154; CHECK-INTERLEAVED-NEXT: [[PREDPHI8:%.*]] = select <4 x i1> [[TMP16]], <4 x float> [[TMP18]], <4 x float> [[PREDPHI7]]1155; CHECK-INTERLEAVED-NEXT: [[PREDPHI9]] = select <4 x i1> [[TMP6]], <4 x float> [[PREDPHI8]], <4 x float> [[VEC_PHI1]]1156; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 81157; CHECK-INTERLEAVED-NEXT: [[TMP23:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1281158; CHECK-INTERLEAVED-NEXT: br i1 [[TMP23]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]1159; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:1160; CHECK-INTERLEAVED-NEXT: [[BIN_RDX:%.*]] = fadd fast <4 x float> [[PREDPHI9]], [[PREDPHI6]]1161; CHECK-INTERLEAVED-NEXT: [[TMP24:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[BIN_RDX]])1162; CHECK-INTERLEAVED-NEXT: br label %[[FOR_END:.*]]1163; CHECK-INTERLEAVED: [[FOR_END]]:1164; CHECK-INTERLEAVED-NEXT: ret float [[TMP24]]1165;1166entry:1167 br label %for.body1168 1169for.body:1170 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.inc ]1171 %sum.033 = phi float [ %S, %entry ], [ %sum.1, %for.inc ]1172 %arrayidx = getelementptr inbounds float, ptr %A, i64 %indvars.iv1173 %l0 = load float, ptr %arrayidx, align 41174 %arrayidx2 = getelementptr inbounds float, ptr %B, i64 %indvars.iv1175 %l1 = load float, ptr %arrayidx2, align 41176 %cmp3 = fcmp ogt float %l0, %l11177 br i1 %cmp3, label %if.then, label %for.inc1178 1179if.then:1180 %cmp6 = fcmp ogt float %l1, 1.000000e+001181 br i1 %cmp6, label %if.then8, label %if.else1182 1183if.then8:1184 %add = fadd fast float %sum.033, %l01185 br label %for.inc1186 1187if.else:1188 %cmp14 = fcmp ogt float %l0, 2.000000e+001189 br i1 %cmp14, label %if.then16, label %for.inc1190 1191if.then16:1192 %add19 = fadd fast float %sum.033, %l11193 br label %for.inc1194 1195for.inc:1196 %sum.1 = phi float [ %add, %if.then8 ], [ %add19, %if.then16 ], [ %sum.033, %if.else ], [ %sum.033, %for.body ]1197 %indvars.iv.next = add i64 %indvars.iv, 11198 %lftr.wideiv = trunc i64 %indvars.iv.next to i321199 %exitcond = icmp ne i32 %lftr.wideiv, 1281200 br i1 %exitcond, label %for.body, label %for.end1201 1202for.end:1203 %sum.1.lcssa = phi float [ %sum.1, %for.inc ]1204 ret float %sum.1.lcssa1205}1206 1207define i32 @reduction_sum_multiuse(ptr noalias nocapture %A, ptr noalias nocapture %B) {1208; CHECK-LABEL: define i32 @reduction_sum_multiuse(1209; CHECK-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {1210; CHECK-NEXT: [[_LR_PH1:.*]]:1211; CHECK-NEXT: br label %[[DOTLR_PH:.*]]1212; CHECK: [[_LR_PH:.*:]]1213; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], %[[DOTLR_PH]] ], [ 0, %[[_LR_PH1]] ]1214; CHECK-NEXT: [[SUM_02:%.*]] = phi i32 [ [[L10:%.*]], %[[DOTLR_PH]] ], [ 0, %[[_LR_PH1]] ]1215; CHECK-NEXT: [[L2:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV]]1216; CHECK-NEXT: [[L3:%.*]] = load i32, ptr [[L2]], align 41217; CHECK-NEXT: [[L4:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDVARS_IV]]1218; CHECK-NEXT: [[L5:%.*]] = load i32, ptr [[L4]], align 41219; CHECK-NEXT: [[L6:%.*]] = trunc i64 [[INDVARS_IV]] to i321220; CHECK-NEXT: [[L7:%.*]] = add i32 [[SUM_02]], [[L6]]1221; CHECK-NEXT: [[L8:%.*]] = add i32 [[L7]], [[L3]]1222; CHECK-NEXT: [[L9:%.*]] = add i32 [[L8]], [[L5]]1223; CHECK-NEXT: [[L10]] = add i32 [[L8]], [[SUM_02]]1224; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 11225; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i321226; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[LFTR_WIDEIV]], 2561227; CHECK-NEXT: br i1 [[EXITCOND]], label %[[END:.*]], label %[[DOTLR_PH]]1228; CHECK: [[END]]:1229; CHECK-NEXT: [[F1:%.*]] = phi i32 [ [[L10]], %[[DOTLR_PH]] ]1230; CHECK-NEXT: ret i32 [[F1]]1231;1232; CHECK-INTERLEAVED-LABEL: define i32 @reduction_sum_multiuse(1233; CHECK-INTERLEAVED-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {1234; CHECK-INTERLEAVED-NEXT: [[_LR_PH1:.*]]:1235; CHECK-INTERLEAVED-NEXT: br label %[[DOTLR_PH:.*]]1236; CHECK-INTERLEAVED: [[_LR_PH:.*:]]1237; CHECK-INTERLEAVED-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], %[[DOTLR_PH]] ], [ 0, %[[_LR_PH1]] ]1238; CHECK-INTERLEAVED-NEXT: [[SUM_02:%.*]] = phi i32 [ [[L10:%.*]], %[[DOTLR_PH]] ], [ 0, %[[_LR_PH1]] ]1239; CHECK-INTERLEAVED-NEXT: [[L2:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV]]1240; CHECK-INTERLEAVED-NEXT: [[L3:%.*]] = load i32, ptr [[L2]], align 41241; CHECK-INTERLEAVED-NEXT: [[L4:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDVARS_IV]]1242; CHECK-INTERLEAVED-NEXT: [[L5:%.*]] = load i32, ptr [[L4]], align 41243; CHECK-INTERLEAVED-NEXT: [[L6:%.*]] = trunc i64 [[INDVARS_IV]] to i321244; CHECK-INTERLEAVED-NEXT: [[L7:%.*]] = add i32 [[SUM_02]], [[L6]]1245; CHECK-INTERLEAVED-NEXT: [[L8:%.*]] = add i32 [[L7]], [[L3]]1246; CHECK-INTERLEAVED-NEXT: [[L9:%.*]] = add i32 [[L8]], [[L5]]1247; CHECK-INTERLEAVED-NEXT: [[L10]] = add i32 [[L8]], [[SUM_02]]1248; CHECK-INTERLEAVED-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 11249; CHECK-INTERLEAVED-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i321250; CHECK-INTERLEAVED-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[LFTR_WIDEIV]], 2561251; CHECK-INTERLEAVED-NEXT: br i1 [[EXITCOND]], label %[[END:.*]], label %[[DOTLR_PH]]1252; CHECK-INTERLEAVED: [[END]]:1253; CHECK-INTERLEAVED-NEXT: [[F1:%.*]] = phi i32 [ [[L10]], %[[DOTLR_PH]] ]1254; CHECK-INTERLEAVED-NEXT: ret i32 [[F1]]1255;1256entry:1257 br label %.lr.ph1258 1259.lr.ph: ; preds = %entry, %.lr.ph1260 %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]1261 %sum.02 = phi i32 [ %l10, %.lr.ph ], [ 0, %entry ]1262 %l2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv1263 %l3 = load i32, ptr %l2, align 41264 %l4 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv1265 %l5 = load i32, ptr %l4, align 41266 %l6 = trunc i64 %indvars.iv to i321267 %l7 = add i32 %sum.02, %l61268 %l8 = add i32 %l7, %l31269 %l9 = add i32 %l8, %l51270 %l10 = add i32 %l8, %sum.021271 %indvars.iv.next = add i64 %indvars.iv, 11272 %lftr.wideiv = trunc i64 %indvars.iv.next to i321273 %exitcond = icmp eq i32 %lftr.wideiv, 2561274 br i1 %exitcond, label %end, label %.lr.ph1275 1276end:1277 %f1 = phi i32 [ %l10, %.lr.ph ]1278 ret i32 %f11279}1280 1281; Predicated loop, cannot (yet) use in-loop reductions.1282define i32 @reduction_predicated(ptr noalias nocapture %A, ptr noalias nocapture %B) {1283; CHECK-LABEL: define i32 @reduction_predicated(1284; CHECK-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {1285; CHECK-NEXT: [[ENTRY:.*:]]1286; CHECK-NEXT: br label %[[VECTOR_PH:.*]]1287; CHECK: [[VECTOR_PH]]:1288; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]1289; CHECK: [[VECTOR_BODY]]:1290; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1291; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP7:%.*]], %[[VECTOR_BODY]] ]1292; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]1293; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]1294; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 41295; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]1296; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, ptr [[TMP1]], align 41297; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[VEC_IND]])1298; CHECK-NEXT: [[TMP3:%.*]] = add i32 [[VEC_PHI]], [[TMP2]]1299; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]])1300; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[TMP3]], [[TMP4]]1301; CHECK-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD1]])1302; CHECK-NEXT: [[TMP7]] = add i32 [[TMP5]], [[TMP6]]1303; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 41304; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 4)1305; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 2561306; CHECK-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]1307; CHECK: [[MIDDLE_BLOCK]]:1308; CHECK-NEXT: br [[DOT_CRIT_EDGE:label %.*]]1309; CHECK: [[__CRIT_EDGE:.*:]]1310; CHECK-NEXT: ret i32 [[TMP7]]1311;1312; CHECK-INTERLEAVED-LABEL: define i32 @reduction_predicated(1313; CHECK-INTERLEAVED-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {1314; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]1315; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]1316; CHECK-INTERLEAVED: [[VECTOR_PH]]:1317; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]1318; CHECK-INTERLEAVED: [[VECTOR_BODY]]:1319; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1320; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP13:%.*]], %[[VECTOR_BODY]] ]1321; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP15:%.*]], %[[VECTOR_BODY]] ]1322; CHECK-INTERLEAVED-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]1323; CHECK-INTERLEAVED-NEXT: [[STEP_ADD:%.*]] = add <4 x i32> [[VEC_IND]], splat (i32 4)1324; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]1325; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 41326; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 41327; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP1]], align 41328; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]1329; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 41330; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr [[TMP2]], align 41331; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x i32>, ptr [[TMP3]], align 41332; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[VEC_IND]])1333; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = add i32 [[VEC_PHI]], [[TMP4]]1334; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[STEP_ADD]])1335; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = add i32 [[VEC_PHI1]], [[TMP6]]1336; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]])1337; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = add i32 [[TMP5]], [[TMP8]]1338; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD2]])1339; CHECK-INTERLEAVED-NEXT: [[TMP11:%.*]] = add i32 [[TMP7]], [[TMP10]]1340; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD3]])1341; CHECK-INTERLEAVED-NEXT: [[TMP13]] = add i32 [[TMP9]], [[TMP12]]1342; CHECK-INTERLEAVED-NEXT: [[TMP14:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD4]])1343; CHECK-INTERLEAVED-NEXT: [[TMP15]] = add i32 [[TMP11]], [[TMP14]]1344; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 81345; CHECK-INTERLEAVED-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[STEP_ADD]], splat (i32 4)1346; CHECK-INTERLEAVED-NEXT: [[TMP16:%.*]] = icmp eq i64 [[INDEX_NEXT]], 2561347; CHECK-INTERLEAVED-NEXT: br i1 [[TMP16]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]1348; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:1349; CHECK-INTERLEAVED-NEXT: [[SUM_0_LCSSA:%.*]] = add i32 [[TMP15]], [[TMP13]]1350; CHECK-INTERLEAVED-NEXT: br [[DOT_CRIT_EDGE:label %.*]]1351; CHECK-INTERLEAVED: [[__CRIT_EDGE:.*:]]1352; CHECK-INTERLEAVED-NEXT: ret i32 [[SUM_0_LCSSA]]1353;1354entry:1355 br label %.lr.ph1356 1357.lr.ph: ; preds = %entry, %.lr.ph1358 %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]1359 %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ]1360 %l2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv1361 %l3 = load i32, ptr %l2, align 41362 %l4 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv1363 %l5 = load i32, ptr %l4, align 41364 %l6 = trunc i64 %indvars.iv to i321365 %l7 = add i32 %sum.02, %l61366 %l8 = add i32 %l7, %l31367 %l9 = add i32 %l8, %l51368 %indvars.iv.next = add i64 %indvars.iv, 11369 %lftr.wideiv = trunc i64 %indvars.iv.next to i321370 %exitcond = icmp eq i32 %lftr.wideiv, 2561371 br i1 %exitcond, label %._crit_edge, label %.lr.ph, !llvm.loop !61372 1373._crit_edge: ; preds = %.lr.ph1374 %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ]1375 ret i32 %sum.0.lcssa1376}1377 1378define i8 @reduction_add_trunc(ptr noalias nocapture %A) {1379; CHECK-LABEL: define i8 @reduction_add_trunc(1380; CHECK-SAME: ptr noalias captures(none) [[A:%.*]]) {1381; CHECK-NEXT: [[ENTRY:.*:]]1382; CHECK-NEXT: br label %[[VECTOR_PH:.*]]1383; CHECK: [[VECTOR_PH]]:1384; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]1385; CHECK: [[VECTOR_BODY]]:1386; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1387; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ <i32 255, i32 0, i32 0, i32 0>, %[[VECTOR_PH]] ], [ [[TMP5:%.*]], %[[VECTOR_BODY]] ]1388; CHECK-NEXT: [[TMP0:%.*]] = and <4 x i32> [[VEC_PHI]], splat (i32 255)1389; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[A]], i32 [[INDEX]]1390; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 41391; CHECK-NEXT: [[TMP2:%.*]] = zext <4 x i8> [[WIDE_LOAD]] to <4 x i32>1392; CHECK-NEXT: [[TMP6:%.*]] = add <4 x i32> [[TMP0]], [[TMP2]]1393; CHECK-NEXT: [[TMP4:%.*]] = trunc <4 x i32> [[TMP6]] to <4 x i8>1394; CHECK-NEXT: [[TMP5]] = zext <4 x i8> [[TMP4]] to <4 x i32>1395; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 41396; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 2561397; CHECK-NEXT: br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]1398; CHECK: [[MIDDLE_BLOCK]]:1399; CHECK-NEXT: [[TMP7:%.*]] = call i8 @llvm.vector.reduce.add.v4i8(<4 x i8> [[TMP4]])1400; CHECK-NEXT: [[TMP8:%.*]] = zext i8 [[TMP7]] to i321401; CHECK-NEXT: br [[DOT_CRIT_EDGE:label %.*]]1402; CHECK: [[__CRIT_EDGE:.*:]]1403; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = trunc i32 [[TMP8]] to i81404; CHECK-NEXT: ret i8 [[SUM_0_LCSSA]]1405;1406; CHECK-INTERLEAVED-LABEL: define i8 @reduction_add_trunc(1407; CHECK-INTERLEAVED-SAME: ptr noalias captures(none) [[A:%.*]]) {1408; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]1409; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]1410; CHECK-INTERLEAVED: [[VECTOR_PH]]:1411; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]1412; CHECK-INTERLEAVED: [[VECTOR_BODY]]:1413; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1414; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ <i32 255, i32 0, i32 0, i32 0>, %[[VECTOR_PH]] ], [ [[TMP10:%.*]], %[[VECTOR_BODY]] ]1415; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi <4 x i32> [ zeroinitializer, %[[VECTOR_PH]] ], [ [[TMP11:%.*]], %[[VECTOR_BODY]] ]1416; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = and <4 x i32> [[VEC_PHI]], splat (i32 255)1417; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = and <4 x i32> [[VEC_PHI1]], splat (i32 255)1418; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[A]], i32 [[INDEX]]1419; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP1]], i64 41420; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 41421; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i8>, ptr [[TMP2]], align 41422; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = zext <4 x i8> [[WIDE_LOAD]] to <4 x i32>1423; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = zext <4 x i8> [[WIDE_LOAD2]] to <4 x i32>1424; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = add <4 x i32> [[TMP0]], [[TMP4]]1425; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = add <4 x i32> [[TMP3]], [[TMP12]]1426; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = trunc <4 x i32> [[TMP6]] to <4 x i8>1427; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = trunc <4 x i32> [[TMP7]] to <4 x i8>1428; CHECK-INTERLEAVED-NEXT: [[TMP10]] = zext <4 x i8> [[TMP8]] to <4 x i32>1429; CHECK-INTERLEAVED-NEXT: [[TMP11]] = zext <4 x i8> [[TMP9]] to <4 x i32>1430; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 81431; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = icmp eq i32 [[INDEX_NEXT]], 2561432; CHECK-INTERLEAVED-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]1433; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:1434; CHECK-INTERLEAVED-NEXT: [[BIN_RDX:%.*]] = add <4 x i8> [[TMP9]], [[TMP8]]1435; CHECK-INTERLEAVED-NEXT: [[TMP13:%.*]] = call i8 @llvm.vector.reduce.add.v4i8(<4 x i8> [[BIN_RDX]])1436; CHECK-INTERLEAVED-NEXT: [[TMP14:%.*]] = zext i8 [[TMP13]] to i321437; CHECK-INTERLEAVED-NEXT: br [[DOT_CRIT_EDGE:label %.*]]1438; CHECK-INTERLEAVED: [[__CRIT_EDGE:.*:]]1439; CHECK-INTERLEAVED-NEXT: [[SUM_0_LCSSA:%.*]] = trunc i32 [[TMP14]] to i81440; CHECK-INTERLEAVED-NEXT: ret i8 [[SUM_0_LCSSA]]1441;1442entry:1443 br label %.lr.ph1444 1445.lr.ph: ; preds = %entry, %.lr.ph1446 %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]1447 %sum.02p = phi i32 [ %l9, %.lr.ph ], [ 255, %entry ]1448 %sum.02 = and i32 %sum.02p, 2551449 %l2 = getelementptr inbounds i8, ptr %A, i32 %indvars.iv1450 %l3 = load i8, ptr %l2, align 41451 %l3e = zext i8 %l3 to i321452 %l9 = add i32 %sum.02, %l3e1453 %indvars.iv.next = add i32 %indvars.iv, 11454 %exitcond = icmp eq i32 %indvars.iv.next, 2561455 br i1 %exitcond, label %._crit_edge, label %.lr.ph1456 1457._crit_edge: ; preds = %.lr.ph1458 %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ]1459 %ret = trunc i32 %sum.0.lcssa to i81460 ret i8 %ret1461}1462 1463 1464define i8 @reduction_and_trunc(ptr noalias nocapture %A) {1465; CHECK-LABEL: define i8 @reduction_and_trunc(1466; CHECK-SAME: ptr noalias captures(none) [[A:%.*]]) {1467; CHECK-NEXT: [[ENTRY:.*:]]1468; CHECK-NEXT: br label %[[VECTOR_PH:.*]]1469; CHECK: [[VECTOR_PH]]:1470; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]1471; CHECK: [[VECTOR_BODY]]:1472; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1473; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ <i32 255, i32 -1, i32 -1, i32 -1>, %[[VECTOR_PH]] ], [ [[TMP5:%.*]], %[[VECTOR_BODY]] ]1474; CHECK-NEXT: [[TMP0:%.*]] = and <4 x i32> [[VEC_PHI]], splat (i32 255)1475; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[A]], i32 [[INDEX]]1476; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 41477; CHECK-NEXT: [[TMP2:%.*]] = zext <4 x i8> [[WIDE_LOAD]] to <4 x i32>1478; CHECK-NEXT: [[TMP6:%.*]] = and <4 x i32> [[TMP0]], [[TMP2]]1479; CHECK-NEXT: [[TMP4:%.*]] = trunc <4 x i32> [[TMP6]] to <4 x i8>1480; CHECK-NEXT: [[TMP5]] = zext <4 x i8> [[TMP4]] to <4 x i32>1481; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 41482; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 2561483; CHECK-NEXT: br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]1484; CHECK: [[MIDDLE_BLOCK]]:1485; CHECK-NEXT: [[TMP7:%.*]] = call i8 @llvm.vector.reduce.and.v4i8(<4 x i8> [[TMP4]])1486; CHECK-NEXT: [[TMP8:%.*]] = zext i8 [[TMP7]] to i321487; CHECK-NEXT: br [[DOT_CRIT_EDGE:label %.*]]1488; CHECK: [[__CRIT_EDGE:.*:]]1489; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = trunc i32 [[TMP8]] to i81490; CHECK-NEXT: ret i8 [[SUM_0_LCSSA]]1491;1492; CHECK-INTERLEAVED-LABEL: define i8 @reduction_and_trunc(1493; CHECK-INTERLEAVED-SAME: ptr noalias captures(none) [[A:%.*]]) {1494; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]1495; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]1496; CHECK-INTERLEAVED: [[VECTOR_PH]]:1497; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]1498; CHECK-INTERLEAVED: [[VECTOR_BODY]]:1499; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1500; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ <i32 255, i32 -1, i32 -1, i32 -1>, %[[VECTOR_PH]] ], [ [[TMP10:%.*]], %[[VECTOR_BODY]] ]1501; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi <4 x i32> [ splat (i32 -1), %[[VECTOR_PH]] ], [ [[TMP11:%.*]], %[[VECTOR_BODY]] ]1502; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = and <4 x i32> [[VEC_PHI]], splat (i32 255)1503; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = and <4 x i32> [[VEC_PHI1]], splat (i32 255)1504; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[A]], i32 [[INDEX]]1505; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP1]], i64 41506; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 41507; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i8>, ptr [[TMP2]], align 41508; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = zext <4 x i8> [[WIDE_LOAD]] to <4 x i32>1509; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = zext <4 x i8> [[WIDE_LOAD2]] to <4 x i32>1510; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = and <4 x i32> [[TMP0]], [[TMP4]]1511; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = and <4 x i32> [[TMP3]], [[TMP12]]1512; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = trunc <4 x i32> [[TMP6]] to <4 x i8>1513; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = trunc <4 x i32> [[TMP7]] to <4 x i8>1514; CHECK-INTERLEAVED-NEXT: [[TMP10]] = zext <4 x i8> [[TMP8]] to <4 x i32>1515; CHECK-INTERLEAVED-NEXT: [[TMP11]] = zext <4 x i8> [[TMP9]] to <4 x i32>1516; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 81517; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = icmp eq i32 [[INDEX_NEXT]], 2561518; CHECK-INTERLEAVED-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]1519; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:1520; CHECK-INTERLEAVED-NEXT: [[BIN_RDX:%.*]] = and <4 x i8> [[TMP9]], [[TMP8]]1521; CHECK-INTERLEAVED-NEXT: [[TMP13:%.*]] = call i8 @llvm.vector.reduce.and.v4i8(<4 x i8> [[BIN_RDX]])1522; CHECK-INTERLEAVED-NEXT: [[TMP14:%.*]] = zext i8 [[TMP13]] to i321523; CHECK-INTERLEAVED-NEXT: br [[DOT_CRIT_EDGE:label %.*]]1524; CHECK-INTERLEAVED: [[__CRIT_EDGE:.*:]]1525; CHECK-INTERLEAVED-NEXT: [[SUM_0_LCSSA:%.*]] = trunc i32 [[TMP14]] to i81526; CHECK-INTERLEAVED-NEXT: ret i8 [[SUM_0_LCSSA]]1527;1528entry:1529 br label %.lr.ph1530 1531.lr.ph: ; preds = %entry, %.lr.ph1532 %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]1533 %sum.02p = phi i32 [ %l9, %.lr.ph ], [ 255, %entry ]1534 %sum.02 = and i32 %sum.02p, 2551535 %l2 = getelementptr inbounds i8, ptr %A, i32 %indvars.iv1536 %l3 = load i8, ptr %l2, align 41537 %l3e = zext i8 %l3 to i321538 %l9 = and i32 %sum.02, %l3e1539 %indvars.iv.next = add i32 %indvars.iv, 11540 %exitcond = icmp eq i32 %indvars.iv.next, 2561541 br i1 %exitcond, label %._crit_edge, label %.lr.ph1542 1543._crit_edge: ; preds = %.lr.ph1544 %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ]1545 %ret = trunc i32 %sum.0.lcssa to i81546 ret i8 %ret1547}1548 1549; Test case when loop has a call to the llvm.fmuladd intrinsic.1550define float @reduction_fmuladd(ptr %a, ptr %b, i64 %n) {1551; CHECK-LABEL: define float @reduction_fmuladd(1552; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i64 [[N:%.*]]) {1553; CHECK-NEXT: [[ENTRY:.*]]:1554; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 41555; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1556; CHECK: [[VECTOR_PH]]:1557; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 41558; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]1559; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]1560; CHECK: [[VECTOR_BODY]]:1561; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1562; CHECK-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, %[[VECTOR_PH]] ], [ [[TMP4:%.*]], %[[VECTOR_BODY]] ]1563; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]1564; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP0]], align 41565; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]1566; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x float>, ptr [[TMP1]], align 41567; CHECK-NEXT: [[TMP2:%.*]] = fmul <4 x float> [[WIDE_LOAD]], [[WIDE_LOAD1]]1568; CHECK-NEXT: [[TMP3:%.*]] = call float @llvm.vector.reduce.fadd.v4f32(float -0.000000e+00, <4 x float> [[TMP2]])1569; CHECK-NEXT: [[TMP4]] = fadd float [[VEC_PHI]], [[TMP3]]1570; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 41571; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]1572; CHECK-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]1573; CHECK: [[MIDDLE_BLOCK]]:1574; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]1575; CHECK-NEXT: br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]1576; CHECK: [[SCALAR_PH]]:1577; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]1578; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = phi float [ [[TMP4]], %[[MIDDLE_BLOCK]] ], [ 0.000000e+00, %[[ENTRY]] ]1579; CHECK-NEXT: br label %[[FOR_BODY:.*]]1580; CHECK: [[FOR_BODY]]:1581; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[FOR_BODY]] ]1582; CHECK-NEXT: [[SUM_07:%.*]] = phi float [ [[BC_MERGE_RDX]], %[[SCALAR_PH]] ], [ [[MULADD:%.*]], %[[FOR_BODY]] ]1583; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]1584; CHECK-NEXT: [[TMP6:%.*]] = load float, ptr [[ARRAYIDX]], align 41585; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[IV]]1586; CHECK-NEXT: [[TMP7:%.*]] = load float, ptr [[ARRAYIDX2]], align 41587; CHECK-NEXT: [[MULADD]] = tail call float @llvm.fmuladd.f32(float [[TMP6]], float [[TMP7]], float [[SUM_07]])1588; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 11589; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]1590; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_END]], label %[[FOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]]1591; CHECK: [[FOR_END]]:1592; CHECK-NEXT: [[MULADD_LCSSA:%.*]] = phi float [ [[MULADD]], %[[FOR_BODY]] ], [ [[TMP4]], %[[MIDDLE_BLOCK]] ]1593; CHECK-NEXT: ret float [[MULADD_LCSSA]]1594;1595; CHECK-INTERLEAVED-LABEL: define float @reduction_fmuladd(1596; CHECK-INTERLEAVED-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i64 [[N:%.*]]) {1597; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*]]:1598; CHECK-INTERLEAVED-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 81599; CHECK-INTERLEAVED-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1600; CHECK-INTERLEAVED: [[VECTOR_PH]]:1601; CHECK-INTERLEAVED-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 81602; CHECK-INTERLEAVED-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]1603; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]1604; CHECK-INTERLEAVED: [[VECTOR_BODY]]:1605; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1606; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, %[[VECTOR_PH]] ], [ [[TMP7:%.*]], %[[VECTOR_BODY]] ]1607; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi float [ -0.000000e+00, %[[VECTOR_PH]] ], [ [[TMP9:%.*]], %[[VECTOR_BODY]] ]1608; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]1609; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[TMP0]], i64 41610; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP0]], align 41611; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x float>, ptr [[TMP1]], align 41612; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]1613; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i64 41614; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x float>, ptr [[TMP2]], align 41615; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x float>, ptr [[TMP3]], align 41616; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = fmul <4 x float> [[WIDE_LOAD]], [[WIDE_LOAD3]]1617; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = fmul <4 x float> [[WIDE_LOAD2]], [[WIDE_LOAD4]]1618; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = call float @llvm.vector.reduce.fadd.v4f32(float -0.000000e+00, <4 x float> [[TMP4]])1619; CHECK-INTERLEAVED-NEXT: [[TMP7]] = fadd float [[VEC_PHI]], [[TMP6]]1620; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = call float @llvm.vector.reduce.fadd.v4f32(float -0.000000e+00, <4 x float> [[TMP5]])1621; CHECK-INTERLEAVED-NEXT: [[TMP9]] = fadd float [[VEC_PHI1]], [[TMP8]]1622; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 81623; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]1624; CHECK-INTERLEAVED-NEXT: br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]1625; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:1626; CHECK-INTERLEAVED-NEXT: [[BIN_RDX:%.*]] = fadd float [[TMP9]], [[TMP7]]1627; CHECK-INTERLEAVED-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]1628; CHECK-INTERLEAVED-NEXT: br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]1629; CHECK-INTERLEAVED: [[SCALAR_PH]]:1630; CHECK-INTERLEAVED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]1631; CHECK-INTERLEAVED-NEXT: [[BC_MERGE_RDX:%.*]] = phi float [ [[BIN_RDX]], %[[MIDDLE_BLOCK]] ], [ 0.000000e+00, %[[ENTRY]] ]1632; CHECK-INTERLEAVED-NEXT: br label %[[FOR_BODY:.*]]1633; CHECK-INTERLEAVED: [[FOR_BODY]]:1634; CHECK-INTERLEAVED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[FOR_BODY]] ]1635; CHECK-INTERLEAVED-NEXT: [[SUM_07:%.*]] = phi float [ [[BC_MERGE_RDX]], %[[SCALAR_PH]] ], [ [[MULADD:%.*]], %[[FOR_BODY]] ]1636; CHECK-INTERLEAVED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]1637; CHECK-INTERLEAVED-NEXT: [[TMP11:%.*]] = load float, ptr [[ARRAYIDX]], align 41638; CHECK-INTERLEAVED-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[IV]]1639; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = load float, ptr [[ARRAYIDX2]], align 41640; CHECK-INTERLEAVED-NEXT: [[MULADD]] = tail call float @llvm.fmuladd.f32(float [[TMP11]], float [[TMP12]], float [[SUM_07]])1641; CHECK-INTERLEAVED-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 11642; CHECK-INTERLEAVED-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]1643; CHECK-INTERLEAVED-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_END]], label %[[FOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]]1644; CHECK-INTERLEAVED: [[FOR_END]]:1645; CHECK-INTERLEAVED-NEXT: [[MULADD_LCSSA:%.*]] = phi float [ [[MULADD]], %[[FOR_BODY]] ], [ [[BIN_RDX]], %[[MIDDLE_BLOCK]] ]1646; CHECK-INTERLEAVED-NEXT: ret float [[MULADD_LCSSA]]1647;1648 1649entry:1650 br label %for.body1651 1652for.body:1653 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]1654 %sum.07 = phi float [ 0.000000e+00, %entry ], [ %muladd, %for.body ]1655 %arrayidx = getelementptr inbounds float, ptr %a, i64 %iv1656 %0 = load float, ptr %arrayidx, align 41657 %arrayidx2 = getelementptr inbounds float, ptr %b, i64 %iv1658 %1 = load float, ptr %arrayidx2, align 41659 %muladd = tail call float @llvm.fmuladd.f32(float %0, float %1, float %sum.07)1660 %iv.next = add nuw nsw i64 %iv, 11661 %exitcond.not = icmp eq i64 %iv.next, %n1662 br i1 %exitcond.not, label %for.end, label %for.body1663 1664for.end:1665 ret float %muladd1666}1667 1668define float @reduction_fmuladd_recurrence_first_arg(ptr %a, ptr %b, i64 %n) {1669; CHECK-LABEL: define float @reduction_fmuladd_recurrence_first_arg(1670; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i64 [[N:%.*]]) {1671; CHECK-NEXT: [[ENTRY:.*]]:1672; CHECK-NEXT: br label %[[FOR_BODY:.*]]1673; CHECK: [[FOR_BODY]]:1674; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[FOR_BODY]] ]1675; CHECK-NEXT: [[SUM_07:%.*]] = phi float [ 0.000000e+00, %[[ENTRY]] ], [ [[MULADD:%.*]], %[[FOR_BODY]] ]1676; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]1677; CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[ARRAYIDX]], align 41678; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[IV]]1679; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[ARRAYIDX2]], align 41680; CHECK-NEXT: [[MULADD]] = tail call float @llvm.fmuladd.f32(float [[SUM_07]], float [[TMP0]], float [[TMP1]])1681; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 11682; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]1683; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_END:.*]], label %[[FOR_BODY]]1684; CHECK: [[FOR_END]]:1685; CHECK-NEXT: [[MULADD_LCSSA:%.*]] = phi float [ [[MULADD]], %[[FOR_BODY]] ]1686; CHECK-NEXT: ret float [[MULADD_LCSSA]]1687;1688; CHECK-INTERLEAVED-LABEL: define float @reduction_fmuladd_recurrence_first_arg(1689; CHECK-INTERLEAVED-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i64 [[N:%.*]]) {1690; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*]]:1691; CHECK-INTERLEAVED-NEXT: br label %[[FOR_BODY:.*]]1692; CHECK-INTERLEAVED: [[FOR_BODY]]:1693; CHECK-INTERLEAVED-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[FOR_BODY]] ]1694; CHECK-INTERLEAVED-NEXT: [[SUM_07:%.*]] = phi float [ 0.000000e+00, %[[ENTRY]] ], [ [[MULADD:%.*]], %[[FOR_BODY]] ]1695; CHECK-INTERLEAVED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]1696; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = load float, ptr [[ARRAYIDX]], align 41697; CHECK-INTERLEAVED-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[IV]]1698; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = load float, ptr [[ARRAYIDX2]], align 41699; CHECK-INTERLEAVED-NEXT: [[MULADD]] = tail call float @llvm.fmuladd.f32(float [[SUM_07]], float [[TMP0]], float [[TMP1]])1700; CHECK-INTERLEAVED-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 11701; CHECK-INTERLEAVED-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]1702; CHECK-INTERLEAVED-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_END:.*]], label %[[FOR_BODY]]1703; CHECK-INTERLEAVED: [[FOR_END]]:1704; CHECK-INTERLEAVED-NEXT: [[MULADD_LCSSA:%.*]] = phi float [ [[MULADD]], %[[FOR_BODY]] ]1705; CHECK-INTERLEAVED-NEXT: ret float [[MULADD_LCSSA]]1706;1707 1708entry:1709 br label %for.body1710 1711for.body:1712 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]1713 %sum.07 = phi float [ 0.000000e+00, %entry ], [ %muladd, %for.body ]1714 %arrayidx = getelementptr inbounds float, ptr %a, i64 %iv1715 %0 = load float, ptr %arrayidx, align 41716 %arrayidx2 = getelementptr inbounds float, ptr %b, i64 %iv1717 %1 = load float, ptr %arrayidx2, align 41718 %muladd = tail call float @llvm.fmuladd.f32(float %sum.07, float %0, float %1)1719 %iv.next = add nuw nsw i64 %iv, 11720 %exitcond.not = icmp eq i64 %iv.next, %n1721 br i1 %exitcond.not, label %for.end, label %for.body1722 1723for.end:1724 ret float %muladd1725}1726 1727define float @reduction_fmuladd_recurrence_second_arg(ptr %a, ptr %b, i64 %n) {1728; CHECK-LABEL: define float @reduction_fmuladd_recurrence_second_arg(1729; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i64 [[N:%.*]]) {1730; CHECK-NEXT: [[ENTRY:.*]]:1731; CHECK-NEXT: br label %[[FOR_BODY:.*]]1732; CHECK: [[FOR_BODY]]:1733; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[FOR_BODY]] ]1734; CHECK-NEXT: [[SUM_07:%.*]] = phi float [ 0.000000e+00, %[[ENTRY]] ], [ [[MULADD:%.*]], %[[FOR_BODY]] ]1735; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]1736; CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[ARRAYIDX]], align 41737; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[IV]]1738; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[ARRAYIDX2]], align 41739; CHECK-NEXT: [[MULADD]] = tail call float @llvm.fmuladd.f32(float [[TMP0]], float [[SUM_07]], float [[TMP1]])1740; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 11741; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]1742; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_END:.*]], label %[[FOR_BODY]]1743; CHECK: [[FOR_END]]:1744; CHECK-NEXT: [[MULADD_LCSSA:%.*]] = phi float [ [[MULADD]], %[[FOR_BODY]] ]1745; CHECK-NEXT: ret float [[MULADD_LCSSA]]1746;1747; CHECK-INTERLEAVED-LABEL: define float @reduction_fmuladd_recurrence_second_arg(1748; CHECK-INTERLEAVED-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i64 [[N:%.*]]) {1749; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*]]:1750; CHECK-INTERLEAVED-NEXT: br label %[[FOR_BODY:.*]]1751; CHECK-INTERLEAVED: [[FOR_BODY]]:1752; CHECK-INTERLEAVED-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[FOR_BODY]] ]1753; CHECK-INTERLEAVED-NEXT: [[SUM_07:%.*]] = phi float [ 0.000000e+00, %[[ENTRY]] ], [ [[MULADD:%.*]], %[[FOR_BODY]] ]1754; CHECK-INTERLEAVED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]1755; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = load float, ptr [[ARRAYIDX]], align 41756; CHECK-INTERLEAVED-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[IV]]1757; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = load float, ptr [[ARRAYIDX2]], align 41758; CHECK-INTERLEAVED-NEXT: [[MULADD]] = tail call float @llvm.fmuladd.f32(float [[TMP0]], float [[SUM_07]], float [[TMP1]])1759; CHECK-INTERLEAVED-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 11760; CHECK-INTERLEAVED-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]1761; CHECK-INTERLEAVED-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_END:.*]], label %[[FOR_BODY]]1762; CHECK-INTERLEAVED: [[FOR_END]]:1763; CHECK-INTERLEAVED-NEXT: [[MULADD_LCSSA:%.*]] = phi float [ [[MULADD]], %[[FOR_BODY]] ]1764; CHECK-INTERLEAVED-NEXT: ret float [[MULADD_LCSSA]]1765;1766 1767entry:1768 br label %for.body1769 1770for.body:1771 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]1772 %sum.07 = phi float [ 0.000000e+00, %entry ], [ %muladd, %for.body ]1773 %arrayidx = getelementptr inbounds float, ptr %a, i64 %iv1774 %0 = load float, ptr %arrayidx, align 41775 %arrayidx2 = getelementptr inbounds float, ptr %b, i64 %iv1776 %1 = load float, ptr %arrayidx2, align 41777 %muladd = tail call float @llvm.fmuladd.f32(float %0, float %sum.07, float %1)1778 %iv.next = add nuw nsw i64 %iv, 11779 %exitcond.not = icmp eq i64 %iv.next, %n1780 br i1 %exitcond.not, label %for.end, label %for.body1781 1782for.end:1783 ret float %muladd1784}1785 1786define float @reduction_fmuladd_blend(ptr %a, ptr %b, i64 %n, i1 %c) {1787; CHECK-LABEL: define float @reduction_fmuladd_blend(1788; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i64 [[N:%.*]], i1 [[C:%.*]]) {1789; CHECK-NEXT: [[ENTRY:.*]]:1790; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 41791; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1792; CHECK: [[VECTOR_PH]]:1793; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 41794; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]1795; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i1> poison, i1 [[C]], i64 01796; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i1> [[BROADCAST_SPLATINSERT]], <4 x i1> poison, <4 x i32> zeroinitializer1797; CHECK-NEXT: [[TMP1:%.*]] = xor <4 x i1> [[BROADCAST_SPLAT]], splat (i1 true)1798; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]1799; CHECK: [[VECTOR_BODY]]:1800; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1801; CHECK-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, %[[VECTOR_PH]] ], [ [[TMP7:%.*]], %[[VECTOR_BODY]] ]1802; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]1803; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP2]], align 41804; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]1805; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x float>, ptr [[TMP3]], align 41806; CHECK-NEXT: [[TMP4:%.*]] = fmul <4 x float> [[WIDE_LOAD]], [[WIDE_LOAD1]]1807; CHECK-NEXT: [[TMP5:%.*]] = select <4 x i1> [[TMP1]], <4 x float> [[TMP4]], <4 x float> splat (float -0.000000e+00)1808; CHECK-NEXT: [[TMP6:%.*]] = call float @llvm.vector.reduce.fadd.v4f32(float -0.000000e+00, <4 x float> [[TMP5]])1809; CHECK-NEXT: [[TMP7]] = fadd float [[VEC_PHI]], [[TMP6]]1810; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 41811; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]1812; CHECK-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]]1813; CHECK: [[MIDDLE_BLOCK]]:1814; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]1815; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]1816; CHECK: [[SCALAR_PH]]:1817; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]1818; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = phi float [ [[TMP7]], %[[MIDDLE_BLOCK]] ], [ 0.000000e+00, %[[ENTRY]] ]1819; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]1820; CHECK: [[LOOP_HEADER]]:1821; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LATCH:.*]] ]1822; CHECK-NEXT: [[SUM:%.*]] = phi float [ [[BC_MERGE_RDX]], %[[SCALAR_PH]] ], [ [[SUM_NEXT:%.*]], %[[LATCH]] ]1823; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]1824; CHECK-NEXT: [[TMP9:%.*]] = load float, ptr [[ARRAYIDX2]], align 41825; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[IV]]1826; CHECK-NEXT: [[TMP10:%.*]] = load float, ptr [[ARRAYIDX]], align 41827; CHECK-NEXT: br i1 [[C]], label %[[IF:.*]], label %[[ELSE:.*]]1828; CHECK: [[IF]]:1829; CHECK-NEXT: br label %[[LATCH]]1830; CHECK: [[ELSE]]:1831; CHECK-NEXT: [[MULADD:%.*]] = tail call float @llvm.fmuladd.f32(float [[TMP9]], float [[TMP10]], float [[SUM]])1832; CHECK-NEXT: br label %[[LATCH]]1833; CHECK: [[LATCH]]:1834; CHECK-NEXT: [[SUM_NEXT]] = phi float [ [[SUM]], %[[IF]] ], [ [[MULADD]], %[[ELSE]] ]1835; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 11836; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]1837; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP22:![0-9]+]]1838; CHECK: [[EXIT]]:1839; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi float [ [[SUM_NEXT]], %[[LATCH]] ], [ [[TMP7]], %[[MIDDLE_BLOCK]] ]1840; CHECK-NEXT: ret float [[SUM_NEXT_LCSSA]]1841;1842; CHECK-INTERLEAVED-LABEL: define float @reduction_fmuladd_blend(1843; CHECK-INTERLEAVED-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i64 [[N:%.*]], i1 [[C:%.*]]) {1844; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*]]:1845; CHECK-INTERLEAVED-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 81846; CHECK-INTERLEAVED-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1847; CHECK-INTERLEAVED: [[VECTOR_PH]]:1848; CHECK-INTERLEAVED-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 81849; CHECK-INTERLEAVED-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]1850; CHECK-INTERLEAVED-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i1> poison, i1 [[C]], i64 01851; CHECK-INTERLEAVED-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i1> [[BROADCAST_SPLATINSERT]], <4 x i1> poison, <4 x i32> zeroinitializer1852; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = xor <4 x i1> [[BROADCAST_SPLAT]], splat (i1 true)1853; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]1854; CHECK-INTERLEAVED: [[VECTOR_BODY]]:1855; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1856; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, %[[VECTOR_PH]] ], [ [[TMP10:%.*]], %[[VECTOR_BODY]] ]1857; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi float [ -0.000000e+00, %[[VECTOR_PH]] ], [ [[TMP13:%.*]], %[[VECTOR_BODY]] ]1858; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]1859; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i64 41860; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP2]], align 41861; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x float>, ptr [[TMP3]], align 41862; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]1863; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, ptr [[TMP4]], i64 41864; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x float>, ptr [[TMP4]], align 41865; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x float>, ptr [[TMP5]], align 41866; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = fmul <4 x float> [[WIDE_LOAD]], [[WIDE_LOAD3]]1867; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = fmul <4 x float> [[WIDE_LOAD2]], [[WIDE_LOAD4]]1868; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = select <4 x i1> [[TMP1]], <4 x float> [[TMP6]], <4 x float> splat (float -0.000000e+00)1869; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = call float @llvm.vector.reduce.fadd.v4f32(float -0.000000e+00, <4 x float> [[TMP8]])1870; CHECK-INTERLEAVED-NEXT: [[TMP10]] = fadd float [[VEC_PHI]], [[TMP9]]1871; CHECK-INTERLEAVED-NEXT: [[TMP11:%.*]] = select <4 x i1> [[TMP1]], <4 x float> [[TMP7]], <4 x float> splat (float -0.000000e+00)1872; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = call float @llvm.vector.reduce.fadd.v4f32(float -0.000000e+00, <4 x float> [[TMP11]])1873; CHECK-INTERLEAVED-NEXT: [[TMP13]] = fadd float [[VEC_PHI1]], [[TMP12]]1874; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 81875; CHECK-INTERLEAVED-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]1876; CHECK-INTERLEAVED-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]]1877; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:1878; CHECK-INTERLEAVED-NEXT: [[BIN_RDX:%.*]] = fadd float [[TMP13]], [[TMP10]]1879; CHECK-INTERLEAVED-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]1880; CHECK-INTERLEAVED-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]1881; CHECK-INTERLEAVED: [[SCALAR_PH]]:1882; CHECK-INTERLEAVED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]1883; CHECK-INTERLEAVED-NEXT: [[BC_MERGE_RDX:%.*]] = phi float [ [[BIN_RDX]], %[[MIDDLE_BLOCK]] ], [ 0.000000e+00, %[[ENTRY]] ]1884; CHECK-INTERLEAVED-NEXT: br label %[[LOOP_HEADER:.*]]1885; CHECK-INTERLEAVED: [[LOOP_HEADER]]:1886; CHECK-INTERLEAVED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LATCH:.*]] ]1887; CHECK-INTERLEAVED-NEXT: [[SUM:%.*]] = phi float [ [[BC_MERGE_RDX]], %[[SCALAR_PH]] ], [ [[SUM_NEXT:%.*]], %[[LATCH]] ]1888; CHECK-INTERLEAVED-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]1889; CHECK-INTERLEAVED-NEXT: [[TMP15:%.*]] = load float, ptr [[ARRAYIDX2]], align 41890; CHECK-INTERLEAVED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[IV]]1891; CHECK-INTERLEAVED-NEXT: [[TMP16:%.*]] = load float, ptr [[ARRAYIDX]], align 41892; CHECK-INTERLEAVED-NEXT: br i1 [[C]], label %[[IF:.*]], label %[[ELSE:.*]]1893; CHECK-INTERLEAVED: [[IF]]:1894; CHECK-INTERLEAVED-NEXT: br label %[[LATCH]]1895; CHECK-INTERLEAVED: [[ELSE]]:1896; CHECK-INTERLEAVED-NEXT: [[MULADD:%.*]] = tail call float @llvm.fmuladd.f32(float [[TMP15]], float [[TMP16]], float [[SUM]])1897; CHECK-INTERLEAVED-NEXT: br label %[[LATCH]]1898; CHECK-INTERLEAVED: [[LATCH]]:1899; CHECK-INTERLEAVED-NEXT: [[SUM_NEXT]] = phi float [ [[SUM]], %[[IF]] ], [ [[MULADD]], %[[ELSE]] ]1900; CHECK-INTERLEAVED-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 11901; CHECK-INTERLEAVED-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]1902; CHECK-INTERLEAVED-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP22:![0-9]+]]1903; CHECK-INTERLEAVED: [[EXIT]]:1904; CHECK-INTERLEAVED-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi float [ [[SUM_NEXT]], %[[LATCH]] ], [ [[BIN_RDX]], %[[MIDDLE_BLOCK]] ]1905; CHECK-INTERLEAVED-NEXT: ret float [[SUM_NEXT_LCSSA]]1906;1907entry:1908 br label %loop.header1909 1910loop.header:1911 %iv = phi i64 [ 0, %entry ], [ %iv.next, %latch ]1912 %sum = phi float [ 0.000000e+00, %entry ], [ %sum.next, %latch ]1913 %arrayidx = getelementptr inbounds float, ptr %a, i64 %iv1914 %0 = load float, ptr %arrayidx, align 41915 %arrayidx2 = getelementptr inbounds float, ptr %b, i64 %iv1916 %1 = load float, ptr %arrayidx2, align 41917 br i1 %c, label %if, label %else1918 1919if:1920 br label %latch1921 1922else:1923 %muladd = tail call float @llvm.fmuladd.f32(float %0, float %1, float %sum)1924 br label %latch1925 1926latch:1927 %sum.next = phi float [ %sum, %if ], [ %muladd, %else ]1928 %iv.next = add nuw nsw i64 %iv, 11929 %exitcond.not = icmp eq i64 %iv.next, %n1930 br i1 %exitcond.not, label %exit, label %loop.header1931 1932exit:1933 ret float %sum.next1934}1935 1936; This case was previously failing verification due to the mask for the1937; reduction being created after the reduction.1938define i32 @predicated_not_dominates_reduction(ptr nocapture noundef readonly %h, i32 noundef %i) {1939; CHECK-LABEL: define i32 @predicated_not_dominates_reduction(1940; CHECK-SAME: ptr noundef readonly captures(none) [[H:%.*]], i32 noundef [[I:%.*]]) {1941; CHECK-NEXT: [[ENTRY:.*]]:1942; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[I]], 41943; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1944; CHECK: [[VECTOR_PH]]:1945; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[I]], 41946; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[I]], [[N_MOD_VF]]1947; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]1948; CHECK: [[VECTOR_BODY]]:1949; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1950; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP7:%.*]], %[[VECTOR_BODY]] ]1951; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[H]], i32 [[INDEX]]1952; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 11953; CHECK-NEXT: [[TMP9:%.*]] = icmp ne <4 x i8> [[WIDE_LOAD]], zeroinitializer1954; CHECK-NEXT: [[TMP2:%.*]] = udiv <4 x i8> [[WIDE_LOAD]], splat (i8 31)1955; CHECK-NEXT: [[TMP3:%.*]] = shl nuw nsw <4 x i8> [[TMP2]], splat (i8 3)1956; CHECK-NEXT: [[TMP4:%.*]] = udiv <4 x i8> [[TMP3]], splat (i8 31)1957; CHECK-NEXT: [[TMP14:%.*]] = zext <4 x i8> [[TMP4]] to <4 x i32>1958; CHECK-NEXT: [[TMP5:%.*]] = select <4 x i1> [[TMP9]], <4 x i32> [[TMP14]], <4 x i32> zeroinitializer1959; CHECK-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP5]])1960; CHECK-NEXT: [[TMP7]] = add i32 [[VEC_PHI]], [[TMP6]]1961; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 41962; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]1963; CHECK-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP23:![0-9]+]]1964; CHECK: [[MIDDLE_BLOCK]]:1965; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[I]], [[N_VEC]]1966; CHECK-NEXT: br i1 [[CMP_N]], label %[[FOR_END7:.*]], label %[[SCALAR_PH]]1967; CHECK: [[SCALAR_PH]]:1968; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]1969; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = phi i32 [ [[TMP7]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]1970; CHECK-NEXT: br label %[[FOR_BODY2:.*]]1971; CHECK: [[FOR_BODY2]]:1972; CHECK-NEXT: [[A_117:%.*]] = phi i32 [ [[INC6:%.*]], %[[FOR_INC5:.*]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]1973; CHECK-NEXT: [[G_016:%.*]] = phi i32 [ [[G_1:%.*]], %[[FOR_INC5]] ], [ [[BC_MERGE_RDX]], %[[SCALAR_PH]] ]1974; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[H]], i32 [[A_117]]1975; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[ARRAYIDX]], align 11976; CHECK-NEXT: [[TOBOOL3_NOT:%.*]] = icmp eq i8 [[TMP10]], 01977; CHECK-NEXT: br i1 [[TOBOOL3_NOT]], label %[[FOR_INC5]], label %[[IF_THEN:.*]]1978; CHECK: [[IF_THEN]]:1979; CHECK-NEXT: [[TMP11:%.*]] = udiv i8 [[TMP10]], 311980; CHECK-NEXT: [[TMP12:%.*]] = shl nuw nsw i8 [[TMP11]], 31981; CHECK-NEXT: [[TMP13:%.*]] = udiv i8 [[TMP12]], 311982; CHECK-NEXT: [[DIV4:%.*]] = zext i8 [[TMP13]] to i321983; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[G_016]], [[DIV4]]1984; CHECK-NEXT: br label %[[FOR_INC5]]1985; CHECK: [[FOR_INC5]]:1986; CHECK-NEXT: [[G_1]] = phi i32 [ [[ADD]], %[[IF_THEN]] ], [ [[G_016]], %[[FOR_BODY2]] ]1987; CHECK-NEXT: [[INC6]] = add nuw nsw i32 [[A_117]], 11988; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC6]], [[I]]1989; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_END7]], label %[[FOR_BODY2]], !llvm.loop [[LOOP24:![0-9]+]]1990; CHECK: [[FOR_END7]]:1991; CHECK-NEXT: [[G_1_LCSSA:%.*]] = phi i32 [ [[G_1]], %[[FOR_INC5]] ], [ [[TMP7]], %[[MIDDLE_BLOCK]] ]1992; CHECK-NEXT: ret i32 [[G_1_LCSSA]]1993;1994; CHECK-INTERLEAVED-LABEL: define i32 @predicated_not_dominates_reduction(1995; CHECK-INTERLEAVED-SAME: ptr noundef readonly captures(none) [[H:%.*]], i32 noundef [[I:%.*]]) {1996; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*]]:1997; CHECK-INTERLEAVED-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[I]], 81998; CHECK-INTERLEAVED-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1999; CHECK-INTERLEAVED: [[VECTOR_PH]]:2000; CHECK-INTERLEAVED-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[I]], 82001; CHECK-INTERLEAVED-NEXT: [[N_VEC:%.*]] = sub i32 [[I]], [[N_MOD_VF]]2002; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]2003; CHECK-INTERLEAVED: [[VECTOR_BODY]]:2004; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]2005; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP11:%.*]], %[[VECTOR_BODY]] ]2006; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP14:%.*]], %[[VECTOR_BODY]] ]2007; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[H]], i32 [[INDEX]]2008; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP1]], i64 42009; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 12010; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i8>, ptr [[TMP2]], align 12011; CHECK-INTERLEAVED-NEXT: [[TMP16:%.*]] = icmp ne <4 x i8> [[WIDE_LOAD]], zeroinitializer2012; CHECK-INTERLEAVED-NEXT: [[TMP21:%.*]] = icmp ne <4 x i8> [[WIDE_LOAD2]], zeroinitializer2013; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = udiv <4 x i8> [[WIDE_LOAD]], splat (i8 31)2014; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = udiv <4 x i8> [[WIDE_LOAD2]], splat (i8 31)2015; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = shl nuw nsw <4 x i8> [[TMP3]], splat (i8 3)2016; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = shl nuw nsw <4 x i8> [[TMP4]], splat (i8 3)2017; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = udiv <4 x i8> [[TMP5]], splat (i8 31)2018; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = udiv <4 x i8> [[TMP6]], splat (i8 31)2019; CHECK-INTERLEAVED-NEXT: [[TMP22:%.*]] = zext <4 x i8> [[TMP7]] to <4 x i32>2020; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = select <4 x i1> [[TMP16]], <4 x i32> [[TMP22]], <4 x i32> zeroinitializer2021; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP9]])2022; CHECK-INTERLEAVED-NEXT: [[TMP11]] = add i32 [[VEC_PHI]], [[TMP10]]2023; CHECK-INTERLEAVED-NEXT: [[TMP23:%.*]] = zext <4 x i8> [[TMP8]] to <4 x i32>2024; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = select <4 x i1> [[TMP21]], <4 x i32> [[TMP23]], <4 x i32> zeroinitializer2025; CHECK-INTERLEAVED-NEXT: [[TMP13:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP12]])2026; CHECK-INTERLEAVED-NEXT: [[TMP14]] = add i32 [[VEC_PHI1]], [[TMP13]]2027; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 82028; CHECK-INTERLEAVED-NEXT: [[TMP15:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]2029; CHECK-INTERLEAVED-NEXT: br i1 [[TMP15]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP23:![0-9]+]]2030; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:2031; CHECK-INTERLEAVED-NEXT: [[BIN_RDX:%.*]] = add i32 [[TMP14]], [[TMP11]]2032; CHECK-INTERLEAVED-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[I]], [[N_VEC]]2033; CHECK-INTERLEAVED-NEXT: br i1 [[CMP_N]], label %[[FOR_END7:.*]], label %[[SCALAR_PH]]2034; CHECK-INTERLEAVED: [[SCALAR_PH]]:2035; CHECK-INTERLEAVED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]2036; CHECK-INTERLEAVED-NEXT: [[BC_MERGE_RDX:%.*]] = phi i32 [ [[BIN_RDX]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]2037; CHECK-INTERLEAVED-NEXT: br label %[[FOR_BODY2:.*]]2038; CHECK-INTERLEAVED: [[FOR_BODY2]]:2039; CHECK-INTERLEAVED-NEXT: [[A_117:%.*]] = phi i32 [ [[INC6:%.*]], %[[FOR_INC5:.*]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]2040; CHECK-INTERLEAVED-NEXT: [[G_016:%.*]] = phi i32 [ [[G_1:%.*]], %[[FOR_INC5]] ], [ [[BC_MERGE_RDX]], %[[SCALAR_PH]] ]2041; CHECK-INTERLEAVED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[H]], i32 [[A_117]]2042; CHECK-INTERLEAVED-NEXT: [[TMP17:%.*]] = load i8, ptr [[ARRAYIDX]], align 12043; CHECK-INTERLEAVED-NEXT: [[TOBOOL3_NOT:%.*]] = icmp eq i8 [[TMP17]], 02044; CHECK-INTERLEAVED-NEXT: br i1 [[TOBOOL3_NOT]], label %[[FOR_INC5]], label %[[IF_THEN:.*]]2045; CHECK-INTERLEAVED: [[IF_THEN]]:2046; CHECK-INTERLEAVED-NEXT: [[TMP18:%.*]] = udiv i8 [[TMP17]], 312047; CHECK-INTERLEAVED-NEXT: [[TMP19:%.*]] = shl nuw nsw i8 [[TMP18]], 32048; CHECK-INTERLEAVED-NEXT: [[TMP20:%.*]] = udiv i8 [[TMP19]], 312049; CHECK-INTERLEAVED-NEXT: [[DIV4:%.*]] = zext i8 [[TMP20]] to i322050; CHECK-INTERLEAVED-NEXT: [[ADD:%.*]] = add nsw i32 [[G_016]], [[DIV4]]2051; CHECK-INTERLEAVED-NEXT: br label %[[FOR_INC5]]2052; CHECK-INTERLEAVED: [[FOR_INC5]]:2053; CHECK-INTERLEAVED-NEXT: [[G_1]] = phi i32 [ [[ADD]], %[[IF_THEN]] ], [ [[G_016]], %[[FOR_BODY2]] ]2054; CHECK-INTERLEAVED-NEXT: [[INC6]] = add nuw nsw i32 [[A_117]], 12055; CHECK-INTERLEAVED-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC6]], [[I]]2056; CHECK-INTERLEAVED-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_END7]], label %[[FOR_BODY2]], !llvm.loop [[LOOP24:![0-9]+]]2057; CHECK-INTERLEAVED: [[FOR_END7]]:2058; CHECK-INTERLEAVED-NEXT: [[G_1_LCSSA:%.*]] = phi i32 [ [[G_1]], %[[FOR_INC5]] ], [ [[BIN_RDX]], %[[MIDDLE_BLOCK]] ]2059; CHECK-INTERLEAVED-NEXT: ret i32 [[G_1_LCSSA]]2060;2061entry:2062 br label %for.body22063 2064for.body2: ; preds = %entry, %for.inc52065 %a.117 = phi i32 [ %inc6, %for.inc5 ], [ 0, %entry ]2066 %g.016 = phi i32 [ %g.1, %for.inc5 ], [ 0, %entry ]2067 %arrayidx = getelementptr inbounds i8, ptr %h, i32 %a.1172068 %0 = load i8, ptr %arrayidx, align 12069 %tobool3.not = icmp eq i8 %0, 02070 br i1 %tobool3.not, label %for.inc5, label %if.then2071 2072if.then: ; preds = %for.body22073 %1 = udiv i8 %0, 312074 %2 = shl nuw nsw i8 %1, 32075 %3 = udiv i8 %2, 312076 %div4 = zext i8 %3 to i322077 %add = add nsw i32 %g.016, %div42078 br label %for.inc52079 2080for.inc5: ; preds = %for.body2, %if.then2081 %g.1 = phi i32 [ %add, %if.then ], [ %g.016, %for.body2 ]2082 %inc6 = add nuw nsw i32 %a.117, 12083 %exitcond.not = icmp eq i32 %inc6, %i2084 br i1 %exitcond.not, label %for.end7, label %for.body22085 2086for.end7: ; preds = %for.inc52087 %g.1.lcssa = phi i32 [ %g.1, %for.inc5 ]2088 ret i32 %g.1.lcssa2089}2090 2091define i32 @predicated_not_dominates_reduction_twoadd(ptr nocapture noundef readonly %h, i32 noundef %i) {2092; CHECK-LABEL: define i32 @predicated_not_dominates_reduction_twoadd(2093; CHECK-SAME: ptr noundef readonly captures(none) [[H:%.*]], i32 noundef [[I:%.*]]) {2094; CHECK-NEXT: [[ENTRY:.*]]:2095; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[I]], 42096; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]2097; CHECK: [[VECTOR_PH]]:2098; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[I]], 42099; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[I]], [[N_MOD_VF]]2100; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]2101; CHECK: [[VECTOR_BODY]]:2102; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]2103; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP11:%.*]], %[[VECTOR_BODY]] ]2104; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[H]], i32 [[INDEX]]2105; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 12106; CHECK-NEXT: [[TMP6:%.*]] = icmp ne <4 x i8> [[WIDE_LOAD]], zeroinitializer2107; CHECK-NEXT: [[TMP2:%.*]] = udiv <4 x i8> [[WIDE_LOAD]], splat (i8 31)2108; CHECK-NEXT: [[TMP3:%.*]] = shl nuw nsw <4 x i8> [[TMP2]], splat (i8 3)2109; CHECK-NEXT: [[TMP4:%.*]] = udiv <4 x i8> [[TMP3]], splat (i8 31)2110; CHECK-NEXT: [[TMP13:%.*]] = zext <4 x i8> [[TMP4]] to <4 x i32>2111; CHECK-NEXT: [[TMP5:%.*]] = select <4 x i1> [[TMP6]], <4 x i32> [[TMP13]], <4 x i32> zeroinitializer2112; CHECK-NEXT: [[TMP7:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP5]])2113; CHECK-NEXT: [[TMP8:%.*]] = add i32 [[VEC_PHI]], [[TMP7]]2114; CHECK-NEXT: [[TMP9:%.*]] = select <4 x i1> [[TMP6]], <4 x i32> [[TMP13]], <4 x i32> zeroinitializer2115; CHECK-NEXT: [[TMP10:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP9]])2116; CHECK-NEXT: [[TMP11]] = add i32 [[TMP8]], [[TMP10]]2117; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 42118; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]2119; CHECK-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP25:![0-9]+]]2120; CHECK: [[MIDDLE_BLOCK]]:2121; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[I]], [[N_VEC]]2122; CHECK-NEXT: br i1 [[CMP_N]], label %[[FOR_END7:.*]], label %[[SCALAR_PH]]2123; CHECK: [[SCALAR_PH]]:2124; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]2125; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = phi i32 [ [[TMP11]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]2126; CHECK-NEXT: br label %[[FOR_BODY2:.*]]2127; CHECK: [[FOR_BODY2]]:2128; CHECK-NEXT: [[A_117:%.*]] = phi i32 [ [[INC6:%.*]], %[[FOR_INC5:.*]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]2129; CHECK-NEXT: [[G_016:%.*]] = phi i32 [ [[G_1:%.*]], %[[FOR_INC5]] ], [ [[BC_MERGE_RDX]], %[[SCALAR_PH]] ]2130; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[H]], i32 [[A_117]]2131; CHECK-NEXT: [[TMP14:%.*]] = load i8, ptr [[ARRAYIDX]], align 12132; CHECK-NEXT: [[TOBOOL3_NOT:%.*]] = icmp eq i8 [[TMP14]], 02133; CHECK-NEXT: br i1 [[TOBOOL3_NOT]], label %[[FOR_INC5]], label %[[IF_THEN:.*]]2134; CHECK: [[IF_THEN]]:2135; CHECK-NEXT: [[TMP15:%.*]] = udiv i8 [[TMP14]], 312136; CHECK-NEXT: [[TMP16:%.*]] = shl nuw nsw i8 [[TMP15]], 32137; CHECK-NEXT: [[TMP17:%.*]] = udiv i8 [[TMP16]], 312138; CHECK-NEXT: [[DIV4:%.*]] = zext i8 [[TMP17]] to i322139; CHECK-NEXT: [[ADD1:%.*]] = add nsw i32 [[G_016]], [[DIV4]]2140; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[ADD1]], [[DIV4]]2141; CHECK-NEXT: br label %[[FOR_INC5]]2142; CHECK: [[FOR_INC5]]:2143; CHECK-NEXT: [[G_1]] = phi i32 [ [[ADD]], %[[IF_THEN]] ], [ [[G_016]], %[[FOR_BODY2]] ]2144; CHECK-NEXT: [[INC6]] = add nuw nsw i32 [[A_117]], 12145; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC6]], [[I]]2146; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_END7]], label %[[FOR_BODY2]], !llvm.loop [[LOOP26:![0-9]+]]2147; CHECK: [[FOR_END7]]:2148; CHECK-NEXT: [[G_1_LCSSA:%.*]] = phi i32 [ [[G_1]], %[[FOR_INC5]] ], [ [[TMP11]], %[[MIDDLE_BLOCK]] ]2149; CHECK-NEXT: ret i32 [[G_1_LCSSA]]2150;2151; CHECK-INTERLEAVED-LABEL: define i32 @predicated_not_dominates_reduction_twoadd(2152; CHECK-INTERLEAVED-SAME: ptr noundef readonly captures(none) [[H:%.*]], i32 noundef [[I:%.*]]) {2153; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*]]:2154; CHECK-INTERLEAVED-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[I]], 82155; CHECK-INTERLEAVED-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]2156; CHECK-INTERLEAVED: [[VECTOR_PH]]:2157; CHECK-INTERLEAVED-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[I]], 82158; CHECK-INTERLEAVED-NEXT: [[N_VEC:%.*]] = sub i32 [[I]], [[N_MOD_VF]]2159; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]2160; CHECK-INTERLEAVED: [[VECTOR_BODY]]:2161; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]2162; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP17:%.*]], %[[VECTOR_BODY]] ]2163; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP20:%.*]], %[[VECTOR_BODY]] ]2164; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[H]], i32 [[INDEX]]2165; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP1]], i64 42166; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 12167; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i8>, ptr [[TMP2]], align 12168; CHECK-INTERLEAVED-NEXT: [[TMP27:%.*]] = icmp ne <4 x i8> [[WIDE_LOAD]], zeroinitializer2169; CHECK-INTERLEAVED-NEXT: [[TMP28:%.*]] = icmp ne <4 x i8> [[WIDE_LOAD2]], zeroinitializer2170; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = udiv <4 x i8> [[WIDE_LOAD]], splat (i8 31)2171; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = udiv <4 x i8> [[WIDE_LOAD2]], splat (i8 31)2172; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = shl nuw nsw <4 x i8> [[TMP3]], splat (i8 3)2173; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = shl nuw nsw <4 x i8> [[TMP4]], splat (i8 3)2174; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = udiv <4 x i8> [[TMP5]], splat (i8 31)2175; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = udiv <4 x i8> [[TMP6]], splat (i8 31)2176; CHECK-INTERLEAVED-NEXT: [[TMP29:%.*]] = zext <4 x i8> [[TMP7]] to <4 x i32>2177; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = select <4 x i1> [[TMP27]], <4 x i32> [[TMP29]], <4 x i32> zeroinitializer2178; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP9]])2179; CHECK-INTERLEAVED-NEXT: [[TMP11:%.*]] = add i32 [[VEC_PHI]], [[TMP10]]2180; CHECK-INTERLEAVED-NEXT: [[TMP30:%.*]] = zext <4 x i8> [[TMP8]] to <4 x i32>2181; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = select <4 x i1> [[TMP28]], <4 x i32> [[TMP30]], <4 x i32> zeroinitializer2182; CHECK-INTERLEAVED-NEXT: [[TMP13:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP12]])2183; CHECK-INTERLEAVED-NEXT: [[TMP14:%.*]] = add i32 [[VEC_PHI1]], [[TMP13]]2184; CHECK-INTERLEAVED-NEXT: [[TMP15:%.*]] = select <4 x i1> [[TMP27]], <4 x i32> [[TMP29]], <4 x i32> zeroinitializer2185; CHECK-INTERLEAVED-NEXT: [[TMP16:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP15]])2186; CHECK-INTERLEAVED-NEXT: [[TMP17]] = add i32 [[TMP11]], [[TMP16]]2187; CHECK-INTERLEAVED-NEXT: [[TMP18:%.*]] = select <4 x i1> [[TMP28]], <4 x i32> [[TMP30]], <4 x i32> zeroinitializer2188; CHECK-INTERLEAVED-NEXT: [[TMP19:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP18]])2189; CHECK-INTERLEAVED-NEXT: [[TMP20]] = add i32 [[TMP14]], [[TMP19]]2190; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 82191; CHECK-INTERLEAVED-NEXT: [[TMP21:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]2192; CHECK-INTERLEAVED-NEXT: br i1 [[TMP21]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP25:![0-9]+]]2193; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:2194; CHECK-INTERLEAVED-NEXT: [[BIN_RDX:%.*]] = add i32 [[TMP20]], [[TMP17]]2195; CHECK-INTERLEAVED-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[I]], [[N_VEC]]2196; CHECK-INTERLEAVED-NEXT: br i1 [[CMP_N]], label %[[FOR_END7:.*]], label %[[SCALAR_PH]]2197; CHECK-INTERLEAVED: [[SCALAR_PH]]:2198; CHECK-INTERLEAVED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]2199; CHECK-INTERLEAVED-NEXT: [[BC_MERGE_RDX:%.*]] = phi i32 [ [[BIN_RDX]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]2200; CHECK-INTERLEAVED-NEXT: br label %[[FOR_BODY2:.*]]2201; CHECK-INTERLEAVED: [[FOR_BODY2]]:2202; CHECK-INTERLEAVED-NEXT: [[A_117:%.*]] = phi i32 [ [[INC6:%.*]], %[[FOR_INC5:.*]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]2203; CHECK-INTERLEAVED-NEXT: [[G_016:%.*]] = phi i32 [ [[G_1:%.*]], %[[FOR_INC5]] ], [ [[BC_MERGE_RDX]], %[[SCALAR_PH]] ]2204; CHECK-INTERLEAVED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[H]], i32 [[A_117]]2205; CHECK-INTERLEAVED-NEXT: [[TMP23:%.*]] = load i8, ptr [[ARRAYIDX]], align 12206; CHECK-INTERLEAVED-NEXT: [[TOBOOL3_NOT:%.*]] = icmp eq i8 [[TMP23]], 02207; CHECK-INTERLEAVED-NEXT: br i1 [[TOBOOL3_NOT]], label %[[FOR_INC5]], label %[[IF_THEN:.*]]2208; CHECK-INTERLEAVED: [[IF_THEN]]:2209; CHECK-INTERLEAVED-NEXT: [[TMP24:%.*]] = udiv i8 [[TMP23]], 312210; CHECK-INTERLEAVED-NEXT: [[TMP25:%.*]] = shl nuw nsw i8 [[TMP24]], 32211; CHECK-INTERLEAVED-NEXT: [[TMP26:%.*]] = udiv i8 [[TMP25]], 312212; CHECK-INTERLEAVED-NEXT: [[DIV4:%.*]] = zext i8 [[TMP26]] to i322213; CHECK-INTERLEAVED-NEXT: [[ADD1:%.*]] = add nsw i32 [[G_016]], [[DIV4]]2214; CHECK-INTERLEAVED-NEXT: [[ADD:%.*]] = add nsw i32 [[ADD1]], [[DIV4]]2215; CHECK-INTERLEAVED-NEXT: br label %[[FOR_INC5]]2216; CHECK-INTERLEAVED: [[FOR_INC5]]:2217; CHECK-INTERLEAVED-NEXT: [[G_1]] = phi i32 [ [[ADD]], %[[IF_THEN]] ], [ [[G_016]], %[[FOR_BODY2]] ]2218; CHECK-INTERLEAVED-NEXT: [[INC6]] = add nuw nsw i32 [[A_117]], 12219; CHECK-INTERLEAVED-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC6]], [[I]]2220; CHECK-INTERLEAVED-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_END7]], label %[[FOR_BODY2]], !llvm.loop [[LOOP26:![0-9]+]]2221; CHECK-INTERLEAVED: [[FOR_END7]]:2222; CHECK-INTERLEAVED-NEXT: [[G_1_LCSSA:%.*]] = phi i32 [ [[G_1]], %[[FOR_INC5]] ], [ [[BIN_RDX]], %[[MIDDLE_BLOCK]] ]2223; CHECK-INTERLEAVED-NEXT: ret i32 [[G_1_LCSSA]]2224;2225entry:2226 br label %for.body22227 2228for.body2: ; preds = %entry, %for.inc52229 %a.117 = phi i32 [ %inc6, %for.inc5 ], [ 0, %entry ]2230 %g.016 = phi i32 [ %g.1, %for.inc5 ], [ 0, %entry ]2231 %arrayidx = getelementptr inbounds i8, ptr %h, i32 %a.1172232 %0 = load i8, ptr %arrayidx, align 12233 %tobool3.not = icmp eq i8 %0, 02234 br i1 %tobool3.not, label %for.inc5, label %if.then2235 2236if.then: ; preds = %for.body22237 %1 = udiv i8 %0, 312238 %2 = shl nuw nsw i8 %1, 32239 %3 = udiv i8 %2, 312240 %div4 = zext i8 %3 to i322241 %add1 = add nsw i32 %g.016, %div42242 %add = add nsw i32 %add1, %div42243 br label %for.inc52244 2245for.inc5: ; preds = %for.body2, %if.then2246 %g.1 = phi i32 [ %add, %if.then ], [ %g.016, %for.body2 ]2247 %inc6 = add nuw nsw i32 %a.117, 12248 %exitcond.not = icmp eq i32 %inc6, %i2249 br i1 %exitcond.not, label %for.end7, label %for.body22250 2251for.end7: ; preds = %for.inc52252 %g.1.lcssa = phi i32 [ %g.1, %for.inc5 ]2253 ret i32 %g.1.lcssa2254}2255 2256%struct.e = type { i32, i32 }2257define i32 @predicated_or_dominates_reduction(ptr %b) {2258; CHECK-LABEL: define i32 @predicated_or_dominates_reduction(2259; CHECK-SAME: ptr [[B:%.*]]) {2260; CHECK-NEXT: [[ENTRY:.*:]]2261; CHECK-NEXT: br label %[[VECTOR_PH:.*]]2262; CHECK: [[VECTOR_PH]]:2263; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]2264; CHECK: [[VECTOR_BODY]]:2265; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE6:.*]] ]2266; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP48:%.*]], %[[PRED_LOAD_CONTINUE6]] ]2267; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[INDEX]], 02268; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[INDEX]], 12269; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[INDEX]], 22270; CHECK-NEXT: [[TMP3:%.*]] = add i32 [[INDEX]], 32271; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds [0 x [[STRUCT_E:%.*]]], ptr [[B]], i32 0, i32 [[TMP0]], i32 12272; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP1]], i32 12273; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP2]], i32 12274; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP3]], i32 12275; CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP4]], align 42276; CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP6]], align 42277; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP8]], align 42278; CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[TMP10]], align 42279; CHECK-NEXT: [[TMP15:%.*]] = insertelement <4 x i32> poison, i32 [[TMP11]], i32 02280; CHECK-NEXT: [[TMP16:%.*]] = insertelement <4 x i32> [[TMP15]], i32 [[TMP12]], i32 12281; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP16]], i32 [[TMP13]], i32 22282; CHECK-NEXT: [[TMP18:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP14]], i32 32283; CHECK-NEXT: [[TMP19:%.*]] = icmp eq <4 x i32> [[TMP18]], zeroinitializer2284; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP19]], i32 02285; CHECK-NEXT: br i1 [[TMP20]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]2286; CHECK: [[PRED_LOAD_IF]]:2287; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP0]]2288; CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 42289; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> poison, i32 [[TMP23]], i32 02290; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]2291; CHECK: [[PRED_LOAD_CONTINUE]]:2292; CHECK-NEXT: [[TMP25:%.*]] = phi <4 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP24]], %[[PRED_LOAD_IF]] ]2293; CHECK-NEXT: [[TMP26:%.*]] = extractelement <4 x i1> [[TMP19]], i32 12294; CHECK-NEXT: br i1 [[TMP26]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2:.*]]2295; CHECK: [[PRED_LOAD_IF1]]:2296; CHECK-NEXT: [[TMP28:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP1]]2297; CHECK-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 42298; CHECK-NEXT: [[TMP30:%.*]] = insertelement <4 x i32> [[TMP25]], i32 [[TMP29]], i32 12299; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]2300; CHECK: [[PRED_LOAD_CONTINUE2]]:2301; CHECK-NEXT: [[TMP31:%.*]] = phi <4 x i32> [ [[TMP25]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP30]], %[[PRED_LOAD_IF1]] ]2302; CHECK-NEXT: [[TMP32:%.*]] = extractelement <4 x i1> [[TMP19]], i32 22303; CHECK-NEXT: br i1 [[TMP32]], label %[[PRED_LOAD_IF3:.*]], label %[[PRED_LOAD_CONTINUE4:.*]]2304; CHECK: [[PRED_LOAD_IF3]]:2305; CHECK-NEXT: [[TMP34:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP2]]2306; CHECK-NEXT: [[TMP35:%.*]] = load i32, ptr [[TMP34]], align 42307; CHECK-NEXT: [[TMP36:%.*]] = insertelement <4 x i32> [[TMP31]], i32 [[TMP35]], i32 22308; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE4]]2309; CHECK: [[PRED_LOAD_CONTINUE4]]:2310; CHECK-NEXT: [[TMP37:%.*]] = phi <4 x i32> [ [[TMP31]], %[[PRED_LOAD_CONTINUE2]] ], [ [[TMP36]], %[[PRED_LOAD_IF3]] ]2311; CHECK-NEXT: [[TMP38:%.*]] = extractelement <4 x i1> [[TMP19]], i32 32312; CHECK-NEXT: br i1 [[TMP38]], label %[[PRED_LOAD_IF5:.*]], label %[[PRED_LOAD_CONTINUE6]]2313; CHECK: [[PRED_LOAD_IF5]]:2314; CHECK-NEXT: [[TMP40:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP3]]2315; CHECK-NEXT: [[TMP41:%.*]] = load i32, ptr [[TMP40]], align 42316; CHECK-NEXT: [[TMP42:%.*]] = insertelement <4 x i32> [[TMP37]], i32 [[TMP41]], i32 32317; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE6]]2318; CHECK: [[PRED_LOAD_CONTINUE6]]:2319; CHECK-NEXT: [[TMP43:%.*]] = phi <4 x i32> [ [[TMP37]], %[[PRED_LOAD_CONTINUE4]] ], [ [[TMP42]], %[[PRED_LOAD_IF5]] ]2320; CHECK-NEXT: [[TMP44:%.*]] = icmp ne <4 x i32> [[TMP43]], zeroinitializer2321; CHECK-NEXT: [[TMP39:%.*]] = select <4 x i1> [[TMP19]], <4 x i1> [[TMP44]], <4 x i1> zeroinitializer2322; CHECK-NEXT: [[NOT_:%.*]] = xor <4 x i1> [[TMP19]], splat (i1 true)2323; CHECK-NEXT: [[TMP50:%.*]] = or <4 x i1> [[TMP39]], [[NOT_]]2324; CHECK-NEXT: [[TMP51:%.*]] = select <4 x i1> [[TMP50]], <4 x i32> splat (i32 1), <4 x i32> zeroinitializer2325; CHECK-NEXT: [[TMP47:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP51]])2326; CHECK-NEXT: [[TMP48]] = add i32 [[VEC_PHI]], [[TMP47]]2327; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 42328; CHECK-NEXT: [[TMP49:%.*]] = icmp eq i32 [[INDEX_NEXT]], 10002329; CHECK-NEXT: br i1 [[TMP49]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP27:![0-9]+]]2330; CHECK: [[MIDDLE_BLOCK]]:2331; CHECK-NEXT: br label %[[FOR_COND_CLEANUP:.*]]2332; CHECK: [[FOR_COND_CLEANUP]]:2333; CHECK-NEXT: ret i32 [[TMP48]]2334;2335; CHECK-INTERLEAVED-LABEL: define i32 @predicated_or_dominates_reduction(2336; CHECK-INTERLEAVED-SAME: ptr [[B:%.*]]) {2337; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]2338; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]2339; CHECK-INTERLEAVED: [[VECTOR_PH]]:2340; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]2341; CHECK-INTERLEAVED: [[VECTOR_BODY]]:2342; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE15:.*]] ]2343; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP94:%.*]], %[[PRED_LOAD_CONTINUE15]] ]2344; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP98:%.*]], %[[PRED_LOAD_CONTINUE15]] ]2345; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = add i32 [[INDEX]], 02346; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = add i32 [[INDEX]], 12347; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = add i32 [[INDEX]], 22348; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = add i32 [[INDEX]], 32349; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = add i32 [[INDEX]], 42350; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = add i32 [[INDEX]], 52351; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = add i32 [[INDEX]], 62352; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = add i32 [[INDEX]], 72353; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = getelementptr inbounds [0 x [[STRUCT_E:%.*]]], ptr [[B]], i32 0, i32 [[TMP0]], i32 12354; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP1]], i32 12355; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP2]], i32 12356; CHECK-INTERLEAVED-NEXT: [[TMP14:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP3]], i32 12357; CHECK-INTERLEAVED-NEXT: [[TMP16:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP4]], i32 12358; CHECK-INTERLEAVED-NEXT: [[TMP18:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP5]], i32 12359; CHECK-INTERLEAVED-NEXT: [[TMP20:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP6]], i32 12360; CHECK-INTERLEAVED-NEXT: [[TMP22:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP7]], i32 12361; CHECK-INTERLEAVED-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP8]], align 42362; CHECK-INTERLEAVED-NEXT: [[TMP24:%.*]] = load i32, ptr [[TMP10]], align 42363; CHECK-INTERLEAVED-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP12]], align 42364; CHECK-INTERLEAVED-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP14]], align 42365; CHECK-INTERLEAVED-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> poison, i32 [[TMP23]], i32 02366; CHECK-INTERLEAVED-NEXT: [[TMP21:%.*]] = insertelement <4 x i32> [[TMP27]], i32 [[TMP24]], i32 12367; CHECK-INTERLEAVED-NEXT: [[TMP35:%.*]] = insertelement <4 x i32> [[TMP21]], i32 [[TMP25]], i32 22368; CHECK-INTERLEAVED-NEXT: [[TMP30:%.*]] = insertelement <4 x i32> [[TMP35]], i32 [[TMP26]], i32 32369; CHECK-INTERLEAVED-NEXT: [[TMP31:%.*]] = load i32, ptr [[TMP16]], align 42370; CHECK-INTERLEAVED-NEXT: [[TMP32:%.*]] = load i32, ptr [[TMP18]], align 42371; CHECK-INTERLEAVED-NEXT: [[TMP33:%.*]] = load i32, ptr [[TMP20]], align 42372; CHECK-INTERLEAVED-NEXT: [[TMP34:%.*]] = load i32, ptr [[TMP22]], align 42373; CHECK-INTERLEAVED-NEXT: [[TMP28:%.*]] = insertelement <4 x i32> poison, i32 [[TMP31]], i32 02374; CHECK-INTERLEAVED-NEXT: [[TMP29:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP32]], i32 12375; CHECK-INTERLEAVED-NEXT: [[TMP36:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP33]], i32 22376; CHECK-INTERLEAVED-NEXT: [[TMP38:%.*]] = insertelement <4 x i32> [[TMP36]], i32 [[TMP34]], i32 32377; CHECK-INTERLEAVED-NEXT: [[TMP39:%.*]] = icmp eq <4 x i32> [[TMP30]], zeroinitializer2378; CHECK-INTERLEAVED-NEXT: [[TMP40:%.*]] = icmp eq <4 x i32> [[TMP38]], zeroinitializer2379; CHECK-INTERLEAVED-NEXT: [[TMP41:%.*]] = extractelement <4 x i1> [[TMP39]], i32 02380; CHECK-INTERLEAVED-NEXT: br i1 [[TMP41]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]2381; CHECK-INTERLEAVED: [[PRED_LOAD_IF]]:2382; CHECK-INTERLEAVED-NEXT: [[TMP43:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP0]]2383; CHECK-INTERLEAVED-NEXT: [[TMP44:%.*]] = load i32, ptr [[TMP43]], align 42384; CHECK-INTERLEAVED-NEXT: [[TMP45:%.*]] = insertelement <4 x i32> poison, i32 [[TMP44]], i32 02385; CHECK-INTERLEAVED-NEXT: br label %[[PRED_LOAD_CONTINUE]]2386; CHECK-INTERLEAVED: [[PRED_LOAD_CONTINUE]]:2387; CHECK-INTERLEAVED-NEXT: [[TMP46:%.*]] = phi <4 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP45]], %[[PRED_LOAD_IF]] ]2388; CHECK-INTERLEAVED-NEXT: [[TMP47:%.*]] = extractelement <4 x i1> [[TMP39]], i32 12389; CHECK-INTERLEAVED-NEXT: br i1 [[TMP47]], label %[[PRED_LOAD_IF2:.*]], label %[[PRED_LOAD_CONTINUE3:.*]]2390; CHECK-INTERLEAVED: [[PRED_LOAD_IF2]]:2391; CHECK-INTERLEAVED-NEXT: [[TMP49:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP1]]2392; CHECK-INTERLEAVED-NEXT: [[TMP50:%.*]] = load i32, ptr [[TMP49]], align 42393; CHECK-INTERLEAVED-NEXT: [[TMP51:%.*]] = insertelement <4 x i32> [[TMP46]], i32 [[TMP50]], i32 12394; CHECK-INTERLEAVED-NEXT: br label %[[PRED_LOAD_CONTINUE3]]2395; CHECK-INTERLEAVED: [[PRED_LOAD_CONTINUE3]]:2396; CHECK-INTERLEAVED-NEXT: [[TMP52:%.*]] = phi <4 x i32> [ [[TMP46]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP51]], %[[PRED_LOAD_IF2]] ]2397; CHECK-INTERLEAVED-NEXT: [[TMP53:%.*]] = extractelement <4 x i1> [[TMP39]], i32 22398; CHECK-INTERLEAVED-NEXT: br i1 [[TMP53]], label %[[PRED_LOAD_IF4:.*]], label %[[PRED_LOAD_CONTINUE5:.*]]2399; CHECK-INTERLEAVED: [[PRED_LOAD_IF4]]:2400; CHECK-INTERLEAVED-NEXT: [[TMP55:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP2]]2401; CHECK-INTERLEAVED-NEXT: [[TMP56:%.*]] = load i32, ptr [[TMP55]], align 42402; CHECK-INTERLEAVED-NEXT: [[TMP57:%.*]] = insertelement <4 x i32> [[TMP52]], i32 [[TMP56]], i32 22403; CHECK-INTERLEAVED-NEXT: br label %[[PRED_LOAD_CONTINUE5]]2404; CHECK-INTERLEAVED: [[PRED_LOAD_CONTINUE5]]:2405; CHECK-INTERLEAVED-NEXT: [[TMP58:%.*]] = phi <4 x i32> [ [[TMP52]], %[[PRED_LOAD_CONTINUE3]] ], [ [[TMP57]], %[[PRED_LOAD_IF4]] ]2406; CHECK-INTERLEAVED-NEXT: [[TMP59:%.*]] = extractelement <4 x i1> [[TMP39]], i32 32407; CHECK-INTERLEAVED-NEXT: br i1 [[TMP59]], label %[[PRED_LOAD_IF6:.*]], label %[[PRED_LOAD_CONTINUE7:.*]]2408; CHECK-INTERLEAVED: [[PRED_LOAD_IF6]]:2409; CHECK-INTERLEAVED-NEXT: [[TMP61:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP3]]2410; CHECK-INTERLEAVED-NEXT: [[TMP62:%.*]] = load i32, ptr [[TMP61]], align 42411; CHECK-INTERLEAVED-NEXT: [[TMP63:%.*]] = insertelement <4 x i32> [[TMP58]], i32 [[TMP62]], i32 32412; CHECK-INTERLEAVED-NEXT: br label %[[PRED_LOAD_CONTINUE7]]2413; CHECK-INTERLEAVED: [[PRED_LOAD_CONTINUE7]]:2414; CHECK-INTERLEAVED-NEXT: [[TMP64:%.*]] = phi <4 x i32> [ [[TMP58]], %[[PRED_LOAD_CONTINUE5]] ], [ [[TMP63]], %[[PRED_LOAD_IF6]] ]2415; CHECK-INTERLEAVED-NEXT: [[TMP65:%.*]] = extractelement <4 x i1> [[TMP40]], i32 02416; CHECK-INTERLEAVED-NEXT: br i1 [[TMP65]], label %[[PRED_LOAD_IF8:.*]], label %[[PRED_LOAD_CONTINUE9:.*]]2417; CHECK-INTERLEAVED: [[PRED_LOAD_IF8]]:2418; CHECK-INTERLEAVED-NEXT: [[TMP67:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP4]]2419; CHECK-INTERLEAVED-NEXT: [[TMP68:%.*]] = load i32, ptr [[TMP67]], align 42420; CHECK-INTERLEAVED-NEXT: [[TMP69:%.*]] = insertelement <4 x i32> poison, i32 [[TMP68]], i32 02421; CHECK-INTERLEAVED-NEXT: br label %[[PRED_LOAD_CONTINUE9]]2422; CHECK-INTERLEAVED: [[PRED_LOAD_CONTINUE9]]:2423; CHECK-INTERLEAVED-NEXT: [[TMP70:%.*]] = phi <4 x i32> [ poison, %[[PRED_LOAD_CONTINUE7]] ], [ [[TMP69]], %[[PRED_LOAD_IF8]] ]2424; CHECK-INTERLEAVED-NEXT: [[TMP71:%.*]] = extractelement <4 x i1> [[TMP40]], i32 12425; CHECK-INTERLEAVED-NEXT: br i1 [[TMP71]], label %[[PRED_LOAD_IF10:.*]], label %[[PRED_LOAD_CONTINUE11:.*]]2426; CHECK-INTERLEAVED: [[PRED_LOAD_IF10]]:2427; CHECK-INTERLEAVED-NEXT: [[TMP73:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP5]]2428; CHECK-INTERLEAVED-NEXT: [[TMP74:%.*]] = load i32, ptr [[TMP73]], align 42429; CHECK-INTERLEAVED-NEXT: [[TMP75:%.*]] = insertelement <4 x i32> [[TMP70]], i32 [[TMP74]], i32 12430; CHECK-INTERLEAVED-NEXT: br label %[[PRED_LOAD_CONTINUE11]]2431; CHECK-INTERLEAVED: [[PRED_LOAD_CONTINUE11]]:2432; CHECK-INTERLEAVED-NEXT: [[TMP76:%.*]] = phi <4 x i32> [ [[TMP70]], %[[PRED_LOAD_CONTINUE9]] ], [ [[TMP75]], %[[PRED_LOAD_IF10]] ]2433; CHECK-INTERLEAVED-NEXT: [[TMP77:%.*]] = extractelement <4 x i1> [[TMP40]], i32 22434; CHECK-INTERLEAVED-NEXT: br i1 [[TMP77]], label %[[PRED_LOAD_IF12:.*]], label %[[PRED_LOAD_CONTINUE13:.*]]2435; CHECK-INTERLEAVED: [[PRED_LOAD_IF12]]:2436; CHECK-INTERLEAVED-NEXT: [[TMP79:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP6]]2437; CHECK-INTERLEAVED-NEXT: [[TMP80:%.*]] = load i32, ptr [[TMP79]], align 42438; CHECK-INTERLEAVED-NEXT: [[TMP81:%.*]] = insertelement <4 x i32> [[TMP76]], i32 [[TMP80]], i32 22439; CHECK-INTERLEAVED-NEXT: br label %[[PRED_LOAD_CONTINUE13]]2440; CHECK-INTERLEAVED: [[PRED_LOAD_CONTINUE13]]:2441; CHECK-INTERLEAVED-NEXT: [[TMP82:%.*]] = phi <4 x i32> [ [[TMP76]], %[[PRED_LOAD_CONTINUE11]] ], [ [[TMP81]], %[[PRED_LOAD_IF12]] ]2442; CHECK-INTERLEAVED-NEXT: [[TMP83:%.*]] = extractelement <4 x i1> [[TMP40]], i32 32443; CHECK-INTERLEAVED-NEXT: br i1 [[TMP83]], label %[[PRED_LOAD_IF14:.*]], label %[[PRED_LOAD_CONTINUE15]]2444; CHECK-INTERLEAVED: [[PRED_LOAD_IF14]]:2445; CHECK-INTERLEAVED-NEXT: [[TMP85:%.*]] = getelementptr inbounds [0 x [[STRUCT_E]]], ptr [[B]], i32 0, i32 [[TMP7]]2446; CHECK-INTERLEAVED-NEXT: [[TMP86:%.*]] = load i32, ptr [[TMP85]], align 42447; CHECK-INTERLEAVED-NEXT: [[TMP87:%.*]] = insertelement <4 x i32> [[TMP82]], i32 [[TMP86]], i32 32448; CHECK-INTERLEAVED-NEXT: br label %[[PRED_LOAD_CONTINUE15]]2449; CHECK-INTERLEAVED: [[PRED_LOAD_CONTINUE15]]:2450; CHECK-INTERLEAVED-NEXT: [[TMP88:%.*]] = phi <4 x i32> [ [[TMP82]], %[[PRED_LOAD_CONTINUE13]] ], [ [[TMP87]], %[[PRED_LOAD_IF14]] ]2451; CHECK-INTERLEAVED-NEXT: [[TMP89:%.*]] = icmp ne <4 x i32> [[TMP64]], zeroinitializer2452; CHECK-INTERLEAVED-NEXT: [[TMP90:%.*]] = icmp ne <4 x i32> [[TMP88]], zeroinitializer2453; CHECK-INTERLEAVED-NEXT: [[TMP78:%.*]] = select <4 x i1> [[TMP39]], <4 x i1> [[TMP89]], <4 x i1> zeroinitializer2454; CHECK-INTERLEAVED-NEXT: [[TMP84:%.*]] = select <4 x i1> [[TMP40]], <4 x i1> [[TMP90]], <4 x i1> zeroinitializer2455; CHECK-INTERLEAVED-NEXT: [[NOT_:%.*]] = xor <4 x i1> [[TMP39]], splat (i1 true)2456; CHECK-INTERLEAVED-NEXT: [[NOT_18:%.*]] = xor <4 x i1> [[TMP40]], splat (i1 true)2457; CHECK-INTERLEAVED-NEXT: [[TMP91:%.*]] = or <4 x i1> [[TMP78]], [[NOT_]]2458; CHECK-INTERLEAVED-NEXT: [[TMP92:%.*]] = or <4 x i1> [[TMP84]], [[NOT_18]]2459; CHECK-INTERLEAVED-NEXT: [[TMP95:%.*]] = select <4 x i1> [[TMP91]], <4 x i32> splat (i32 1), <4 x i32> zeroinitializer2460; CHECK-INTERLEAVED-NEXT: [[TMP93:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP95]])2461; CHECK-INTERLEAVED-NEXT: [[TMP94]] = add i32 [[VEC_PHI]], [[TMP93]]2462; CHECK-INTERLEAVED-NEXT: [[TMP96:%.*]] = select <4 x i1> [[TMP92]], <4 x i32> splat (i32 1), <4 x i32> zeroinitializer2463; CHECK-INTERLEAVED-NEXT: [[TMP97:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP96]])2464; CHECK-INTERLEAVED-NEXT: [[TMP98]] = add i32 [[VEC_PHI1]], [[TMP97]]2465; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 82466; CHECK-INTERLEAVED-NEXT: [[TMP99:%.*]] = icmp eq i32 [[INDEX_NEXT]], 10002467; CHECK-INTERLEAVED-NEXT: br i1 [[TMP99]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP27:![0-9]+]]2468; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:2469; CHECK-INTERLEAVED-NEXT: [[BIN_RDX:%.*]] = add i32 [[TMP98]], [[TMP94]]2470; CHECK-INTERLEAVED-NEXT: br label %[[FOR_COND_CLEANUP:.*]]2471; CHECK-INTERLEAVED: [[FOR_COND_CLEANUP]]:2472; CHECK-INTERLEAVED-NEXT: ret i32 [[BIN_RDX]]2473;2474entry:2475 br label %for.body2476 2477for.cond.cleanup: ; preds = %for.inc2478 %a.1.lcssa = phi i32 [ %a.1, %for.inc ]2479 ret i32 %a.1.lcssa2480 2481for.body: ; preds = %entry, %for.inc2482 %g.09 = phi i32 [ 0, %entry ], [ %inc3, %for.inc ]2483 %a.08 = phi i32 [ 0, %entry ], [ %a.1, %for.inc ]2484 %d = getelementptr inbounds [0 x %struct.e], ptr %b, i32 0, i32 %g.09, i32 12485 %0 = load i32, ptr %d, align 42486 %tobool.not = icmp eq i32 %0, 02487 br i1 %tobool.not, label %lor.lhs.false, label %if.then2488 2489lor.lhs.false: ; preds = %for.body2490 %arrayidx = getelementptr inbounds [0 x %struct.e], ptr %b, i32 0, i32 %g.092491 %1 = load i32, ptr %arrayidx, align 42492 %tobool2.not = icmp eq i32 %1, 02493 br i1 %tobool2.not, label %for.inc, label %if.then2494 2495if.then: ; preds = %lor.lhs.false, %for.body2496 %inc = add nsw i32 %a.08, 12497 br label %for.inc2498 2499for.inc: ; preds = %lor.lhs.false, %if.then2500 %a.1 = phi i32 [ %inc, %if.then ], [ %a.08, %lor.lhs.false ]2501 %inc3 = add nuw nsw i32 %g.09, 12502 %exitcond.not = icmp eq i32 %inc3, 10002503 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body2504}2505 2506; An in-loop add reduction followed by an in-loop sub reduction becomes an add reduction followed by an add reduction with its input negated2507define i32 @reduction_add_sub(ptr noalias nocapture %A, ptr noalias nocapture %B) {2508; CHECK-LABEL: define i32 @reduction_add_sub(2509; CHECK-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {2510; CHECK-NEXT: [[ENTRY:.*:]]2511; CHECK-NEXT: br label %[[VECTOR_PH:.*]]2512; CHECK: [[VECTOR_PH]]:2513; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]2514; CHECK: [[VECTOR_BODY]]:2515; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]2516; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP6:%.*]], %[[VECTOR_BODY]] ]2517; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]2518; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]2519; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 42520; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, ptr [[TMP1]], align 42521; CHECK-NEXT: [[TMP2:%.*]] = sub <4 x i32> zeroinitializer, [[WIDE_LOAD1]]2522; CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]])2523; CHECK-NEXT: [[TMP4:%.*]] = add i32 [[VEC_PHI]], [[TMP3]]2524; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP2]])2525; CHECK-NEXT: [[TMP6]] = add i32 [[TMP4]], [[TMP5]]2526; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 42527; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 2562528; CHECK-NEXT: br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]2529; CHECK: [[MIDDLE_BLOCK]]:2530; CHECK-NEXT: br label %[[FOR_END:.*]]2531; CHECK: [[FOR_END]]:2532; CHECK-NEXT: ret i32 [[TMP6]]2533;2534; CHECK-INTERLEAVED-LABEL: define i32 @reduction_add_sub(2535; CHECK-INTERLEAVED-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {2536; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]2537; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]2538; CHECK-INTERLEAVED: [[VECTOR_PH]]:2539; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]2540; CHECK-INTERLEAVED: [[VECTOR_BODY]]:2541; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]2542; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP11:%.*]], %[[VECTOR_BODY]] ]2543; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP13:%.*]], %[[VECTOR_BODY]] ]2544; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]2545; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]2546; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 42547; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 42548; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP2]], align 42549; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i64 42550; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr [[TMP1]], align 42551; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x i32>, ptr [[TMP3]], align 42552; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = sub <4 x i32> zeroinitializer, [[WIDE_LOAD3]]2553; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = sub <4 x i32> zeroinitializer, [[WIDE_LOAD4]]2554; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]])2555; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = add i32 [[VEC_PHI]], [[TMP6]]2556; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD2]])2557; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = add i32 [[VEC_PHI1]], [[TMP8]]2558; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP4]])2559; CHECK-INTERLEAVED-NEXT: [[TMP11]] = add i32 [[TMP7]], [[TMP10]]2560; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP5]])2561; CHECK-INTERLEAVED-NEXT: [[TMP13]] = add i32 [[TMP9]], [[TMP12]]2562; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 82563; CHECK-INTERLEAVED-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], 2562564; CHECK-INTERLEAVED-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]2565; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:2566; CHECK-INTERLEAVED-NEXT: [[BIN_RDX:%.*]] = add i32 [[TMP13]], [[TMP11]]2567; CHECK-INTERLEAVED-NEXT: br label %[[FOR_END:.*]]2568; CHECK-INTERLEAVED: [[FOR_END]]:2569; CHECK-INTERLEAVED-NEXT: ret i32 [[BIN_RDX]]2570;2571entry:2572 br label %for.body2573 2574for.body: ; preds = %entry, %for.body2575 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]2576 %x.05 = phi i32 [ %sub, %for.body ], [ 0, %entry ]2577 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %indvars.iv2578 %arrayidx.b = getelementptr inbounds i32, ptr %B, i64 %indvars.iv2579 %l0 = load i32, ptr %arrayidx, align 42580 %l0.b = load i32, ptr %arrayidx.b, align 42581 %add = add nsw i32 %x.05, %l02582 %sub = sub nsw i32 %add, %l0.b2583 %indvars.iv.next = add i64 %indvars.iv, 12584 %lftr.wideiv = trunc i64 %indvars.iv.next to i322585 %exitcond = icmp eq i32 %lftr.wideiv, 2562586 br i1 %exitcond, label %for.end, label %for.body2587 2588for.end: ; preds = %for.body, %entry2589 %x.0.lcssa = phi i32 [ %sub, %for.body ]2590 ret i32 %x.0.lcssa2591}2592 2593; An in-loop sub reduction followed by an in-loop add reduction becomes an add reduction with its input negated2594define i32 @reduction_sub_add(ptr noalias nocapture %A, ptr noalias nocapture %B) {2595; CHECK-LABEL: define i32 @reduction_sub_add(2596; CHECK-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {2597; CHECK-NEXT: [[ENTRY:.*:]]2598; CHECK-NEXT: br label %[[VECTOR_PH:.*]]2599; CHECK: [[VECTOR_PH]]:2600; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]2601; CHECK: [[VECTOR_BODY]]:2602; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]2603; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP6:%.*]], %[[VECTOR_BODY]] ]2604; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]2605; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]2606; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 42607; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, ptr [[TMP1]], align 42608; CHECK-NEXT: [[TMP2:%.*]] = sub <4 x i32> zeroinitializer, [[WIDE_LOAD]]2609; CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP2]])2610; CHECK-NEXT: [[TMP4:%.*]] = add i32 [[VEC_PHI]], [[TMP3]]2611; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD1]])2612; CHECK-NEXT: [[TMP6]] = add i32 [[TMP4]], [[TMP5]]2613; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 42614; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 2562615; CHECK-NEXT: br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP29:![0-9]+]]2616; CHECK: [[MIDDLE_BLOCK]]:2617; CHECK-NEXT: br label %[[FOR_END:.*]]2618; CHECK: [[FOR_END]]:2619; CHECK-NEXT: ret i32 [[TMP6]]2620;2621; CHECK-INTERLEAVED-LABEL: define i32 @reduction_sub_add(2622; CHECK-INTERLEAVED-SAME: ptr noalias captures(none) [[A:%.*]], ptr noalias captures(none) [[B:%.*]]) {2623; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]2624; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]2625; CHECK-INTERLEAVED: [[VECTOR_PH]]:2626; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]2627; CHECK-INTERLEAVED: [[VECTOR_BODY]]:2628; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]2629; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP11:%.*]], %[[VECTOR_BODY]] ]2630; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP13:%.*]], %[[VECTOR_BODY]] ]2631; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDEX]]2632; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]2633; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 42634; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 42635; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP2]], align 42636; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i64 42637; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr [[TMP1]], align 42638; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x i32>, ptr [[TMP3]], align 42639; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = sub <4 x i32> zeroinitializer, [[WIDE_LOAD]]2640; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = sub <4 x i32> zeroinitializer, [[WIDE_LOAD2]]2641; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP4]])2642; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = add i32 [[VEC_PHI]], [[TMP6]]2643; CHECK-INTERLEAVED-NEXT: [[TMP8:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP5]])2644; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = add i32 [[VEC_PHI1]], [[TMP8]]2645; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD3]])2646; CHECK-INTERLEAVED-NEXT: [[TMP11]] = add i32 [[TMP7]], [[TMP10]]2647; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD4]])2648; CHECK-INTERLEAVED-NEXT: [[TMP13]] = add i32 [[TMP9]], [[TMP12]]2649; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 82650; CHECK-INTERLEAVED-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], 2562651; CHECK-INTERLEAVED-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP29:![0-9]+]]2652; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:2653; CHECK-INTERLEAVED-NEXT: [[BIN_RDX:%.*]] = add i32 [[TMP13]], [[TMP11]]2654; CHECK-INTERLEAVED-NEXT: br label %[[FOR_END:.*]]2655; CHECK-INTERLEAVED: [[FOR_END]]:2656; CHECK-INTERLEAVED-NEXT: ret i32 [[BIN_RDX]]2657;2658entry:2659 br label %for.body2660 2661for.body: ; preds = %entry, %for.body2662 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]2663 %x.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]2664 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %indvars.iv2665 %arrayidx.b = getelementptr inbounds i32, ptr %B, i64 %indvars.iv2666 %l0 = load i32, ptr %arrayidx, align 42667 %l0.b = load i32, ptr %arrayidx.b, align 42668 %sub = sub nsw i32 %x.05, %l02669 %add = add nsw i32 %sub, %l0.b2670 %indvars.iv.next = add i64 %indvars.iv, 12671 %lftr.wideiv = trunc i64 %indvars.iv.next to i322672 %exitcond = icmp eq i32 %lftr.wideiv, 2562673 br i1 %exitcond, label %for.end, label %for.body2674 2675for.end: ; preds = %for.body, %entry2676 %x.0.lcssa = phi i32 [ %add, %for.body ]2677 ret i32 %x.0.lcssa2678}2679 2680; Test that bundling recipes that share an operand into an expression works.2681; In this case the two extends are the recipes that share an operand.2682define i64 @reduction_expression_same_operands(ptr nocapture readonly %x, ptr nocapture readonly %y, i32 %n) {2683; CHECK-LABEL: define i64 @reduction_expression_same_operands(2684; CHECK-SAME: ptr readonly captures(none) [[X:%.*]], ptr readonly captures(none) [[Y:%.*]], i32 [[N:%.*]]) {2685; CHECK-NEXT: [[ENTRY:.*]]:2686; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[N]], 42687; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]2688; CHECK: [[VECTOR_PH]]:2689; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[N]], 42690; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[N]], [[N_MOD_VF]]2691; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]2692; CHECK: [[VECTOR_BODY]]:2693; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]2694; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[TMP6:%.*]], %[[VECTOR_BODY]] ]2695; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i16, ptr [[X]], i32 [[INDEX]]2696; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i16>, ptr [[TMP1]], align 42697; CHECK-NEXT: [[TMP3:%.*]] = sext <4 x i16> [[WIDE_LOAD]] to <4 x i64>2698; CHECK-NEXT: [[TMP4:%.*]] = mul nsw <4 x i64> [[TMP3]], [[TMP3]]2699; CHECK-NEXT: [[TMP5:%.*]] = call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> [[TMP4]])2700; CHECK-NEXT: [[TMP6]] = add i64 [[VEC_PHI]], [[TMP5]]2701; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 42702; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]2703; CHECK-NEXT: br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP30:![0-9]+]]2704; CHECK: [[MIDDLE_BLOCK]]:2705; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[N]], [[N_VEC]]2706; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]2707; CHECK: [[SCALAR_PH]]:2708; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]2709; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = phi i64 [ [[TMP6]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]2710; CHECK-NEXT: br label %[[LOOP:.*]]2711; CHECK: [[LOOP]]:2712; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]2713; CHECK-NEXT: [[RDX:%.*]] = phi i64 [ [[RDX_NEXT:%.*]], %[[LOOP]] ], [ [[BC_MERGE_RDX]], %[[SCALAR_PH]] ]2714; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i16, ptr [[X]], i32 [[IV]]2715; CHECK-NEXT: [[LOAD0:%.*]] = load i16, ptr [[ARRAYIDX]], align 42716; CHECK-NEXT: [[CONV0:%.*]] = sext i16 [[LOAD0]] to i322717; CHECK-NEXT: [[CONV1:%.*]] = sext i16 [[LOAD0]] to i322718; CHECK-NEXT: [[MUL1:%.*]] = mul nsw i32 [[CONV0]], [[CONV1]]2719; CHECK-NEXT: [[MUL:%.*]] = sext i32 [[MUL1]] to i642720; CHECK-NEXT: [[RDX_NEXT]] = add nsw i64 [[RDX]], [[MUL]]2721; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 12722; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[IV_NEXT]], [[N]]2723; CHECK-NEXT: br i1 [[EXITCOND]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP31:![0-9]+]]2724; CHECK: [[EXIT]]:2725; CHECK-NEXT: [[R_0_LCSSA:%.*]] = phi i64 [ [[RDX_NEXT]], %[[LOOP]] ], [ [[TMP6]], %[[MIDDLE_BLOCK]] ]2726; CHECK-NEXT: ret i64 [[R_0_LCSSA]]2727;2728; CHECK-INTERLEAVED-LABEL: define i64 @reduction_expression_same_operands(2729; CHECK-INTERLEAVED-SAME: ptr readonly captures(none) [[X:%.*]], ptr readonly captures(none) [[Y:%.*]], i32 [[N:%.*]]) {2730; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*]]:2731; CHECK-INTERLEAVED-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[N]], 82732; CHECK-INTERLEAVED-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]2733; CHECK-INTERLEAVED: [[VECTOR_PH]]:2734; CHECK-INTERLEAVED-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[N]], 82735; CHECK-INTERLEAVED-NEXT: [[N_VEC:%.*]] = sub i32 [[N]], [[N_MOD_VF]]2736; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]2737; CHECK-INTERLEAVED: [[VECTOR_BODY]]:2738; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]2739; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[TMP7:%.*]], %[[VECTOR_BODY]] ]2740; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[TMP12:%.*]], %[[VECTOR_BODY]] ]2741; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr inbounds i16, ptr [[X]], i32 [[INDEX]]2742; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = getelementptr inbounds i16, ptr [[TMP1]], i64 42743; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i16>, ptr [[TMP1]], align 42744; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i16>, ptr [[TMP2]], align 42745; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = sext <4 x i16> [[WIDE_LOAD]] to <4 x i64>2746; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = mul nsw <4 x i64> [[TMP4]], [[TMP4]]2747; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> [[TMP5]])2748; CHECK-INTERLEAVED-NEXT: [[TMP7]] = add i64 [[VEC_PHI]], [[TMP6]]2749; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = sext <4 x i16> [[WIDE_LOAD2]] to <4 x i64>2750; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = mul nsw <4 x i64> [[TMP9]], [[TMP9]]2751; CHECK-INTERLEAVED-NEXT: [[TMP11:%.*]] = call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> [[TMP10]])2752; CHECK-INTERLEAVED-NEXT: [[TMP12]] = add i64 [[VEC_PHI1]], [[TMP11]]2753; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 82754; CHECK-INTERLEAVED-NEXT: [[TMP13:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]2755; CHECK-INTERLEAVED-NEXT: br i1 [[TMP13]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP30:![0-9]+]]2756; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:2757; CHECK-INTERLEAVED-NEXT: [[BIN_RDX:%.*]] = add i64 [[TMP12]], [[TMP7]]2758; CHECK-INTERLEAVED-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[N]], [[N_VEC]]2759; CHECK-INTERLEAVED-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]2760; CHECK-INTERLEAVED: [[SCALAR_PH]]:2761; CHECK-INTERLEAVED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]2762; CHECK-INTERLEAVED-NEXT: [[BC_MERGE_RDX:%.*]] = phi i64 [ [[BIN_RDX]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]2763; CHECK-INTERLEAVED-NEXT: br label %[[LOOP:.*]]2764; CHECK-INTERLEAVED: [[LOOP]]:2765; CHECK-INTERLEAVED-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]2766; CHECK-INTERLEAVED-NEXT: [[RDX:%.*]] = phi i64 [ [[RDX_NEXT:%.*]], %[[LOOP]] ], [ [[BC_MERGE_RDX]], %[[SCALAR_PH]] ]2767; CHECK-INTERLEAVED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i16, ptr [[X]], i32 [[IV]]2768; CHECK-INTERLEAVED-NEXT: [[LOAD0:%.*]] = load i16, ptr [[ARRAYIDX]], align 42769; CHECK-INTERLEAVED-NEXT: [[CONV0:%.*]] = sext i16 [[LOAD0]] to i322770; CHECK-INTERLEAVED-NEXT: [[CONV1:%.*]] = sext i16 [[LOAD0]] to i322771; CHECK-INTERLEAVED-NEXT: [[MUL1:%.*]] = mul nsw i32 [[CONV0]], [[CONV1]]2772; CHECK-INTERLEAVED-NEXT: [[MUL:%.*]] = sext i32 [[MUL1]] to i642773; CHECK-INTERLEAVED-NEXT: [[RDX_NEXT]] = add nsw i64 [[RDX]], [[MUL]]2774; CHECK-INTERLEAVED-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 12775; CHECK-INTERLEAVED-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[IV_NEXT]], [[N]]2776; CHECK-INTERLEAVED-NEXT: br i1 [[EXITCOND]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP31:![0-9]+]]2777; CHECK-INTERLEAVED: [[EXIT]]:2778; CHECK-INTERLEAVED-NEXT: [[R_0_LCSSA:%.*]] = phi i64 [ [[RDX_NEXT]], %[[LOOP]] ], [ [[BIN_RDX]], %[[MIDDLE_BLOCK]] ]2779; CHECK-INTERLEAVED-NEXT: ret i64 [[R_0_LCSSA]]2780;2781entry:2782 br label %loop2783 2784loop:2785 %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]2786 %rdx = phi i64 [ %rdx.next, %loop ], [ 0, %entry ]2787 %arrayidx = getelementptr inbounds i16, ptr %x, i32 %iv2788 %load0 = load i16, ptr %arrayidx, align 42789 %conv0 = sext i16 %load0 to i322790 %conv1 = sext i16 %load0 to i322791 %mul = mul nsw i32 %conv0, %conv12792 %conv = sext i32 %mul to i642793 %rdx.next = add nsw i64 %rdx, %conv2794 %iv.next = add nuw nsw i32 %iv, 12795 %exitcond = icmp eq i32 %iv.next, %n2796 br i1 %exitcond, label %exit, label %loop2797 2798exit:2799 %r.0.lcssa = phi i64 [ %rdx.next, %loop ]2800 ret i64 %r.0.lcssa2801}2802 2803define i32 @reduction_expression_ext_mulacc_livein(ptr %a, i16 %c) {2804; CHECK-LABEL: define i32 @reduction_expression_ext_mulacc_livein(2805; CHECK-SAME: ptr [[A:%.*]], i16 [[C:%.*]]) {2806; CHECK-NEXT: [[ENTRY:.*:]]2807; CHECK-NEXT: br label %[[VECTOR_PH:.*]]2808; CHECK: [[VECTOR_PH]]:2809; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i16> poison, i16 [[C]], i64 02810; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i16> [[BROADCAST_SPLATINSERT]], <4 x i16> poison, <4 x i32> zeroinitializer2811; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]2812; CHECK: [[VECTOR_BODY]]:2813; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]2814; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP5:%.*]], %[[VECTOR_BODY]] ]2815; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[A]], i64 [[INDEX]]2816; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP0]], align 12817; CHECK-NEXT: [[TMP1:%.*]] = zext <4 x i8> [[WIDE_LOAD]] to <4 x i16>2818; CHECK-NEXT: [[TMP2:%.*]] = mul <4 x i16> [[BROADCAST_SPLAT]], [[TMP1]]2819; CHECK-NEXT: [[TMP3:%.*]] = zext <4 x i16> [[TMP2]] to <4 x i32>2820; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP3]])2821; CHECK-NEXT: [[TMP5]] = add i32 [[VEC_PHI]], [[TMP4]]2822; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 42823; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10242824; CHECK-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP32:![0-9]+]]2825; CHECK: [[MIDDLE_BLOCK]]:2826; CHECK-NEXT: br label %[[FOR_EXIT:.*]]2827; CHECK: [[FOR_EXIT]]:2828; CHECK-NEXT: ret i32 [[TMP5]]2829;2830; CHECK-INTERLEAVED-LABEL: define i32 @reduction_expression_ext_mulacc_livein(2831; CHECK-INTERLEAVED-SAME: ptr [[A:%.*]], i16 [[C:%.*]]) {2832; CHECK-INTERLEAVED-NEXT: [[ENTRY:.*:]]2833; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_PH:.*]]2834; CHECK-INTERLEAVED: [[VECTOR_PH]]:2835; CHECK-INTERLEAVED-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i16> poison, i16 [[C]], i64 02836; CHECK-INTERLEAVED-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i16> [[BROADCAST_SPLATINSERT]], <4 x i16> poison, <4 x i32> zeroinitializer2837; CHECK-INTERLEAVED-NEXT: br label %[[VECTOR_BODY:.*]]2838; CHECK-INTERLEAVED: [[VECTOR_BODY]]:2839; CHECK-INTERLEAVED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]2840; CHECK-INTERLEAVED-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP8:%.*]], %[[VECTOR_BODY]] ]2841; CHECK-INTERLEAVED-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[TMP11:%.*]], %[[VECTOR_BODY]] ]2842; CHECK-INTERLEAVED-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[A]], i64 [[INDEX]]2843; CHECK-INTERLEAVED-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i64 42844; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP0]], align 12845; CHECK-INTERLEAVED-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i8>, ptr [[TMP1]], align 12846; CHECK-INTERLEAVED-NEXT: [[TMP2:%.*]] = zext <4 x i8> [[WIDE_LOAD]] to <4 x i16>2847; CHECK-INTERLEAVED-NEXT: [[TMP3:%.*]] = zext <4 x i8> [[WIDE_LOAD2]] to <4 x i16>2848; CHECK-INTERLEAVED-NEXT: [[TMP4:%.*]] = mul <4 x i16> [[BROADCAST_SPLAT]], [[TMP2]]2849; CHECK-INTERLEAVED-NEXT: [[TMP5:%.*]] = mul <4 x i16> [[BROADCAST_SPLAT]], [[TMP3]]2850; CHECK-INTERLEAVED-NEXT: [[TMP6:%.*]] = zext <4 x i16> [[TMP4]] to <4 x i32>2851; CHECK-INTERLEAVED-NEXT: [[TMP7:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP6]])2852; CHECK-INTERLEAVED-NEXT: [[TMP8]] = add i32 [[VEC_PHI]], [[TMP7]]2853; CHECK-INTERLEAVED-NEXT: [[TMP9:%.*]] = zext <4 x i16> [[TMP5]] to <4 x i32>2854; CHECK-INTERLEAVED-NEXT: [[TMP10:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP9]])2855; CHECK-INTERLEAVED-NEXT: [[TMP11]] = add i32 [[VEC_PHI1]], [[TMP10]]2856; CHECK-INTERLEAVED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 82857; CHECK-INTERLEAVED-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10242858; CHECK-INTERLEAVED-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP32:![0-9]+]]2859; CHECK-INTERLEAVED: [[MIDDLE_BLOCK]]:2860; CHECK-INTERLEAVED-NEXT: [[BIN_RDX:%.*]] = add i32 [[TMP11]], [[TMP8]]2861; CHECK-INTERLEAVED-NEXT: br label %[[FOR_EXIT:.*]]2862; CHECK-INTERLEAVED: [[FOR_EXIT]]:2863; CHECK-INTERLEAVED-NEXT: ret i32 [[BIN_RDX]]2864;2865entry:2866 br label %for.body2867 2868for.body: ; preds = %for.body, %entry2869 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]2870 %accum = phi i32 [ 0, %entry ], [ %add, %for.body ]2871 %gep.a = getelementptr i8, ptr %a, i64 %iv2872 %load.a = load i8, ptr %gep.a, align 12873 %ext.a = zext i8 %load.a to i162874 %mul = mul i16 %c, %ext.a2875 %mul.ext = zext i16 %mul to i322876 %add = add i32 %mul.ext, %accum2877 %iv.next = add i64 %iv, 12878 %exitcond.not = icmp eq i64 %iv.next, 10242879 br i1 %exitcond.not, label %for.exit, label %for.body2880 2881for.exit: ; preds = %for.body2882 ret i32 %add2883}2884 2885declare float @llvm.fmuladd.f32(float, float, float)2886 2887!6 = distinct !{!6, !7, !8}2888!7 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}2889!8 = !{!"llvm.loop.vectorize.enable", i1 true}2890