1532 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=loop-vectorize,dce,instcombine -force-vector-interleave=1 -force-vector-width=4 -prefer-inloop-reductions -prefer-predicate-over-epilogue=predicate-else-scalar-epilogue -S | FileCheck %s3 4target 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"5 6define i32 @reduction_sum_single(ptr noalias nocapture %A) {7; CHECK-LABEL: @reduction_sum_single(8; CHECK-NEXT: entry:9; CHECK-NEXT: br label [[VECTOR_PH:%.*]]10; CHECK: vector.ph:11; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]12; CHECK: vector.body:13; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]14; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]15; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP26:%.*]], [[PRED_LOAD_CONTINUE6]] ]16; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)17; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 018; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]19; CHECK: pred.load.if:20; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDEX]]21; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 422; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 023; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]24; CHECK: pred.load.continue:25; CHECK-NEXT: [[TMP5:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]26; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i64 127; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]28; CHECK: pred.load.if1:29; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX]]30; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[TMP7]], i64 431; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 432; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i64 133; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]34; CHECK: pred.load.continue2:35; CHECK-NEXT: [[TMP11:%.*]] = phi <4 x i32> [ [[TMP5]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP10]], [[PRED_LOAD_IF1]] ]36; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i1> [[TMP0]], i64 237; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]38; CHECK: pred.load.if3:39; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX]]40; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[TMP13]], i64 841; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[TMP14]], align 442; CHECK-NEXT: [[TMP16:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP15]], i64 243; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]44; CHECK: pred.load.continue4:45; CHECK-NEXT: [[TMP17:%.*]] = phi <4 x i32> [ [[TMP11]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP16]], [[PRED_LOAD_IF3]] ]46; CHECK-NEXT: [[TMP18:%.*]] = extractelement <4 x i1> [[TMP0]], i64 347; CHECK-NEXT: br i1 [[TMP18]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]48; CHECK: pred.load.if5:49; CHECK-NEXT: [[TMP19:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX]]50; CHECK-NEXT: [[TMP20:%.*]] = getelementptr i8, ptr [[TMP19]], i64 1251; CHECK-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 452; CHECK-NEXT: [[TMP22:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP21]], i64 353; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]54; CHECK: pred.load.continue6:55; CHECK-NEXT: [[TMP23:%.*]] = phi <4 x i32> [ [[TMP17]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP22]], [[PRED_LOAD_IF5]] ]56; CHECK-NEXT: [[TMP24:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP23]], <4 x i32> zeroinitializer57; CHECK-NEXT: [[TMP25:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP24]])58; CHECK-NEXT: [[TMP26]] = add i32 [[VEC_PHI]], [[TMP25]]59; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 460; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)61; CHECK-NEXT: [[TMP27:%.*]] = icmp eq i64 [[INDEX_NEXT]], 26062; CHECK-NEXT: br i1 [[TMP27]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]63; CHECK: middle.block:64; CHECK-NEXT: br label [[DOTLR_PH:%.*]]65; CHECK: ._crit_edge:66; CHECK-NEXT: ret i32 [[TMP26]]67;68entry:69 br label %.lr.ph70 71.lr.ph: ; preds = %entry, %.lr.ph72 %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]73 %sum.02 = phi i32 [ %l7, %.lr.ph ], [ 0, %entry ]74 %l2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv75 %l3 = load i32, ptr %l2, align 476 %l7 = add i32 %sum.02, %l377 %indvars.iv.next = add i64 %indvars.iv, 178 %lftr.wideiv = trunc i64 %indvars.iv.next to i3279 %exitcond = icmp eq i32 %lftr.wideiv, 25780 br i1 %exitcond, label %._crit_edge, label %.lr.ph81 82._crit_edge: ; preds = %.lr.ph83 %sum.0.lcssa = phi i32 [ %l7, %.lr.ph ]84 ret i32 %sum.0.lcssa85}86 87define i32 @reduction_sum(ptr noalias nocapture %A, ptr noalias nocapture %B) {88; CHECK-LABEL: @reduction_sum(89; CHECK-NEXT: entry:90; CHECK-NEXT: br label [[VECTOR_PH:%.*]]91; CHECK: vector.ph:92; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]93; CHECK: vector.body:94; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE8:%.*]] ]95; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE8]] ]96; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP48:%.*]], [[PRED_LOAD_CONTINUE8]] ]97; CHECK-NEXT: [[VEC_IND1:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT2:%.*]], [[PRED_LOAD_CONTINUE8]] ]98; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)99; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0100; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]101; CHECK: pred.load.if:102; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDEX]]103; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4104; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0105; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDEX]]106; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4107; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0108; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]109; CHECK: pred.load.continue:110; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]111; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]112; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1113; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]114; CHECK: pred.load.if2:115; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i64 [[INDEX]], 1116; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP11]]117; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4118; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1119; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP11]]120; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4121; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1122; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]123; CHECK: pred.load.continue3:124; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF3]] ]125; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF3]] ]126; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2127; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6:%.*]]128; CHECK: pred.load.if4:129; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i64 [[INDEX]], 2130; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP21]]131; CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4132; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2133; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP21]]134; CHECK-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 4135; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2136; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]137; CHECK: pred.load.continue5:138; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP24]], [[PRED_LOAD_IF5]] ]139; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP27]], [[PRED_LOAD_IF5]] ]140; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3141; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF7:%.*]], label [[PRED_LOAD_CONTINUE8]]142; CHECK: pred.load.if6:143; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i64 [[INDEX]], 3144; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP31]]145; CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[TMP32]], align 4146; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3147; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP31]]148; CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP35]], align 4149; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3150; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE8]]151; CHECK: pred.load.continue7:152; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE6]] ], [ [[TMP34]], [[PRED_LOAD_IF7]] ]153; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE6]] ], [ [[TMP37]], [[PRED_LOAD_IF7]] ]154; CHECK-NEXT: [[TMP40:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[VEC_IND1]], <4 x i32> zeroinitializer155; CHECK-NEXT: [[TMP41:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP40]])156; CHECK-NEXT: [[TMP42:%.*]] = add i32 [[VEC_PHI]], [[TMP41]]157; CHECK-NEXT: [[TMP43:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP38]], <4 x i32> zeroinitializer158; CHECK-NEXT: [[TMP44:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP43]])159; CHECK-NEXT: [[TMP45:%.*]] = add i32 [[TMP42]], [[TMP44]]160; CHECK-NEXT: [[TMP46:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP39]], <4 x i32> zeroinitializer161; CHECK-NEXT: [[TMP47:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP46]])162; CHECK-NEXT: [[TMP48]] = add i32 [[TMP45]], [[TMP47]]163; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4164; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)165; CHECK-NEXT: [[VEC_IND_NEXT2]] = add <4 x i32> [[VEC_IND1]], splat (i32 4)166; CHECK-NEXT: [[TMP49:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260167; CHECK-NEXT: br i1 [[TMP49]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]168; CHECK: middle.block:169; CHECK-NEXT: br label [[DOTLR_PH:%.*]]170; CHECK: ._crit_edge:171; CHECK-NEXT: ret i32 [[TMP48]]172;173entry:174 br label %.lr.ph175 176.lr.ph: ; preds = %entry, %.lr.ph177 %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]178 %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ]179 %l2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv180 %l3 = load i32, ptr %l2, align 4181 %l4 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv182 %l5 = load i32, ptr %l4, align 4183 %l6 = trunc i64 %indvars.iv to i32184 %l7 = add i32 %sum.02, %l6185 %l8 = add i32 %l7, %l3186 %l9 = add i32 %l8, %l5187 %indvars.iv.next = add i64 %indvars.iv, 1188 %lftr.wideiv = trunc i64 %indvars.iv.next to i32189 %exitcond = icmp eq i32 %lftr.wideiv, 257190 br i1 %exitcond, label %._crit_edge, label %.lr.ph191 192._crit_edge: ; preds = %.lr.ph193 %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ]194 ret i32 %sum.0.lcssa195}196 197define i32 @reduction_sum_const(ptr noalias nocapture %A) {198; CHECK-LABEL: @reduction_sum_const(199; CHECK-NEXT: entry:200; CHECK-NEXT: br label [[VECTOR_PH:%.*]]201; CHECK: vector.ph:202; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]203; CHECK: vector.body:204; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]205; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]206; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP29:%.*]], [[PRED_LOAD_CONTINUE6]] ]207; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)208; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0209; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]210; CHECK: pred.load.if:211; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDEX]]212; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4213; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0214; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]215; CHECK: pred.load.continue:216; CHECK-NEXT: [[TMP5:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]217; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1218; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]219; CHECK: pred.load.if1:220; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX]]221; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[TMP7]], i64 4222; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 4223; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i64 1224; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]225; CHECK: pred.load.continue2:226; CHECK-NEXT: [[TMP11:%.*]] = phi <4 x i32> [ [[TMP5]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP10]], [[PRED_LOAD_IF1]] ]227; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2228; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]229; CHECK: pred.load.if3:230; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX]]231; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[TMP13]], i64 8232; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[TMP14]], align 4233; CHECK-NEXT: [[TMP16:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP15]], i64 2234; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]235; CHECK: pred.load.continue4:236; CHECK-NEXT: [[TMP17:%.*]] = phi <4 x i32> [ [[TMP11]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP16]], [[PRED_LOAD_IF3]] ]237; CHECK-NEXT: [[TMP18:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3238; CHECK-NEXT: br i1 [[TMP18]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]239; CHECK: pred.load.if5:240; CHECK-NEXT: [[TMP19:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX]]241; CHECK-NEXT: [[TMP20:%.*]] = getelementptr i8, ptr [[TMP19]], i64 12242; CHECK-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4243; CHECK-NEXT: [[TMP22:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP21]], i64 3244; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]245; CHECK: pred.load.continue6:246; CHECK-NEXT: [[TMP23:%.*]] = phi <4 x i32> [ [[TMP17]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP22]], [[PRED_LOAD_IF5]] ]247; CHECK-NEXT: [[TMP24:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP23]], <4 x i32> zeroinitializer248; CHECK-NEXT: [[TMP25:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP24]])249; CHECK-NEXT: [[TMP26:%.*]] = add i32 [[VEC_PHI]], [[TMP25]]250; CHECK-NEXT: [[TMP27:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> splat (i32 3), <4 x i32> zeroinitializer251; CHECK-NEXT: [[TMP28:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP27]])252; CHECK-NEXT: [[TMP29]] = add i32 [[TMP26]], [[TMP28]]253; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4254; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)255; CHECK-NEXT: [[TMP30:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260256; CHECK-NEXT: br i1 [[TMP30]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]257; CHECK: middle.block:258; CHECK-NEXT: br label [[DOTLR_PH:%.*]]259; CHECK: ._crit_edge:260; CHECK-NEXT: ret i32 [[TMP29]]261;262entry:263 br label %.lr.ph264 265.lr.ph: ; preds = %entry, %.lr.ph266 %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]267 %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ]268 %l2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv269 %l3 = load i32, ptr %l2, align 4270 %l7 = add i32 %sum.02, %l3271 %l9 = add i32 %l7, 3272 %indvars.iv.next = add i64 %indvars.iv, 1273 %lftr.wideiv = trunc i64 %indvars.iv.next to i32274 %exitcond = icmp eq i32 %lftr.wideiv, 257275 br i1 %exitcond, label %._crit_edge, label %.lr.ph276 277._crit_edge: ; preds = %.lr.ph278 %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ]279 ret i32 %sum.0.lcssa280}281 282define i32 @reduction_prod(ptr noalias nocapture %A, ptr noalias nocapture %B) {283; CHECK-LABEL: @reduction_prod(284; CHECK-NEXT: entry:285; CHECK-NEXT: br label [[VECTOR_PH:%.*]]286; CHECK: vector.ph:287; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]288; CHECK: vector.body:289; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE8:%.*]] ]290; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE8]] ]291; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 1, [[VECTOR_PH]] ], [ [[TMP48:%.*]], [[PRED_LOAD_CONTINUE8]] ]292; CHECK-NEXT: [[VEC_IND1:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT2:%.*]], [[PRED_LOAD_CONTINUE8]] ]293; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)294; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0295; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]296; CHECK: pred.load.if:297; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDEX]]298; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4299; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0300; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDEX]]301; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4302; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0303; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]304; CHECK: pred.load.continue:305; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]306; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]307; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1308; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]309; CHECK: pred.load.if2:310; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i64 [[INDEX]], 1311; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP11]]312; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4313; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1314; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP11]]315; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4316; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1317; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]318; CHECK: pred.load.continue3:319; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF3]] ]320; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF3]] ]321; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2322; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6:%.*]]323; CHECK: pred.load.if4:324; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i64 [[INDEX]], 2325; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP21]]326; CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4327; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2328; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP21]]329; CHECK-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 4330; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2331; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]332; CHECK: pred.load.continue5:333; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP24]], [[PRED_LOAD_IF5]] ]334; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP27]], [[PRED_LOAD_IF5]] ]335; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3336; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF7:%.*]], label [[PRED_LOAD_CONTINUE8]]337; CHECK: pred.load.if6:338; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i64 [[INDEX]], 3339; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP31]]340; CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[TMP32]], align 4341; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3342; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP31]]343; CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP35]], align 4344; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3345; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE8]]346; CHECK: pred.load.continue7:347; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE6]] ], [ [[TMP34]], [[PRED_LOAD_IF7]] ]348; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE6]] ], [ [[TMP37]], [[PRED_LOAD_IF7]] ]349; CHECK-NEXT: [[TMP40:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[VEC_IND1]], <4 x i32> splat (i32 1)350; CHECK-NEXT: [[TMP41:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[TMP40]])351; CHECK-NEXT: [[TMP42:%.*]] = mul i32 [[VEC_PHI]], [[TMP41]]352; CHECK-NEXT: [[TMP43:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP38]], <4 x i32> splat (i32 1)353; CHECK-NEXT: [[TMP44:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[TMP43]])354; CHECK-NEXT: [[TMP45:%.*]] = mul i32 [[TMP42]], [[TMP44]]355; CHECK-NEXT: [[TMP46:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP39]], <4 x i32> splat (i32 1)356; CHECK-NEXT: [[TMP47:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[TMP46]])357; CHECK-NEXT: [[TMP48]] = mul i32 [[TMP45]], [[TMP47]]358; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4359; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)360; CHECK-NEXT: [[VEC_IND_NEXT2]] = add <4 x i32> [[VEC_IND1]], splat (i32 4)361; CHECK-NEXT: [[TMP49:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260362; CHECK-NEXT: br i1 [[TMP49]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]363; CHECK: middle.block:364; CHECK-NEXT: br label [[DOTLR_PH:%.*]]365; CHECK: ._crit_edge:366; CHECK-NEXT: ret i32 [[TMP48]]367;368entry:369 br label %.lr.ph370 371.lr.ph: ; preds = %entry, %.lr.ph372 %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]373 %prod.02 = phi i32 [ %l9, %.lr.ph ], [ 1, %entry ]374 %l2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv375 %l3 = load i32, ptr %l2, align 4376 %l4 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv377 %l5 = load i32, ptr %l4, align 4378 %l6 = trunc i64 %indvars.iv to i32379 %l7 = mul i32 %prod.02, %l6380 %l8 = mul i32 %l7, %l3381 %l9 = mul i32 %l8, %l5382 %indvars.iv.next = add i64 %indvars.iv, 1383 %lftr.wideiv = trunc i64 %indvars.iv.next to i32384 %exitcond = icmp eq i32 %lftr.wideiv, 257385 br i1 %exitcond, label %._crit_edge, label %.lr.ph386 387._crit_edge: ; preds = %.lr.ph388 %prod.0.lcssa = phi i32 [ %l9, %.lr.ph ]389 ret i32 %prod.0.lcssa390}391 392define i32 @reduction_mix(ptr noalias nocapture %A, ptr noalias nocapture %B) {393; CHECK-LABEL: @reduction_mix(394; CHECK-NEXT: entry:395; CHECK-NEXT: br label [[VECTOR_PH:%.*]]396; CHECK: vector.ph:397; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]398; CHECK: vector.body:399; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE8:%.*]] ]400; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE8]] ]401; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP46:%.*]], [[PRED_LOAD_CONTINUE8]] ]402; CHECK-NEXT: [[VEC_IND1:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT2:%.*]], [[PRED_LOAD_CONTINUE8]] ]403; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)404; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0405; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]406; CHECK: pred.load.if:407; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDEX]]408; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4409; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0410; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[B1:%.*]], i64 [[INDEX]]411; CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP8]], align 4412; CHECK-NEXT: [[TMP13:%.*]] = insertelement <4 x i32> poison, i32 [[TMP12]], i64 0413; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]414; CHECK: pred.load.continue:415; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]416; CHECK-NEXT: [[TMP14:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP13]], [[PRED_LOAD_IF]] ]417; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1418; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]419; CHECK: pred.load.if2:420; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i64 [[INDEX]], 1421; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP11]]422; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4423; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1424; CHECK-NEXT: [[TMP18:%.*]] = getelementptr inbounds i32, ptr [[B1]], i64 [[TMP11]]425; CHECK-NEXT: [[TMP22:%.*]] = load i32, ptr [[TMP18]], align 4426; CHECK-NEXT: [[TMP23:%.*]] = insertelement <4 x i32> [[TMP14]], i32 [[TMP22]], i64 1427; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]428; CHECK: pred.load.continue3:429; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF3]] ]430; CHECK-NEXT: [[TMP24:%.*]] = phi <4 x i32> [ [[TMP14]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP23]], [[PRED_LOAD_IF3]] ]431; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2432; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6:%.*]]433; CHECK: pred.load.if4:434; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i64 [[INDEX]], 2435; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP21]]436; CHECK-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 4437; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2438; CHECK-NEXT: [[TMP28:%.*]] = getelementptr inbounds i32, ptr [[B1]], i64 [[TMP21]]439; CHECK-NEXT: [[TMP32:%.*]] = load i32, ptr [[TMP28]], align 4440; CHECK-NEXT: [[TMP33:%.*]] = insertelement <4 x i32> [[TMP24]], i32 [[TMP32]], i64 2441; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]442; CHECK: pred.load.continue5:443; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP27]], [[PRED_LOAD_IF5]] ]444; CHECK-NEXT: [[TMP34:%.*]] = phi <4 x i32> [ [[TMP24]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP33]], [[PRED_LOAD_IF5]] ]445; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3446; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF7:%.*]], label [[PRED_LOAD_CONTINUE8]]447; CHECK: pred.load.if6:448; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i64 [[INDEX]], 3449; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP31]]450; CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP35]], align 4451; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3452; CHECK-NEXT: [[TMP38:%.*]] = getelementptr inbounds i32, ptr [[B1]], i64 [[TMP31]]453; CHECK-NEXT: [[TMP48:%.*]] = load i32, ptr [[TMP38]], align 4454; CHECK-NEXT: [[TMP49:%.*]] = insertelement <4 x i32> [[TMP34]], i32 [[TMP48]], i64 3455; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE8]]456; CHECK: pred.load.continue7:457; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE6]] ], [ [[TMP37]], [[PRED_LOAD_IF7]] ]458; CHECK-NEXT: [[TMP50:%.*]] = phi <4 x i32> [ [[TMP34]], [[PRED_LOAD_CONTINUE6]] ], [ [[TMP49]], [[PRED_LOAD_IF7]] ]459; CHECK-NEXT: [[TMP41:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[VEC_IND1]], <4 x i32> zeroinitializer460; CHECK-NEXT: [[TMP42:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP41]])461; CHECK-NEXT: [[TMP43:%.*]] = add i32 [[VEC_PHI]], [[TMP42]]462; CHECK-NEXT: [[TMP40:%.*]] = mul nsw <4 x i32> [[TMP50]], [[TMP39]]463; CHECK-NEXT: [[TMP44:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP40]], <4 x i32> zeroinitializer464; CHECK-NEXT: [[TMP45:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP44]])465; CHECK-NEXT: [[TMP46]] = add i32 [[TMP43]], [[TMP45]]466; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4467; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)468; CHECK-NEXT: [[VEC_IND_NEXT2]] = add <4 x i32> [[VEC_IND1]], splat (i32 4)469; CHECK-NEXT: [[TMP47:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260470; CHECK-NEXT: br i1 [[TMP47]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]471; CHECK: middle.block:472; CHECK-NEXT: br label [[DOTLR_PH:%.*]]473; CHECK: ._crit_edge:474; CHECK-NEXT: ret i32 [[TMP46]]475;476entry:477 br label %.lr.ph478 479.lr.ph: ; preds = %entry, %.lr.ph480 %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]481 %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ]482 %l2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv483 %l3 = load i32, ptr %l2, align 4484 %l4 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv485 %l5 = load i32, ptr %l4, align 4486 %l6 = mul nsw i32 %l5, %l3487 %l7 = trunc i64 %indvars.iv to i32488 %l8 = add i32 %sum.02, %l7489 %l9 = add i32 %l8, %l6490 %indvars.iv.next = add i64 %indvars.iv, 1491 %lftr.wideiv = trunc i64 %indvars.iv.next to i32492 %exitcond = icmp eq i32 %lftr.wideiv, 257493 br i1 %exitcond, label %._crit_edge, label %.lr.ph494 495._crit_edge: ; preds = %.lr.ph496 %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ]497 ret i32 %sum.0.lcssa498}499 500define i32 @reduction_mul(ptr noalias nocapture %A, ptr noalias nocapture %B) {501; CHECK-LABEL: @reduction_mul(502; CHECK-NEXT: entry:503; CHECK-NEXT: br label [[VECTOR_PH:%.*]]504; CHECK: vector.ph:505; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]506; CHECK: vector.body:507; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]508; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]509; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 19, [[VECTOR_PH]] ], [ [[TMP45:%.*]], [[PRED_LOAD_CONTINUE6]] ]510; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)511; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0512; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]513; CHECK: pred.load.if:514; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDEX]]515; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4516; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0517; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDEX]]518; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4519; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0520; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]521; CHECK: pred.load.continue:522; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]523; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]524; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1525; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]526; CHECK: pred.load.if1:527; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i64 [[INDEX]], 1528; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP11]]529; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4530; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1531; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP11]]532; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4533; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1534; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]535; CHECK: pred.load.continue2:536; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]537; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]538; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2539; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]540; CHECK: pred.load.if3:541; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i64 [[INDEX]], 2542; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP21]]543; CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4544; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2545; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP21]]546; CHECK-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 4547; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2548; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]549; CHECK: pred.load.continue4:550; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]551; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]552; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3553; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]554; CHECK: pred.load.if5:555; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i64 [[INDEX]], 3556; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP31]]557; CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[TMP32]], align 4558; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3559; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP31]]560; CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP35]], align 4561; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3562; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]563; CHECK: pred.load.continue6:564; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]565; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]566; CHECK-NEXT: [[TMP40:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP38]], <4 x i32> splat (i32 1)567; CHECK-NEXT: [[TMP41:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[TMP40]])568; CHECK-NEXT: [[TMP42:%.*]] = mul i32 [[VEC_PHI]], [[TMP41]]569; CHECK-NEXT: [[TMP43:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP39]], <4 x i32> splat (i32 1)570; CHECK-NEXT: [[TMP44:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[TMP43]])571; CHECK-NEXT: [[TMP45]] = mul i32 [[TMP42]], [[TMP44]]572; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4573; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)574; CHECK-NEXT: [[TMP46:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260575; CHECK-NEXT: br i1 [[TMP46]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]576; CHECK: middle.block:577; CHECK-NEXT: br label [[DOTLR_PH:%.*]]578; CHECK: ._crit_edge:579; CHECK-NEXT: ret i32 [[TMP45]]580;581entry:582 br label %.lr.ph583 584.lr.ph: ; preds = %entry, %.lr.ph585 %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]586 %sum.02 = phi i32 [ %l7, %.lr.ph ], [ 19, %entry ]587 %l2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv588 %l3 = load i32, ptr %l2, align 4589 %l4 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv590 %l5 = load i32, ptr %l4, align 4591 %l6 = mul i32 %sum.02, %l3592 %l7 = mul i32 %l6, %l5593 %indvars.iv.next = add i64 %indvars.iv, 1594 %lftr.wideiv = trunc i64 %indvars.iv.next to i32595 %exitcond = icmp eq i32 %lftr.wideiv, 257596 br i1 %exitcond, label %._crit_edge, label %.lr.ph597 598._crit_edge: ; preds = %.lr.ph599 %sum.0.lcssa = phi i32 [ %l7, %.lr.ph ]600 ret i32 %sum.0.lcssa601}602 603define i32 @reduction_and(ptr nocapture %A, ptr nocapture %B) {604; CHECK-LABEL: @reduction_and(605; CHECK-NEXT: entry:606; CHECK-NEXT: br label [[VECTOR_PH:%.*]]607; CHECK: vector.ph:608; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]609; CHECK: vector.body:610; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]611; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]612; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ -1, [[VECTOR_PH]] ], [ [[TMP45:%.*]], [[PRED_LOAD_CONTINUE6]] ]613; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)614; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0615; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]616; CHECK: pred.load.if:617; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDEX]]618; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4619; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0620; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDEX]]621; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4622; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0623; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]624; CHECK: pred.load.continue:625; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]626; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]627; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1628; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]629; CHECK: pred.load.if1:630; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i64 [[INDEX]], 1631; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP11]]632; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4633; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1634; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP11]]635; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4636; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1637; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]638; CHECK: pred.load.continue2:639; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]640; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]641; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2642; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]643; CHECK: pred.load.if3:644; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i64 [[INDEX]], 2645; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP21]]646; CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4647; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2648; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP21]]649; CHECK-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 4650; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2651; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]652; CHECK: pred.load.continue4:653; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]654; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]655; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3656; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]657; CHECK: pred.load.if5:658; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i64 [[INDEX]], 3659; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP31]]660; CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[TMP32]], align 4661; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3662; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP31]]663; CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP35]], align 4664; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3665; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]666; CHECK: pred.load.continue6:667; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]668; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]669; CHECK-NEXT: [[TMP40:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP38]], <4 x i32> splat (i32 -1)670; CHECK-NEXT: [[TMP41:%.*]] = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> [[TMP40]])671; CHECK-NEXT: [[TMP42:%.*]] = and i32 [[VEC_PHI]], [[TMP41]]672; CHECK-NEXT: [[TMP43:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP39]], <4 x i32> splat (i32 -1)673; CHECK-NEXT: [[TMP44:%.*]] = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> [[TMP43]])674; CHECK-NEXT: [[TMP45]] = and i32 [[TMP42]], [[TMP44]]675; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4676; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)677; CHECK-NEXT: [[TMP46:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260678; CHECK-NEXT: br i1 [[TMP46]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]679; CHECK: middle.block:680; CHECK-NEXT: br label [[FOR_BODY:%.*]]681; CHECK: for.end:682; CHECK-NEXT: ret i32 [[TMP45]]683;684entry:685 br label %for.body686 687for.body: ; preds = %entry, %for.body688 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]689 %result.08 = phi i32 [ %and, %for.body ], [ -1, %entry ]690 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %indvars.iv691 %l0 = load i32, ptr %arrayidx, align 4692 %arrayidx2 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv693 %l1 = load i32, ptr %arrayidx2, align 4694 %add = and i32 %result.08, %l0695 %and = and i32 %add, %l1696 %indvars.iv.next = add i64 %indvars.iv, 1697 %lftr.wideiv = trunc i64 %indvars.iv.next to i32698 %exitcond = icmp eq i32 %lftr.wideiv, 257699 br i1 %exitcond, label %for.end, label %for.body700 701for.end: ; preds = %for.body, %entry702 %result.0.lcssa = phi i32 [ %and, %for.body ]703 ret i32 %result.0.lcssa704}705 706define i32 @reduction_or(ptr nocapture %A, ptr nocapture %B) {707; CHECK-LABEL: @reduction_or(708; CHECK-NEXT: entry:709; CHECK-NEXT: br label [[VECTOR_PH:%.*]]710; CHECK: vector.ph:711; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]712; CHECK: vector.body:713; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]714; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]715; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP43:%.*]], [[PRED_LOAD_CONTINUE6]] ]716; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)717; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0718; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]719; CHECK: pred.load.if:720; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDEX]]721; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4722; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0723; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDEX]]724; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4725; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0726; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]727; CHECK: pred.load.continue:728; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]729; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]730; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1731; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]732; CHECK: pred.load.if1:733; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i64 [[INDEX]], 1734; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP11]]735; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4736; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1737; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP11]]738; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4739; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1740; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]741; CHECK: pred.load.continue2:742; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]743; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]744; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2745; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]746; CHECK: pred.load.if3:747; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i64 [[INDEX]], 2748; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP21]]749; CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4750; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2751; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP21]]752; CHECK-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 4753; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2754; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]755; CHECK: pred.load.continue4:756; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]757; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]758; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3759; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]760; CHECK: pred.load.if5:761; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i64 [[INDEX]], 3762; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP31]]763; CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[TMP32]], align 4764; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3765; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP31]]766; CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP35]], align 4767; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3768; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]769; CHECK: pred.load.continue6:770; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]771; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]772; CHECK-NEXT: [[TMP40:%.*]] = add nsw <4 x i32> [[TMP39]], [[TMP38]]773; CHECK-NEXT: [[TMP41:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP40]], <4 x i32> zeroinitializer774; CHECK-NEXT: [[TMP42:%.*]] = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> [[TMP41]])775; CHECK-NEXT: [[TMP43]] = or i32 [[VEC_PHI]], [[TMP42]]776; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4777; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)778; CHECK-NEXT: [[TMP44:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260779; CHECK-NEXT: br i1 [[TMP44]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]780; CHECK: middle.block:781; CHECK-NEXT: br label [[FOR_BODY:%.*]]782; CHECK: for.end:783; CHECK-NEXT: ret i32 [[TMP43]]784;785entry:786 br label %for.body787 788for.body: ; preds = %entry, %for.body789 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]790 %result.08 = phi i32 [ %or, %for.body ], [ 0, %entry ]791 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %indvars.iv792 %l0 = load i32, ptr %arrayidx, align 4793 %arrayidx2 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv794 %l1 = load i32, ptr %arrayidx2, align 4795 %add = add nsw i32 %l1, %l0796 %or = or i32 %add, %result.08797 %indvars.iv.next = add i64 %indvars.iv, 1798 %lftr.wideiv = trunc i64 %indvars.iv.next to i32799 %exitcond = icmp eq i32 %lftr.wideiv, 257800 br i1 %exitcond, label %for.end, label %for.body801 802for.end: ; preds = %for.body, %entry803 %result.0.lcssa = phi i32 [ %or, %for.body ]804 ret i32 %result.0.lcssa805}806 807define i32 @reduction_xor(ptr nocapture %A, ptr nocapture %B) {808; CHECK-LABEL: @reduction_xor(809; CHECK-NEXT: entry:810; CHECK-NEXT: br label [[VECTOR_PH:%.*]]811; CHECK: vector.ph:812; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]813; CHECK: vector.body:814; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]815; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]816; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP43:%.*]], [[PRED_LOAD_CONTINUE6]] ]817; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)818; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0819; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]820; CHECK: pred.load.if:821; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDEX]]822; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4823; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0824; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDEX]]825; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4826; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0827; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]828; CHECK: pred.load.continue:829; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]830; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]831; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1832; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]833; CHECK: pred.load.if1:834; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i64 [[INDEX]], 1835; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP11]]836; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4837; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1838; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP11]]839; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4840; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1841; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]842; CHECK: pred.load.continue2:843; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]844; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]845; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2846; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]847; CHECK: pred.load.if3:848; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i64 [[INDEX]], 2849; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP21]]850; CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4851; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2852; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP21]]853; CHECK-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 4854; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2855; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]856; CHECK: pred.load.continue4:857; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]858; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]859; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3860; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]861; CHECK: pred.load.if5:862; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i64 [[INDEX]], 3863; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP31]]864; CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[TMP32]], align 4865; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3866; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP31]]867; CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP35]], align 4868; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3869; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]870; CHECK: pred.load.continue6:871; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]872; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]873; CHECK-NEXT: [[TMP40:%.*]] = add nsw <4 x i32> [[TMP39]], [[TMP38]]874; CHECK-NEXT: [[TMP41:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP40]], <4 x i32> zeroinitializer875; CHECK-NEXT: [[TMP42:%.*]] = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> [[TMP41]])876; CHECK-NEXT: [[TMP43]] = xor i32 [[VEC_PHI]], [[TMP42]]877; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4878; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)879; CHECK-NEXT: [[TMP44:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260880; CHECK-NEXT: br i1 [[TMP44]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]881; CHECK: middle.block:882; CHECK-NEXT: br label [[FOR_BODY:%.*]]883; CHECK: for.end:884; CHECK-NEXT: ret i32 [[TMP43]]885;886entry:887 br label %for.body888 889for.body: ; preds = %entry, %for.body890 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]891 %result.08 = phi i32 [ %xor, %for.body ], [ 0, %entry ]892 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %indvars.iv893 %l0 = load i32, ptr %arrayidx, align 4894 %arrayidx2 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv895 %l1 = load i32, ptr %arrayidx2, align 4896 %add = add nsw i32 %l1, %l0897 %xor = xor i32 %add, %result.08898 %indvars.iv.next = add i64 %indvars.iv, 1899 %lftr.wideiv = trunc i64 %indvars.iv.next to i32900 %exitcond = icmp eq i32 %lftr.wideiv, 257901 br i1 %exitcond, label %for.end, label %for.body902 903for.end: ; preds = %for.body, %entry904 %result.0.lcssa = phi i32 [ %xor, %for.body ]905 ret i32 %result.0.lcssa906}907 908define float @reduction_fadd(ptr nocapture %A, ptr nocapture %B) {909; CHECK-LABEL: @reduction_fadd(910; CHECK-NEXT: entry:911; CHECK-NEXT: br label [[VECTOR_PH:%.*]]912; CHECK: vector.ph:913; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]914; CHECK: vector.body:915; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]916; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]917; CHECK-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, [[VECTOR_PH]] ], [ [[TMP43:%.*]], [[PRED_LOAD_CONTINUE6]] ]918; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)919; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0920; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]921; CHECK: pred.load.if:922; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[A:%.*]], i64 [[INDEX]]923; CHECK-NEXT: [[TMP3:%.*]] = load float, ptr [[TMP2]], align 4924; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> poison, float [[TMP3]], i64 0925; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, ptr [[B:%.*]], i64 [[INDEX]]926; CHECK-NEXT: [[TMP6:%.*]] = load float, ptr [[TMP5]], align 4927; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x float> poison, float [[TMP6]], i64 0928; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]929; CHECK: pred.load.continue:930; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]931; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]932; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1933; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]934; CHECK: pred.load.if1:935; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i64 [[INDEX]], 1936; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP11]]937; CHECK-NEXT: [[TMP13:%.*]] = load float, ptr [[TMP12]], align 4938; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x float> [[TMP8]], float [[TMP13]], i64 1939; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[TMP11]]940; CHECK-NEXT: [[TMP16:%.*]] = load float, ptr [[TMP15]], align 4941; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x float> [[TMP9]], float [[TMP16]], i64 1942; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]943; CHECK: pred.load.continue2:944; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x float> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]945; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x float> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]946; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2947; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]948; CHECK: pred.load.if3:949; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i64 [[INDEX]], 2950; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP21]]951; CHECK-NEXT: [[TMP23:%.*]] = load float, ptr [[TMP22]], align 4952; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x float> [[TMP18]], float [[TMP23]], i64 2953; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[TMP21]]954; CHECK-NEXT: [[TMP26:%.*]] = load float, ptr [[TMP25]], align 4955; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x float> [[TMP19]], float [[TMP26]], i64 2956; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]957; CHECK: pred.load.continue4:958; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x float> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]959; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x float> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]960; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3961; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]962; CHECK: pred.load.if5:963; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i64 [[INDEX]], 3964; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP31]]965; CHECK-NEXT: [[TMP33:%.*]] = load float, ptr [[TMP32]], align 4966; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x float> [[TMP28]], float [[TMP33]], i64 3967; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[TMP31]]968; CHECK-NEXT: [[TMP36:%.*]] = load float, ptr [[TMP35]], align 4969; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x float> [[TMP29]], float [[TMP36]], i64 3970; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]971; CHECK: pred.load.continue6:972; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x float> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]973; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x float> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]974; CHECK-NEXT: [[TMP40:%.*]] = select fast <4 x i1> [[TMP0]], <4 x float> [[TMP38]], <4 x float> zeroinitializer975; CHECK-NEXT: [[TMP41:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float [[VEC_PHI]], <4 x float> [[TMP40]])976; CHECK-NEXT: [[TMP42:%.*]] = select fast <4 x i1> [[TMP0]], <4 x float> [[TMP39]], <4 x float> zeroinitializer977; CHECK-NEXT: [[TMP43]] = call fast float @llvm.vector.reduce.fadd.v4f32(float [[TMP41]], <4 x float> [[TMP42]])978; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4979; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)980; CHECK-NEXT: [[TMP44:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260981; CHECK-NEXT: br i1 [[TMP44]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]982; CHECK: middle.block:983; CHECK-NEXT: br label [[FOR_BODY:%.*]]984; CHECK: for.end:985; CHECK-NEXT: ret float [[TMP43]]986;987entry:988 br label %for.body989 990for.body: ; preds = %entry, %for.body991 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]992 %result.08 = phi float [ %fadd, %for.body ], [ 0.0, %entry ]993 %arrayidx = getelementptr inbounds float, ptr %A, i64 %indvars.iv994 %l0 = load float, ptr %arrayidx, align 4995 %arrayidx2 = getelementptr inbounds float, ptr %B, i64 %indvars.iv996 %l1 = load float, ptr %arrayidx2, align 4997 %add = fadd fast float %result.08, %l0998 %fadd = fadd fast float %add, %l1999 %indvars.iv.next = add i64 %indvars.iv, 11000 %lftr.wideiv = trunc i64 %indvars.iv.next to i321001 %exitcond = icmp eq i32 %lftr.wideiv, 2571002 br i1 %exitcond, label %for.end, label %for.body1003 1004for.end: ; preds = %for.body, %entry1005 %result.0.lcssa = phi float [ %fadd, %for.body ]1006 ret float %result.0.lcssa1007}1008 1009define float @reduction_fmul(ptr nocapture %A, ptr nocapture %B) {1010; CHECK-LABEL: @reduction_fmul(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:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]1017; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]1018; CHECK-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, [[VECTOR_PH]] ], [ [[TMP45:%.*]], [[PRED_LOAD_CONTINUE6]] ]1019; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)1020; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 01021; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]1022; CHECK: pred.load.if:1023; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[A:%.*]], i64 [[INDEX]]1024; CHECK-NEXT: [[TMP3:%.*]] = load float, ptr [[TMP2]], align 41025; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> poison, float [[TMP3]], i64 01026; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, ptr [[B:%.*]], i64 [[INDEX]]1027; CHECK-NEXT: [[TMP6:%.*]] = load float, ptr [[TMP5]], align 41028; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x float> poison, float [[TMP6]], i64 01029; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]1030; CHECK: pred.load.continue:1031; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]1032; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]1033; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 11034; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]1035; CHECK: pred.load.if1:1036; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i64 [[INDEX]], 11037; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP11]]1038; CHECK-NEXT: [[TMP13:%.*]] = load float, ptr [[TMP12]], align 41039; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x float> [[TMP8]], float [[TMP13]], i64 11040; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[TMP11]]1041; CHECK-NEXT: [[TMP16:%.*]] = load float, ptr [[TMP15]], align 41042; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x float> [[TMP9]], float [[TMP16]], i64 11043; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]1044; CHECK: pred.load.continue2:1045; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x float> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]1046; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x float> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]1047; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 21048; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]1049; CHECK: pred.load.if3:1050; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i64 [[INDEX]], 21051; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP21]]1052; CHECK-NEXT: [[TMP23:%.*]] = load float, ptr [[TMP22]], align 41053; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x float> [[TMP18]], float [[TMP23]], i64 21054; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[TMP21]]1055; CHECK-NEXT: [[TMP26:%.*]] = load float, ptr [[TMP25]], align 41056; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x float> [[TMP19]], float [[TMP26]], i64 21057; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]1058; CHECK: pred.load.continue4:1059; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x float> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]1060; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x float> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]1061; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 31062; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]1063; CHECK: pred.load.if5:1064; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i64 [[INDEX]], 31065; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP31]]1066; CHECK-NEXT: [[TMP33:%.*]] = load float, ptr [[TMP32]], align 41067; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x float> [[TMP28]], float [[TMP33]], i64 31068; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[TMP31]]1069; CHECK-NEXT: [[TMP36:%.*]] = load float, ptr [[TMP35]], align 41070; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x float> [[TMP29]], float [[TMP36]], i64 31071; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]1072; CHECK: pred.load.continue6:1073; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x float> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]1074; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x float> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]1075; CHECK-NEXT: [[TMP40:%.*]] = select fast <4 x i1> [[TMP0]], <4 x float> [[TMP38]], <4 x float> splat (float 1.000000e+00)1076; CHECK-NEXT: [[TMP41:%.*]] = call fast float @llvm.vector.reduce.fmul.v4f32(float 1.000000e+00, <4 x float> [[TMP40]])1077; CHECK-NEXT: [[TMP42:%.*]] = fmul fast float [[VEC_PHI]], [[TMP41]]1078; CHECK-NEXT: [[TMP43:%.*]] = select fast <4 x i1> [[TMP0]], <4 x float> [[TMP39]], <4 x float> splat (float 1.000000e+00)1079; CHECK-NEXT: [[TMP44:%.*]] = call fast float @llvm.vector.reduce.fmul.v4f32(float 1.000000e+00, <4 x float> [[TMP43]])1080; CHECK-NEXT: [[TMP45]] = fmul fast float [[TMP42]], [[TMP44]]1081; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 41082; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)1083; CHECK-NEXT: [[TMP46:%.*]] = icmp eq i64 [[INDEX_NEXT]], 2601084; CHECK-NEXT: br i1 [[TMP46]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]1085; CHECK: middle.block:1086; CHECK-NEXT: br label [[FOR_BODY:%.*]]1087; CHECK: for.end:1088; CHECK-NEXT: ret float [[TMP45]]1089;1090entry:1091 br label %for.body1092 1093for.body: ; preds = %entry, %for.body1094 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1095 %result.08 = phi float [ %fmul, %for.body ], [ 0.0, %entry ]1096 %arrayidx = getelementptr inbounds float, ptr %A, i64 %indvars.iv1097 %l0 = load float, ptr %arrayidx, align 41098 %arrayidx2 = getelementptr inbounds float, ptr %B, i64 %indvars.iv1099 %l1 = load float, ptr %arrayidx2, align 41100 %add = fmul fast float %result.08, %l01101 %fmul = fmul fast float %add, %l11102 %indvars.iv.next = add i64 %indvars.iv, 11103 %lftr.wideiv = trunc i64 %indvars.iv.next to i321104 %exitcond = icmp eq i32 %lftr.wideiv, 2571105 br i1 %exitcond, label %for.end, label %for.body1106 1107for.end: ; preds = %for.body, %entry1108 %result.0.lcssa = phi float [ %fmul, %for.body ]1109 ret float %result.0.lcssa1110}1111 1112define i32 @reduction_min(ptr nocapture %A, ptr nocapture %B) {1113; CHECK-LABEL: @reduction_min(1114; CHECK-NEXT: entry:1115; CHECK-NEXT: br label [[VECTOR_PH:%.*]]1116; CHECK: vector.ph:1117; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]1118; CHECK: vector.body:1119; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]1120; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]1121; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 1000, [[VECTOR_PH]] ], [ [[RDX_MINMAX:%.*]], [[PRED_LOAD_CONTINUE6]] ]1122; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)1123; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 01124; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]1125; CHECK: pred.load.if:1126; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDEX]]1127; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 41128; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 01129; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]1130; CHECK: pred.load.continue:1131; CHECK-NEXT: [[TMP5:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]1132; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i64 11133; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]1134; CHECK: pred.load.if1:1135; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX]]1136; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[TMP7]], i64 41137; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 41138; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i64 11139; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]1140; CHECK: pred.load.continue2:1141; CHECK-NEXT: [[TMP11:%.*]] = phi <4 x i32> [ [[TMP5]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP10]], [[PRED_LOAD_IF1]] ]1142; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i1> [[TMP0]], i64 21143; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]1144; CHECK: pred.load.if3:1145; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX]]1146; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[TMP13]], i64 81147; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[TMP14]], align 41148; CHECK-NEXT: [[TMP16:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP15]], i64 21149; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]1150; CHECK: pred.load.continue4:1151; CHECK-NEXT: [[TMP17:%.*]] = phi <4 x i32> [ [[TMP11]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP16]], [[PRED_LOAD_IF3]] ]1152; CHECK-NEXT: [[TMP18:%.*]] = extractelement <4 x i1> [[TMP0]], i64 31153; CHECK-NEXT: br i1 [[TMP18]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]1154; CHECK: pred.load.if5:1155; CHECK-NEXT: [[TMP19:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX]]1156; CHECK-NEXT: [[TMP20:%.*]] = getelementptr i8, ptr [[TMP19]], i64 121157; CHECK-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 41158; CHECK-NEXT: [[TMP22:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP21]], i64 31159; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]1160; CHECK: pred.load.continue6:1161; CHECK-NEXT: [[TMP23:%.*]] = phi <4 x i32> [ [[TMP17]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP22]], [[PRED_LOAD_IF5]] ]1162; CHECK-NEXT: [[TMP24:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP23]], <4 x i32> splat (i32 2147483647)1163; CHECK-NEXT: [[TMP25:%.*]] = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> [[TMP24]])1164; CHECK-NEXT: [[RDX_MINMAX]] = call i32 @llvm.smin.i32(i32 [[TMP25]], i32 [[VEC_PHI]])1165; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 41166; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)1167; CHECK-NEXT: [[TMP26:%.*]] = icmp eq i64 [[INDEX_NEXT]], 2601168; CHECK-NEXT: br i1 [[TMP26]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]1169; CHECK: middle.block:1170; CHECK-NEXT: br label [[FOR_BODY:%.*]]1171; CHECK: for.end:1172; CHECK-NEXT: ret i32 [[RDX_MINMAX]]1173;1174entry:1175 br label %for.body1176 1177for.body: ; preds = %entry, %for.body1178 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1179 %result.08 = phi i32 [ %v0, %for.body ], [ 1000, %entry ]1180 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %indvars.iv1181 %l0 = load i32, ptr %arrayidx, align 41182 %c0 = icmp slt i32 %result.08, %l01183 %v0 = select i1 %c0, i32 %result.08, i32 %l01184 %indvars.iv.next = add i64 %indvars.iv, 11185 %lftr.wideiv = trunc i64 %indvars.iv.next to i321186 %exitcond = icmp eq i32 %lftr.wideiv, 2571187 br i1 %exitcond, label %for.end, label %for.body1188 1189for.end: ; preds = %for.body, %entry1190 %result.0.lcssa = phi i32 [ %v0, %for.body ]1191 ret i32 %result.0.lcssa1192}1193 1194define i32 @reduction_max(ptr nocapture %A, ptr nocapture %B) {1195; CHECK-LABEL: @reduction_max(1196; CHECK-NEXT: entry:1197; CHECK-NEXT: br label [[VECTOR_PH:%.*]]1198; CHECK: vector.ph:1199; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]1200; CHECK: vector.body:1201; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]1202; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]1203; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 1000, [[VECTOR_PH]] ], [ [[RDX_MINMAX:%.*]], [[PRED_LOAD_CONTINUE6]] ]1204; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)1205; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 01206; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]1207; CHECK: pred.load.if:1208; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDEX]]1209; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 41210; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 01211; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]1212; CHECK: pred.load.continue:1213; CHECK-NEXT: [[TMP5:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]1214; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i64 11215; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]1216; CHECK: pred.load.if1:1217; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX]]1218; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[TMP7]], i64 41219; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 41220; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i64 11221; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]1222; CHECK: pred.load.continue2:1223; CHECK-NEXT: [[TMP11:%.*]] = phi <4 x i32> [ [[TMP5]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP10]], [[PRED_LOAD_IF1]] ]1224; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i1> [[TMP0]], i64 21225; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]1226; CHECK: pred.load.if3:1227; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX]]1228; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[TMP13]], i64 81229; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[TMP14]], align 41230; CHECK-NEXT: [[TMP16:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP15]], i64 21231; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]1232; CHECK: pred.load.continue4:1233; CHECK-NEXT: [[TMP17:%.*]] = phi <4 x i32> [ [[TMP11]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP16]], [[PRED_LOAD_IF3]] ]1234; CHECK-NEXT: [[TMP18:%.*]] = extractelement <4 x i1> [[TMP0]], i64 31235; CHECK-NEXT: br i1 [[TMP18]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]1236; CHECK: pred.load.if5:1237; CHECK-NEXT: [[TMP19:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX]]1238; CHECK-NEXT: [[TMP20:%.*]] = getelementptr i8, ptr [[TMP19]], i64 121239; CHECK-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 41240; CHECK-NEXT: [[TMP22:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP21]], i64 31241; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]1242; CHECK: pred.load.continue6:1243; CHECK-NEXT: [[TMP23:%.*]] = phi <4 x i32> [ [[TMP17]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP22]], [[PRED_LOAD_IF5]] ]1244; CHECK-NEXT: [[TMP24:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP23]], <4 x i32> zeroinitializer1245; CHECK-NEXT: [[TMP25:%.*]] = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> [[TMP24]])1246; CHECK-NEXT: [[RDX_MINMAX]] = call i32 @llvm.umax.i32(i32 [[TMP25]], i32 [[VEC_PHI]])1247; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 41248; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)1249; CHECK-NEXT: [[TMP26:%.*]] = icmp eq i64 [[INDEX_NEXT]], 2601250; CHECK-NEXT: br i1 [[TMP26]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]1251; CHECK: middle.block:1252; CHECK-NEXT: br label [[FOR_BODY:%.*]]1253; CHECK: for.end:1254; CHECK-NEXT: ret i32 [[RDX_MINMAX]]1255;1256entry:1257 br label %for.body1258 1259for.body: ; preds = %entry, %for.body1260 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1261 %result.08 = phi i32 [ %v0, %for.body ], [ 1000, %entry ]1262 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %indvars.iv1263 %l0 = load i32, ptr %arrayidx, align 41264 %c0 = icmp ugt i32 %result.08, %l01265 %v0 = select i1 %c0, i32 %result.08, i32 %l01266 %indvars.iv.next = add i64 %indvars.iv, 11267 %lftr.wideiv = trunc i64 %indvars.iv.next to i321268 %exitcond = icmp eq i32 %lftr.wideiv, 2571269 br i1 %exitcond, label %for.end, label %for.body1270 1271for.end: ; preds = %for.body, %entry1272 %result.0.lcssa = phi i32 [ %v0, %for.body ]1273 ret i32 %result.0.lcssa1274}1275 1276; Conditional reductions with multi-input phis.1277define float @reduction_conditional(ptr %A, ptr %B, ptr %C, float %S) {1278; CHECK-LABEL: @reduction_conditional(1279; CHECK-NEXT: entry:1280; CHECK-NEXT: br label [[VECTOR_PH:%.*]]1281; CHECK: vector.ph:1282; CHECK-NEXT: [[TMP0:%.*]] = insertelement <4 x float> <float poison, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, float [[S:%.*]], i64 01283; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]1284; CHECK: vector.body:1285; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]1286; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x float> [ [[TMP0]], [[VECTOR_PH]] ], [ [[PREDPHI3:%.*]], [[VECTOR_BODY]] ]1287; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[A:%.*]], i64 [[INDEX]]1288; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP1]], align 41289; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[B:%.*]], i64 [[INDEX]]1290; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x float>, ptr [[TMP2]], align 41291; CHECK-NEXT: [[TMP3:%.*]] = fcmp ogt <4 x float> [[WIDE_LOAD]], [[WIDE_LOAD1]]1292; CHECK-NEXT: [[TMP4:%.*]] = fcmp ogt <4 x float> [[WIDE_LOAD1]], splat (float 1.000000e+00)1293; CHECK-NEXT: [[TMP8:%.*]] = xor <4 x i1> [[TMP4]], splat (i1 true)1294; CHECK-NEXT: [[TMP6:%.*]] = fcmp ule <4 x float> [[WIDE_LOAD]], splat (float 2.000000e+00)1295; CHECK-NEXT: [[TMP7:%.*]] = fadd fast <4 x float> [[VEC_PHI]], [[WIDE_LOAD1]]1296; CHECK-NEXT: [[TMP5:%.*]] = and <4 x i1> [[TMP3]], [[TMP4]]1297; CHECK-NEXT: [[TMP9:%.*]] = fadd fast <4 x float> [[VEC_PHI]], [[WIDE_LOAD]]1298; CHECK-NEXT: [[TMP10:%.*]] = and <4 x i1> [[TMP6]], [[TMP8]]1299; CHECK-NEXT: [[TMP11:%.*]] = and <4 x i1> [[TMP10]], [[TMP3]]1300; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP11]], <4 x float> [[VEC_PHI]], <4 x float> [[TMP7]]1301; CHECK-NEXT: [[PREDPHI2:%.*]] = select <4 x i1> [[TMP5]], <4 x float> [[TMP9]], <4 x float> [[PREDPHI]]1302; CHECK-NEXT: [[PREDPHI3]] = select <4 x i1> [[TMP3]], <4 x float> [[PREDPHI2]], <4 x float> [[VEC_PHI]]1303; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 41304; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1281305; CHECK-NEXT: br i1 [[TMP12]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]1306; CHECK: middle.block:1307; CHECK-NEXT: br label [[FOR_INC:%.*]]1308; CHECK: for.end:1309; CHECK-NEXT: [[SUM_1_LCSSA:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[PREDPHI3]])1310; CHECK-NEXT: ret float [[SUM_1_LCSSA]]1311;1312entry:1313 br label %for.body1314 1315for.body:1316 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.inc ]1317 %sum.033 = phi float [ %S, %entry ], [ %sum.1, %for.inc ]1318 %arrayidx = getelementptr inbounds float, ptr %A, i64 %indvars.iv1319 %l0 = load float, ptr %arrayidx, align 41320 %arrayidx2 = getelementptr inbounds float, ptr %B, i64 %indvars.iv1321 %l1 = load float, ptr %arrayidx2, align 41322 %cmp3 = fcmp ogt float %l0, %l11323 br i1 %cmp3, label %if.then, label %for.inc1324 1325if.then:1326 %cmp6 = fcmp ogt float %l1, 1.000000e+001327 br i1 %cmp6, label %if.then8, label %if.else1328 1329if.then8:1330 %add = fadd fast float %sum.033, %l01331 br label %for.inc1332 1333if.else:1334 %cmp14 = fcmp ogt float %l0, 2.000000e+001335 br i1 %cmp14, label %if.then16, label %for.inc1336 1337if.then16:1338 %add19 = fadd fast float %sum.033, %l11339 br label %for.inc1340 1341for.inc:1342 %sum.1 = phi float [ %add, %if.then8 ], [ %add19, %if.then16 ], [ %sum.033, %if.else ], [ %sum.033, %for.body ]1343 %indvars.iv.next = add i64 %indvars.iv, 11344 %lftr.wideiv = trunc i64 %indvars.iv.next to i321345 %exitcond = icmp ne i32 %lftr.wideiv, 1281346 br i1 %exitcond, label %for.body, label %for.end1347 1348for.end:1349 %sum.1.lcssa = phi float [ %sum.1, %for.inc ]1350 ret float %sum.1.lcssa1351}1352 1353define i8 @reduction_add_trunc(ptr noalias nocapture %A) {1354; CHECK-LABEL: @reduction_add_trunc(1355; CHECK-NEXT: entry:1356; CHECK-NEXT: br label [[VECTOR_PH:%.*]]1357; CHECK: vector.ph:1358; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]1359; CHECK: vector.body:1360; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]1361; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]1362; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ <i32 255, i32 0, i32 0, i32 0>, [[VECTOR_PH]] ], [ [[TMP30:%.*]], [[PRED_LOAD_CONTINUE6]] ]1363; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)1364; CHECK-NEXT: [[TMP1:%.*]] = and <4 x i32> [[VEC_PHI]], splat (i32 255)1365; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x i1> [[TMP0]], i64 01366; CHECK-NEXT: br i1 [[TMP2]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]1367; CHECK: pred.load.if:1368; CHECK-NEXT: [[TMP3:%.*]] = sext i32 [[INDEX]] to i641369; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i64 [[TMP3]]1370; CHECK-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP4]], align 41371; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x i8> poison, i8 [[TMP5]], i64 01372; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]1373; CHECK: pred.load.continue:1374; CHECK-NEXT: [[TMP7:%.*]] = phi <4 x i8> [ poison, [[VECTOR_BODY]] ], [ [[TMP6]], [[PRED_LOAD_IF]] ]1375; CHECK-NEXT: [[TMP8:%.*]] = extractelement <4 x i1> [[TMP0]], i64 11376; CHECK-NEXT: br i1 [[TMP8]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]1377; CHECK: pred.load.if1:1378; CHECK-NEXT: [[TMP9:%.*]] = sext i32 [[INDEX]] to i641379; CHECK-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP9]]1380; CHECK-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[TMP10]], i64 11381; CHECK-NEXT: [[TMP12:%.*]] = load i8, ptr [[TMP11]], align 41382; CHECK-NEXT: [[TMP13:%.*]] = insertelement <4 x i8> [[TMP7]], i8 [[TMP12]], i64 11383; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]1384; CHECK: pred.load.continue2:1385; CHECK-NEXT: [[TMP14:%.*]] = phi <4 x i8> [ [[TMP7]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP13]], [[PRED_LOAD_IF1]] ]1386; CHECK-NEXT: [[TMP15:%.*]] = extractelement <4 x i1> [[TMP0]], i64 21387; CHECK-NEXT: br i1 [[TMP15]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]1388; CHECK: pred.load.if3:1389; CHECK-NEXT: [[TMP16:%.*]] = sext i32 [[INDEX]] to i641390; CHECK-NEXT: [[TMP17:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP16]]1391; CHECK-NEXT: [[TMP18:%.*]] = getelementptr i8, ptr [[TMP17]], i64 21392; CHECK-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 41393; CHECK-NEXT: [[TMP20:%.*]] = insertelement <4 x i8> [[TMP14]], i8 [[TMP19]], i64 21394; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]1395; CHECK: pred.load.continue4:1396; CHECK-NEXT: [[TMP21:%.*]] = phi <4 x i8> [ [[TMP14]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP20]], [[PRED_LOAD_IF3]] ]1397; CHECK-NEXT: [[TMP22:%.*]] = extractelement <4 x i1> [[TMP0]], i64 31398; CHECK-NEXT: br i1 [[TMP22]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]1399; CHECK: pred.load.if5:1400; CHECK-NEXT: [[TMP23:%.*]] = sext i32 [[INDEX]] to i641401; CHECK-NEXT: [[TMP24:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP23]]1402; CHECK-NEXT: [[TMP25:%.*]] = getelementptr i8, ptr [[TMP24]], i64 31403; CHECK-NEXT: [[TMP26:%.*]] = load i8, ptr [[TMP25]], align 41404; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i8> [[TMP21]], i8 [[TMP26]], i64 31405; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]1406; CHECK: pred.load.continue6:1407; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i8> [ [[TMP21]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP27]], [[PRED_LOAD_IF5]] ]1408; CHECK-NEXT: [[TMP29:%.*]] = zext <4 x i8> [[TMP28]] to <4 x i32>1409; CHECK-NEXT: [[TMP30]] = add nuw nsw <4 x i32> [[TMP1]], [[TMP29]]1410; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 41411; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)1412; CHECK-NEXT: [[TMP31:%.*]] = icmp eq i32 [[INDEX_NEXT]], 2601413; CHECK-NEXT: br i1 [[TMP31]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]1414; CHECK: middle.block:1415; CHECK-NEXT: br label [[DOTLR_PH:%.*]]1416; CHECK: ._crit_edge:1417; CHECK-NEXT: [[TMP32:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP30]], <4 x i32> [[VEC_PHI]]1418; CHECK-NEXT: [[TMP33:%.*]] = trunc <4 x i32> [[TMP32]] to <4 x i8>1419; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = call i8 @llvm.vector.reduce.add.v4i8(<4 x i8> [[TMP33]])1420; CHECK-NEXT: ret i8 [[SUM_0_LCSSA]]1421;1422entry:1423 br label %.lr.ph1424 1425.lr.ph: ; preds = %entry, %.lr.ph1426 %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]1427 %sum.02p = phi i32 [ %l9, %.lr.ph ], [ 255, %entry ]1428 %sum.02 = and i32 %sum.02p, 2551429 %l2 = getelementptr inbounds i8, ptr %A, i32 %indvars.iv1430 %l3 = load i8, ptr %l2, align 41431 %l3e = zext i8 %l3 to i321432 %l9 = add i32 %sum.02, %l3e1433 %indvars.iv.next = add i32 %indvars.iv, 11434 %exitcond = icmp eq i32 %indvars.iv.next, 2571435 br i1 %exitcond, label %._crit_edge, label %.lr.ph1436 1437._crit_edge: ; preds = %.lr.ph1438 %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ]1439 %ret = trunc i32 %sum.0.lcssa to i81440 ret i8 %ret1441}1442 1443 1444define i8 @reduction_and_trunc(ptr noalias nocapture %A) {1445; CHECK-LABEL: @reduction_and_trunc(1446; CHECK-NEXT: entry:1447; CHECK-NEXT: br label [[VECTOR_PH:%.*]]1448; CHECK: vector.ph:1449; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]1450; CHECK: vector.body:1451; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]1452; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]1453; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ <i32 255, i32 -1, i32 -1, i32 -1>, [[VECTOR_PH]] ], [ [[TMP29:%.*]], [[PRED_LOAD_CONTINUE6]] ]1454; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)1455; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 01456; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]1457; CHECK: pred.load.if:1458; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[INDEX]] to i641459; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i64 [[TMP2]]1460; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP3]], align 41461; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x i8> poison, i8 [[TMP4]], i64 01462; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]1463; CHECK: pred.load.continue:1464; CHECK-NEXT: [[TMP6:%.*]] = phi <4 x i8> [ poison, [[VECTOR_BODY]] ], [ [[TMP5]], [[PRED_LOAD_IF]] ]1465; CHECK-NEXT: [[TMP7:%.*]] = extractelement <4 x i1> [[TMP0]], i64 11466; CHECK-NEXT: br i1 [[TMP7]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]1467; CHECK: pred.load.if1:1468; CHECK-NEXT: [[TMP8:%.*]] = sext i32 [[INDEX]] to i641469; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP8]]1470; CHECK-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[TMP9]], i64 11471; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP10]], align 41472; CHECK-NEXT: [[TMP12:%.*]] = insertelement <4 x i8> [[TMP6]], i8 [[TMP11]], i64 11473; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]1474; CHECK: pred.load.continue2:1475; CHECK-NEXT: [[TMP13:%.*]] = phi <4 x i8> [ [[TMP6]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP12]], [[PRED_LOAD_IF1]] ]1476; CHECK-NEXT: [[TMP14:%.*]] = extractelement <4 x i1> [[TMP0]], i64 21477; CHECK-NEXT: br i1 [[TMP14]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]1478; CHECK: pred.load.if3:1479; CHECK-NEXT: [[TMP15:%.*]] = sext i32 [[INDEX]] to i641480; CHECK-NEXT: [[TMP16:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP15]]1481; CHECK-NEXT: [[TMP17:%.*]] = getelementptr i8, ptr [[TMP16]], i64 21482; CHECK-NEXT: [[TMP18:%.*]] = load i8, ptr [[TMP17]], align 41483; CHECK-NEXT: [[TMP19:%.*]] = insertelement <4 x i8> [[TMP13]], i8 [[TMP18]], i64 21484; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]1485; CHECK: pred.load.continue4:1486; CHECK-NEXT: [[TMP20:%.*]] = phi <4 x i8> [ [[TMP13]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP19]], [[PRED_LOAD_IF3]] ]1487; CHECK-NEXT: [[TMP21:%.*]] = extractelement <4 x i1> [[TMP0]], i64 31488; CHECK-NEXT: br i1 [[TMP21]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]1489; CHECK: pred.load.if5:1490; CHECK-NEXT: [[TMP22:%.*]] = sext i32 [[INDEX]] to i641491; CHECK-NEXT: [[TMP23:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP22]]1492; CHECK-NEXT: [[TMP24:%.*]] = getelementptr i8, ptr [[TMP23]], i64 31493; CHECK-NEXT: [[TMP25:%.*]] = load i8, ptr [[TMP24]], align 41494; CHECK-NEXT: [[TMP26:%.*]] = insertelement <4 x i8> [[TMP20]], i8 [[TMP25]], i64 31495; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]1496; CHECK: pred.load.continue6:1497; CHECK-NEXT: [[TMP27:%.*]] = phi <4 x i8> [ [[TMP20]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP26]], [[PRED_LOAD_IF5]] ]1498; CHECK-NEXT: [[TMP28:%.*]] = zext <4 x i8> [[TMP27]] to <4 x i32>1499; CHECK-NEXT: [[TMP29]] = and <4 x i32> [[VEC_PHI]], [[TMP28]]1500; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 41501; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)1502; CHECK-NEXT: [[TMP30:%.*]] = icmp eq i32 [[INDEX_NEXT]], 2601503; CHECK-NEXT: br i1 [[TMP30]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]1504; CHECK: middle.block:1505; CHECK-NEXT: br label [[DOTLR_PH:%.*]]1506; CHECK: ._crit_edge:1507; CHECK-NEXT: [[TMP31:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP29]], <4 x i32> [[VEC_PHI]]1508; CHECK-NEXT: [[TMP32:%.*]] = trunc <4 x i32> [[TMP31]] to <4 x i8>1509; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = call i8 @llvm.vector.reduce.and.v4i8(<4 x i8> [[TMP32]])1510; CHECK-NEXT: ret i8 [[SUM_0_LCSSA]]1511;1512entry:1513 br label %.lr.ph1514 1515.lr.ph: ; preds = %entry, %.lr.ph1516 %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]1517 %sum.02p = phi i32 [ %l9, %.lr.ph ], [ 255, %entry ]1518 %sum.02 = and i32 %sum.02p, 2551519 %l2 = getelementptr inbounds i8, ptr %A, i32 %indvars.iv1520 %l3 = load i8, ptr %l2, align 41521 %l3e = zext i8 %l3 to i321522 %l9 = and i32 %sum.02, %l3e1523 %indvars.iv.next = add i32 %indvars.iv, 11524 %exitcond = icmp eq i32 %indvars.iv.next, 2571525 br i1 %exitcond, label %._crit_edge, label %.lr.ph1526 1527._crit_edge: ; preds = %.lr.ph1528 %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ]1529 %ret = trunc i32 %sum.0.lcssa to i81530 ret i8 %ret1531}1532