brintos

brintos / llvm-project-archived public Read only

0
0
Text · 94.2 KiB · 1b9dcad Raw
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