18f2cacaeSDavid Green; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 279b1b4a5SSanjay Patel; RUN: opt < %s -loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -prefer-inloop-reductions -prefer-predicate-over-epilogue=predicate-else-scalar-epilogue -dce -instcombine -S | FileCheck %s 38f2cacaeSDavid Green 48f2cacaeSDavid Greentarget 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" 58f2cacaeSDavid Green 68f2cacaeSDavid Greendefine i32 @reduction_sum_single(i32* noalias nocapture %A) { 78f2cacaeSDavid Green; CHECK-LABEL: @reduction_sum_single( 88f2cacaeSDavid Green; CHECK-NEXT: entry: 98f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 108f2cacaeSDavid Green; CHECK: vector.ph: 118f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 128f2cacaeSDavid Green; CHECK: vector.body: 138f2cacaeSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ] 148f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ] 15be6e8e50SDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP26:%.*]], [[PRED_LOAD_CONTINUE6]] ] 168f2cacaeSDavid Green; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i64> [[VEC_IND]], <i64 257, i64 257, i64 257, i64 257> 17e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 188f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 198f2cacaeSDavid Green; CHECK: pred.load.if: 208f2cacaeSDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 218f2cacaeSDavid Green; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4 22e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0 238f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 248f2cacaeSDavid Green; CHECK: pred.load.continue: 254a8e6ed2SJuneyoung Lee; CHECK-NEXT: [[TMP5:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ] 26e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 278f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]] 288f2cacaeSDavid Green; CHECK: pred.load.if1: 298f2cacaeSDavid Green; CHECK-NEXT: [[TMP7:%.*]] = or i64 [[INDEX]], 1 308f2cacaeSDavid Green; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP7]] 318f2cacaeSDavid Green; CHECK-NEXT: [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4 32e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i64 1 338f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] 348f2cacaeSDavid Green; CHECK: pred.load.continue2: 358f2cacaeSDavid Green; CHECK-NEXT: [[TMP11:%.*]] = phi <4 x i32> [ [[TMP5]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP10]], [[PRED_LOAD_IF1]] ] 36e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 378f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 388f2cacaeSDavid Green; CHECK: pred.load.if3: 398f2cacaeSDavid Green; CHECK-NEXT: [[TMP13:%.*]] = or i64 [[INDEX]], 2 408f2cacaeSDavid Green; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP13]] 418f2cacaeSDavid Green; CHECK-NEXT: [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4 42e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP16:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP15]], i64 2 438f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 448f2cacaeSDavid Green; CHECK: pred.load.continue4: 458f2cacaeSDavid Green; CHECK-NEXT: [[TMP17:%.*]] = phi <4 x i32> [ [[TMP11]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP16]], [[PRED_LOAD_IF3]] ] 46e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP18:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 478f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP18]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]] 488f2cacaeSDavid Green; CHECK: pred.load.if5: 498f2cacaeSDavid Green; CHECK-NEXT: [[TMP19:%.*]] = or i64 [[INDEX]], 3 508f2cacaeSDavid Green; CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP19]] 518f2cacaeSDavid Green; CHECK-NEXT: [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4 52e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP22:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP21]], i64 3 538f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 548f2cacaeSDavid Green; CHECK: pred.load.continue6: 558f2cacaeSDavid Green; CHECK-NEXT: [[TMP23:%.*]] = phi <4 x i32> [ [[TMP17]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP22]], [[PRED_LOAD_IF5]] ] 56be6e8e50SDavid Green; CHECK-NEXT: [[TMP24:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP23]], <4 x i32> zeroinitializer 57be6e8e50SDavid Green; CHECK-NEXT: [[TMP25:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP24]]) 58be6e8e50SDavid Green; CHECK-NEXT: [[TMP26]] = add i32 [[TMP25]], [[VEC_PHI]] 598f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 608f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], <i64 4, i64 4, i64 4, i64 4> 61be6e8e50SDavid Green; CHECK-NEXT: [[TMP27:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260 62e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP27]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] 638f2cacaeSDavid Green; CHECK: middle.block: 648f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 658f2cacaeSDavid Green; CHECK: scalar.ph: 668f2cacaeSDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 678f2cacaeSDavid Green; CHECK: .lr.ph: 68*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP2:![0-9]+]] 698f2cacaeSDavid Green; CHECK: ._crit_edge: 70*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP26]], [[MIDDLE_BLOCK]] ] 718f2cacaeSDavid Green; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]] 728f2cacaeSDavid Green; 738f2cacaeSDavid Greenentry: 748f2cacaeSDavid Green br label %.lr.ph 758f2cacaeSDavid Green 768f2cacaeSDavid Green.lr.ph: ; preds = %entry, %.lr.ph 778f2cacaeSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 788f2cacaeSDavid Green %sum.02 = phi i32 [ %l7, %.lr.ph ], [ 0, %entry ] 798f2cacaeSDavid Green %l2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 808f2cacaeSDavid Green %l3 = load i32, i32* %l2, align 4 818f2cacaeSDavid Green %l7 = add i32 %sum.02, %l3 828f2cacaeSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 838f2cacaeSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 848f2cacaeSDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 257 858f2cacaeSDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 868f2cacaeSDavid Green 878f2cacaeSDavid Green._crit_edge: ; preds = %.lr.ph 888f2cacaeSDavid Green %sum.0.lcssa = phi i32 [ %l7, %.lr.ph ] 898f2cacaeSDavid Green ret i32 %sum.0.lcssa 908f2cacaeSDavid Green} 918f2cacaeSDavid Green 928f2cacaeSDavid Greendefine i32 @reduction_sum(i32* noalias nocapture %A, i32* noalias nocapture %B) { 938f2cacaeSDavid Green; CHECK-LABEL: @reduction_sum( 948f2cacaeSDavid Green; CHECK-NEXT: entry: 958f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 968f2cacaeSDavid Green; CHECK: vector.ph: 978f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 988f2cacaeSDavid Green; CHECK: vector.body: 99c45045bfSFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE8:%.*]] ] 100c45045bfSFlorian Hahn; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE8]] ] 101c45045bfSFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP48:%.*]], [[PRED_LOAD_CONTINUE8]] ] 102c45045bfSFlorian Hahn; CHECK-NEXT: [[VEC_IND1:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT2:%.*]], [[PRED_LOAD_CONTINUE8]] ] 10380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i64> [[VEC_IND]], <i64 257, i64 257, i64 257, i64 257> 104e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 10580aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 1068f2cacaeSDavid Green; CHECK: pred.load.if: 10780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 10880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4 109e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0 11080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 1118f2cacaeSDavid Green; CHECK-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4 112e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0 1138f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 1148f2cacaeSDavid Green; CHECK: pred.load.continue: 11580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ] 11680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ] 117e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 118c45045bfSFlorian Hahn; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 119c45045bfSFlorian Hahn; CHECK: pred.load.if3: 12080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = or i64 [[INDEX]], 1 12180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP11]] 12280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4 123e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1 12480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP11]] 12580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4 126e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1 127c45045bfSFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 128c45045bfSFlorian Hahn; CHECK: pred.load.continue4: 129c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF3]] ] 130c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF3]] ] 131e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 132c45045bfSFlorian Hahn; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6:%.*]] 133c45045bfSFlorian Hahn; CHECK: pred.load.if5: 13480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP21:%.*]] = or i64 [[INDEX]], 2 13580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP21]] 13680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4 137e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2 13880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP21]] 13980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4 140e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2 141c45045bfSFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 142c45045bfSFlorian Hahn; CHECK: pred.load.continue6: 143c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP24]], [[PRED_LOAD_IF5]] ] 144c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP27]], [[PRED_LOAD_IF5]] ] 145e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 146c45045bfSFlorian Hahn; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF7:%.*]], label [[PRED_LOAD_CONTINUE8]] 147c45045bfSFlorian Hahn; CHECK: pred.load.if7: 14880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP31:%.*]] = or i64 [[INDEX]], 3 14980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP31]] 15080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4 151e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3 15280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP31]] 15380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4 154e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3 155c45045bfSFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE8]] 156c45045bfSFlorian Hahn; CHECK: pred.load.continue8: 157c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE6]] ], [ [[TMP34]], [[PRED_LOAD_IF7]] ] 158c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE6]] ], [ [[TMP37]], [[PRED_LOAD_IF7]] ] 159c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP40:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[VEC_IND1]], <4 x i32> zeroinitializer 16080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP41:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP40]]) 16180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP42:%.*]] = add i32 [[TMP41]], [[VEC_PHI]] 16280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP43:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP38]], <4 x i32> zeroinitializer 16380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP44:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP43]]) 16480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP45:%.*]] = add i32 [[TMP44]], [[TMP42]] 16580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP46:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP39]], <4 x i32> zeroinitializer 16680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP47:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP46]]) 16780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP48]] = add i32 [[TMP47]], [[TMP45]] 1688f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 1698f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], <i64 4, i64 4, i64 4, i64 4> 170c45045bfSFlorian Hahn; CHECK-NEXT: [[VEC_IND_NEXT2]] = add <4 x i32> [[VEC_IND1]], <i32 4, i32 4, i32 4, i32 4> 17180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP49:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260 17280aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP49]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]] 1738f2cacaeSDavid Green; CHECK: middle.block: 1748f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 1758f2cacaeSDavid Green; CHECK: scalar.ph: 1768f2cacaeSDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 1778f2cacaeSDavid Green; CHECK: .lr.ph: 178*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP5:![0-9]+]] 1798f2cacaeSDavid Green; CHECK: ._crit_edge: 180*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP48]], [[MIDDLE_BLOCK]] ] 1818f2cacaeSDavid Green; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]] 1828f2cacaeSDavid Green; 1838f2cacaeSDavid Greenentry: 1848f2cacaeSDavid Green br label %.lr.ph 1858f2cacaeSDavid Green 1868f2cacaeSDavid Green.lr.ph: ; preds = %entry, %.lr.ph 1878f2cacaeSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 1888f2cacaeSDavid Green %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ] 1898f2cacaeSDavid Green %l2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 1908f2cacaeSDavid Green %l3 = load i32, i32* %l2, align 4 1918f2cacaeSDavid Green %l4 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 1928f2cacaeSDavid Green %l5 = load i32, i32* %l4, align 4 1938f2cacaeSDavid Green %l6 = trunc i64 %indvars.iv to i32 1948f2cacaeSDavid Green %l7 = add i32 %sum.02, %l6 1958f2cacaeSDavid Green %l8 = add i32 %l7, %l3 1968f2cacaeSDavid Green %l9 = add i32 %l8, %l5 1978f2cacaeSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 1988f2cacaeSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1998f2cacaeSDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 257 2008f2cacaeSDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 2018f2cacaeSDavid Green 2028f2cacaeSDavid Green._crit_edge: ; preds = %.lr.ph 2038f2cacaeSDavid Green %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ] 2048f2cacaeSDavid Green ret i32 %sum.0.lcssa 2058f2cacaeSDavid Green} 2068f2cacaeSDavid Green 2078f2cacaeSDavid Greendefine i32 @reduction_sum_const(i32* noalias nocapture %A) { 2088f2cacaeSDavid Green; CHECK-LABEL: @reduction_sum_const( 2098f2cacaeSDavid Green; CHECK-NEXT: entry: 2108f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 2118f2cacaeSDavid Green; CHECK: vector.ph: 2128f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 2138f2cacaeSDavid Green; CHECK: vector.body: 2148f2cacaeSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ] 2158f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ] 216be6e8e50SDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP29:%.*]], [[PRED_LOAD_CONTINUE6]] ] 2178f2cacaeSDavid Green; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i64> [[VEC_IND]], <i64 257, i64 257, i64 257, i64 257> 218e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 2198f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 2208f2cacaeSDavid Green; CHECK: pred.load.if: 2218f2cacaeSDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 2228f2cacaeSDavid Green; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4 223e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0 2248f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 2258f2cacaeSDavid Green; CHECK: pred.load.continue: 2264a8e6ed2SJuneyoung Lee; CHECK-NEXT: [[TMP5:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ] 227e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 2288f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]] 2298f2cacaeSDavid Green; CHECK: pred.load.if1: 2308f2cacaeSDavid Green; CHECK-NEXT: [[TMP7:%.*]] = or i64 [[INDEX]], 1 2318f2cacaeSDavid Green; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP7]] 2328f2cacaeSDavid Green; CHECK-NEXT: [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4 233e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i64 1 2348f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] 2358f2cacaeSDavid Green; CHECK: pred.load.continue2: 2368f2cacaeSDavid Green; CHECK-NEXT: [[TMP11:%.*]] = phi <4 x i32> [ [[TMP5]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP10]], [[PRED_LOAD_IF1]] ] 237e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 2388f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 2398f2cacaeSDavid Green; CHECK: pred.load.if3: 2408f2cacaeSDavid Green; CHECK-NEXT: [[TMP13:%.*]] = or i64 [[INDEX]], 2 2418f2cacaeSDavid Green; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP13]] 2428f2cacaeSDavid Green; CHECK-NEXT: [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4 243e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP16:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP15]], i64 2 2448f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 2458f2cacaeSDavid Green; CHECK: pred.load.continue4: 2468f2cacaeSDavid Green; CHECK-NEXT: [[TMP17:%.*]] = phi <4 x i32> [ [[TMP11]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP16]], [[PRED_LOAD_IF3]] ] 247e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP18:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 2488f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP18]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]] 2498f2cacaeSDavid Green; CHECK: pred.load.if5: 2508f2cacaeSDavid Green; CHECK-NEXT: [[TMP19:%.*]] = or i64 [[INDEX]], 3 2518f2cacaeSDavid Green; CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP19]] 2528f2cacaeSDavid Green; CHECK-NEXT: [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4 253e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP22:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP21]], i64 3 2548f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 2558f2cacaeSDavid Green; CHECK: pred.load.continue6: 2568f2cacaeSDavid Green; CHECK-NEXT: [[TMP23:%.*]] = phi <4 x i32> [ [[TMP17]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP22]], [[PRED_LOAD_IF5]] ] 257be6e8e50SDavid Green; CHECK-NEXT: [[TMP24:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP23]], <4 x i32> zeroinitializer 258be6e8e50SDavid Green; CHECK-NEXT: [[TMP25:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP24]]) 259be6e8e50SDavid Green; CHECK-NEXT: [[TMP26:%.*]] = add i32 [[TMP25]], [[VEC_PHI]] 260be6e8e50SDavid Green; CHECK-NEXT: [[TMP27:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> <i32 3, i32 3, i32 3, i32 3>, <4 x i32> zeroinitializer 261be6e8e50SDavid Green; CHECK-NEXT: [[TMP28:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP27]]) 262be6e8e50SDavid Green; CHECK-NEXT: [[TMP29]] = add i32 [[TMP28]], [[TMP26]] 2638f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 2648f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], <i64 4, i64 4, i64 4, i64 4> 265be6e8e50SDavid Green; CHECK-NEXT: [[TMP30:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260 266e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP30]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]] 2678f2cacaeSDavid Green; CHECK: middle.block: 2688f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 2698f2cacaeSDavid Green; CHECK: scalar.ph: 2708f2cacaeSDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 2718f2cacaeSDavid Green; CHECK: .lr.ph: 272*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP7:![0-9]+]] 2738f2cacaeSDavid Green; CHECK: ._crit_edge: 274*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP29]], [[MIDDLE_BLOCK]] ] 2758f2cacaeSDavid Green; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]] 2768f2cacaeSDavid Green; 2778f2cacaeSDavid Greenentry: 2788f2cacaeSDavid Green br label %.lr.ph 2798f2cacaeSDavid Green 2808f2cacaeSDavid Green.lr.ph: ; preds = %entry, %.lr.ph 2818f2cacaeSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 2828f2cacaeSDavid Green %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ] 2838f2cacaeSDavid Green %l2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 2848f2cacaeSDavid Green %l3 = load i32, i32* %l2, align 4 2858f2cacaeSDavid Green %l7 = add i32 %sum.02, %l3 2868f2cacaeSDavid Green %l9 = add i32 %l7, 3 2878f2cacaeSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 2888f2cacaeSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 2898f2cacaeSDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 257 2908f2cacaeSDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 2918f2cacaeSDavid Green 2928f2cacaeSDavid Green._crit_edge: ; preds = %.lr.ph 2938f2cacaeSDavid Green %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ] 2948f2cacaeSDavid Green ret i32 %sum.0.lcssa 2958f2cacaeSDavid Green} 2968f2cacaeSDavid Green 2978f2cacaeSDavid Greendefine i32 @reduction_prod(i32* noalias nocapture %A, i32* noalias nocapture %B) { 2988f2cacaeSDavid Green; CHECK-LABEL: @reduction_prod( 2998f2cacaeSDavid Green; CHECK-NEXT: entry: 3008f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 3018f2cacaeSDavid Green; CHECK: vector.ph: 3028f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 3038f2cacaeSDavid Green; CHECK: vector.body: 304c45045bfSFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE8:%.*]] ] 305c45045bfSFlorian Hahn; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE8]] ] 306c45045bfSFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 1, [[VECTOR_PH]] ], [ [[TMP48:%.*]], [[PRED_LOAD_CONTINUE8]] ] 307c45045bfSFlorian Hahn; CHECK-NEXT: [[VEC_IND1:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT2:%.*]], [[PRED_LOAD_CONTINUE8]] ] 30880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i64> [[VEC_IND]], <i64 257, i64 257, i64 257, i64 257> 309e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 31080aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 3118f2cacaeSDavid Green; CHECK: pred.load.if: 31280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 31380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4 314e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0 31580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 3168f2cacaeSDavid Green; CHECK-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4 317e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0 3188f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 3198f2cacaeSDavid Green; CHECK: pred.load.continue: 32080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ] 32180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ] 322e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 323c45045bfSFlorian Hahn; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 324c45045bfSFlorian Hahn; CHECK: pred.load.if3: 32580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = or i64 [[INDEX]], 1 32680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP11]] 32780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4 328e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1 32980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP11]] 33080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4 331e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1 332c45045bfSFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 333c45045bfSFlorian Hahn; CHECK: pred.load.continue4: 334c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF3]] ] 335c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF3]] ] 336e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 337c45045bfSFlorian Hahn; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6:%.*]] 338c45045bfSFlorian Hahn; CHECK: pred.load.if5: 33980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP21:%.*]] = or i64 [[INDEX]], 2 34080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP21]] 34180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4 342e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2 34380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP21]] 34480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4 345e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2 346c45045bfSFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 347c45045bfSFlorian Hahn; CHECK: pred.load.continue6: 348c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP24]], [[PRED_LOAD_IF5]] ] 349c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP27]], [[PRED_LOAD_IF5]] ] 350e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 351c45045bfSFlorian Hahn; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF7:%.*]], label [[PRED_LOAD_CONTINUE8]] 352c45045bfSFlorian Hahn; CHECK: pred.load.if7: 35380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP31:%.*]] = or i64 [[INDEX]], 3 35480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP31]] 35580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4 356e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3 35780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP31]] 35880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4 359e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3 360c45045bfSFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE8]] 361c45045bfSFlorian Hahn; CHECK: pred.load.continue8: 362c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE6]] ], [ [[TMP34]], [[PRED_LOAD_IF7]] ] 363c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE6]] ], [ [[TMP37]], [[PRED_LOAD_IF7]] ] 364c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP40:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[VEC_IND1]], <4 x i32> <i32 1, i32 1, i32 1, i32 1> 36580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP41:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[TMP40]]) 36680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP42:%.*]] = mul i32 [[TMP41]], [[VEC_PHI]] 36780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP43:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP38]], <4 x i32> <i32 1, i32 1, i32 1, i32 1> 36880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP44:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[TMP43]]) 36980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP45:%.*]] = mul i32 [[TMP44]], [[TMP42]] 37080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP46:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP39]], <4 x i32> <i32 1, i32 1, i32 1, i32 1> 37180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP47:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[TMP46]]) 37280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP48]] = mul i32 [[TMP47]], [[TMP45]] 3738f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 3748f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], <i64 4, i64 4, i64 4, i64 4> 375c45045bfSFlorian Hahn; CHECK-NEXT: [[VEC_IND_NEXT2]] = add <4 x i32> [[VEC_IND1]], <i32 4, i32 4, i32 4, i32 4> 37680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP49:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260 37780aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP49]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]] 3788f2cacaeSDavid Green; CHECK: middle.block: 3798f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 3808f2cacaeSDavid Green; CHECK: scalar.ph: 3818f2cacaeSDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 3828f2cacaeSDavid Green; CHECK: .lr.ph: 383*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP9:![0-9]+]] 3848f2cacaeSDavid Green; CHECK: ._crit_edge: 385*9df0b254SNuno Lopes; CHECK-NEXT: [[PROD_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP48]], [[MIDDLE_BLOCK]] ] 3868f2cacaeSDavid Green; CHECK-NEXT: ret i32 [[PROD_0_LCSSA]] 3878f2cacaeSDavid Green; 3888f2cacaeSDavid Greenentry: 3898f2cacaeSDavid Green br label %.lr.ph 3908f2cacaeSDavid Green 3918f2cacaeSDavid Green.lr.ph: ; preds = %entry, %.lr.ph 3928f2cacaeSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 3938f2cacaeSDavid Green %prod.02 = phi i32 [ %l9, %.lr.ph ], [ 1, %entry ] 3948f2cacaeSDavid Green %l2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 3958f2cacaeSDavid Green %l3 = load i32, i32* %l2, align 4 3968f2cacaeSDavid Green %l4 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 3978f2cacaeSDavid Green %l5 = load i32, i32* %l4, align 4 3988f2cacaeSDavid Green %l6 = trunc i64 %indvars.iv to i32 3998f2cacaeSDavid Green %l7 = mul i32 %prod.02, %l6 4008f2cacaeSDavid Green %l8 = mul i32 %l7, %l3 4018f2cacaeSDavid Green %l9 = mul i32 %l8, %l5 4028f2cacaeSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 4038f2cacaeSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 4048f2cacaeSDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 257 4058f2cacaeSDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 4068f2cacaeSDavid Green 4078f2cacaeSDavid Green._crit_edge: ; preds = %.lr.ph 4088f2cacaeSDavid Green %prod.0.lcssa = phi i32 [ %l9, %.lr.ph ] 4098f2cacaeSDavid Green ret i32 %prod.0.lcssa 4108f2cacaeSDavid Green} 4118f2cacaeSDavid Green 4128f2cacaeSDavid Greendefine i32 @reduction_mix(i32* noalias nocapture %A, i32* noalias nocapture %B) { 4138f2cacaeSDavid Green; CHECK-LABEL: @reduction_mix( 4148f2cacaeSDavid Green; CHECK-NEXT: entry: 4158f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 4168f2cacaeSDavid Green; CHECK: vector.ph: 4178f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 4188f2cacaeSDavid Green; CHECK: vector.body: 419c45045bfSFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE8:%.*]] ] 420c45045bfSFlorian Hahn; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE8]] ] 421c45045bfSFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP46:%.*]], [[PRED_LOAD_CONTINUE8]] ] 422c45045bfSFlorian Hahn; CHECK-NEXT: [[VEC_IND1:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT2:%.*]], [[PRED_LOAD_CONTINUE8]] ] 42380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i64> [[VEC_IND]], <i64 257, i64 257, i64 257, i64 257> 424e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 42580aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 4268f2cacaeSDavid Green; CHECK: pred.load.if: 42780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 42880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4 429e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0 43080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 4318f2cacaeSDavid Green; CHECK-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4 432e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0 4338f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 4348f2cacaeSDavid Green; CHECK: pred.load.continue: 43580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ] 43680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ] 437e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 438c45045bfSFlorian Hahn; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 439c45045bfSFlorian Hahn; CHECK: pred.load.if3: 44080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = or i64 [[INDEX]], 1 44180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP11]] 44280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4 443e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1 44480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP11]] 44580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4 446e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1 447c45045bfSFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 448c45045bfSFlorian Hahn; CHECK: pred.load.continue4: 449c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF3]] ] 450c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF3]] ] 451e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 452c45045bfSFlorian Hahn; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6:%.*]] 453c45045bfSFlorian Hahn; CHECK: pred.load.if5: 45480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP21:%.*]] = or i64 [[INDEX]], 2 45580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP21]] 45680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4 457e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2 45880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP21]] 45980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4 460e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2 461c45045bfSFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 462c45045bfSFlorian Hahn; CHECK: pred.load.continue6: 463c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP24]], [[PRED_LOAD_IF5]] ] 464c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP27]], [[PRED_LOAD_IF5]] ] 465e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 466c45045bfSFlorian Hahn; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF7:%.*]], label [[PRED_LOAD_CONTINUE8]] 467c45045bfSFlorian Hahn; CHECK: pred.load.if7: 46880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP31:%.*]] = or i64 [[INDEX]], 3 46980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP31]] 47080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4 471e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3 47280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP31]] 47380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4 474e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3 475c45045bfSFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE8]] 476c45045bfSFlorian Hahn; CHECK: pred.load.continue8: 477c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE6]] ], [ [[TMP34]], [[PRED_LOAD_IF7]] ] 478c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE6]] ], [ [[TMP37]], [[PRED_LOAD_IF7]] ] 47980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP40:%.*]] = mul nsw <4 x i32> [[TMP39]], [[TMP38]] 480c45045bfSFlorian Hahn; CHECK-NEXT: [[TMP41:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[VEC_IND1]], <4 x i32> zeroinitializer 48180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP42:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP41]]) 48280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP43:%.*]] = add i32 [[TMP42]], [[VEC_PHI]] 48380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP44:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP40]], <4 x i32> zeroinitializer 48480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP45:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP44]]) 48580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP46]] = add i32 [[TMP45]], [[TMP43]] 4868f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 4878f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], <i64 4, i64 4, i64 4, i64 4> 488c45045bfSFlorian Hahn; CHECK-NEXT: [[VEC_IND_NEXT2]] = add <4 x i32> [[VEC_IND1]], <i32 4, i32 4, i32 4, i32 4> 48980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP47:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260 49080aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP47]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]] 4918f2cacaeSDavid Green; CHECK: middle.block: 4928f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 4938f2cacaeSDavid Green; CHECK: scalar.ph: 4948f2cacaeSDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 4958f2cacaeSDavid Green; CHECK: .lr.ph: 496*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP11:![0-9]+]] 4978f2cacaeSDavid Green; CHECK: ._crit_edge: 498*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP46]], [[MIDDLE_BLOCK]] ] 4998f2cacaeSDavid Green; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]] 5008f2cacaeSDavid Green; 5018f2cacaeSDavid Greenentry: 5028f2cacaeSDavid Green br label %.lr.ph 5038f2cacaeSDavid Green 5048f2cacaeSDavid Green.lr.ph: ; preds = %entry, %.lr.ph 5058f2cacaeSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 5068f2cacaeSDavid Green %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ] 5078f2cacaeSDavid Green %l2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 5088f2cacaeSDavid Green %l3 = load i32, i32* %l2, align 4 5098f2cacaeSDavid Green %l4 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 5108f2cacaeSDavid Green %l5 = load i32, i32* %l4, align 4 5118f2cacaeSDavid Green %l6 = mul nsw i32 %l5, %l3 5128f2cacaeSDavid Green %l7 = trunc i64 %indvars.iv to i32 5138f2cacaeSDavid Green %l8 = add i32 %sum.02, %l7 5148f2cacaeSDavid Green %l9 = add i32 %l8, %l6 5158f2cacaeSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 5168f2cacaeSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 5178f2cacaeSDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 257 5188f2cacaeSDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 5198f2cacaeSDavid Green 5208f2cacaeSDavid Green._crit_edge: ; preds = %.lr.ph 5218f2cacaeSDavid Green %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ] 5228f2cacaeSDavid Green ret i32 %sum.0.lcssa 5238f2cacaeSDavid Green} 5248f2cacaeSDavid Green 5258f2cacaeSDavid Greendefine i32 @reduction_mul(i32* noalias nocapture %A, i32* noalias nocapture %B) { 5268f2cacaeSDavid Green; CHECK-LABEL: @reduction_mul( 5278f2cacaeSDavid Green; CHECK-NEXT: entry: 5288f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 5298f2cacaeSDavid Green; CHECK: vector.ph: 5308f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 5318f2cacaeSDavid Green; CHECK: vector.body: 53280aa7e14SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ] 53380aa7e14SFlorian Hahn; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ] 53480aa7e14SFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 19, [[VECTOR_PH]] ], [ [[TMP45:%.*]], [[PRED_LOAD_CONTINUE6]] ] 53580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i64> [[VEC_IND]], <i64 257, i64 257, i64 257, i64 257> 536e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 53780aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 5388f2cacaeSDavid Green; CHECK: pred.load.if: 53980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 54080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4 541e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0 54280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 5438f2cacaeSDavid Green; CHECK-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4 544e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0 5458f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 5468f2cacaeSDavid Green; CHECK: pred.load.continue: 54780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ] 54880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ] 549e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 55080aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]] 5518f2cacaeSDavid Green; CHECK: pred.load.if1: 55280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = or i64 [[INDEX]], 1 55380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP11]] 55480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4 555e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1 55680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP11]] 55780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4 558e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1 5598f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] 5608f2cacaeSDavid Green; CHECK: pred.load.continue2: 56180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ] 56280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ] 563e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 56480aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 5658f2cacaeSDavid Green; CHECK: pred.load.if3: 56680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP21:%.*]] = or i64 [[INDEX]], 2 56780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP21]] 56880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4 569e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2 57080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP21]] 57180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4 572e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2 5738f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 5748f2cacaeSDavid Green; CHECK: pred.load.continue4: 57580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ] 57680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ] 577e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 57880aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]] 5798f2cacaeSDavid Green; CHECK: pred.load.if5: 58080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP31:%.*]] = or i64 [[INDEX]], 3 58180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP31]] 58280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4 583e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3 58480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP31]] 58580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4 586e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3 5878f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 5888f2cacaeSDavid Green; CHECK: pred.load.continue6: 58980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ] 59080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ] 59180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP40:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP38]], <4 x i32> <i32 1, i32 1, i32 1, i32 1> 59280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP41:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[TMP40]]) 59380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP42:%.*]] = mul i32 [[TMP41]], [[VEC_PHI]] 59480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP43:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP39]], <4 x i32> <i32 1, i32 1, i32 1, i32 1> 59580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP44:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[TMP43]]) 59680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP45]] = mul i32 [[TMP44]], [[TMP42]] 5978f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 5988f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], <i64 4, i64 4, i64 4, i64 4> 59980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP46:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260 60080aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP46]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]] 6018f2cacaeSDavid Green; CHECK: middle.block: 6028f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 6038f2cacaeSDavid Green; CHECK: scalar.ph: 6048f2cacaeSDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 6058f2cacaeSDavid Green; CHECK: .lr.ph: 606*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP13:![0-9]+]] 6078f2cacaeSDavid Green; CHECK: ._crit_edge: 608*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP45]], [[MIDDLE_BLOCK]] ] 6098f2cacaeSDavid Green; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]] 6108f2cacaeSDavid Green; 6118f2cacaeSDavid Greenentry: 6128f2cacaeSDavid Green br label %.lr.ph 6138f2cacaeSDavid Green 6148f2cacaeSDavid Green.lr.ph: ; preds = %entry, %.lr.ph 6158f2cacaeSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 6168f2cacaeSDavid Green %sum.02 = phi i32 [ %l7, %.lr.ph ], [ 19, %entry ] 6178f2cacaeSDavid Green %l2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 6188f2cacaeSDavid Green %l3 = load i32, i32* %l2, align 4 6198f2cacaeSDavid Green %l4 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 6208f2cacaeSDavid Green %l5 = load i32, i32* %l4, align 4 6218f2cacaeSDavid Green %l6 = mul i32 %sum.02, %l3 6228f2cacaeSDavid Green %l7 = mul i32 %l6, %l5 6238f2cacaeSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 6248f2cacaeSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 6258f2cacaeSDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 257 6268f2cacaeSDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 6278f2cacaeSDavid Green 6288f2cacaeSDavid Green._crit_edge: ; preds = %.lr.ph 6298f2cacaeSDavid Green %sum.0.lcssa = phi i32 [ %l7, %.lr.ph ] 6308f2cacaeSDavid Green ret i32 %sum.0.lcssa 6318f2cacaeSDavid Green} 6328f2cacaeSDavid Green 6338f2cacaeSDavid Greendefine i32 @reduction_and(i32* nocapture %A, i32* nocapture %B) { 6348f2cacaeSDavid Green; CHECK-LABEL: @reduction_and( 6358f2cacaeSDavid Green; CHECK-NEXT: entry: 6368f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 6378f2cacaeSDavid Green; CHECK: vector.ph: 6388f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 6398f2cacaeSDavid Green; CHECK: vector.body: 64080aa7e14SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ] 64180aa7e14SFlorian Hahn; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ] 64280aa7e14SFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ -1, [[VECTOR_PH]] ], [ [[TMP45:%.*]], [[PRED_LOAD_CONTINUE6]] ] 64380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i64> [[VEC_IND]], <i64 257, i64 257, i64 257, i64 257> 644e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 64580aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 6468f2cacaeSDavid Green; CHECK: pred.load.if: 64780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 64880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4 649e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0 65080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 6518f2cacaeSDavid Green; CHECK-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4 652e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0 6538f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 6548f2cacaeSDavid Green; CHECK: pred.load.continue: 65580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ] 65680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ] 657e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 65880aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]] 6598f2cacaeSDavid Green; CHECK: pred.load.if1: 66080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = or i64 [[INDEX]], 1 66180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP11]] 66280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4 663e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1 66480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP11]] 66580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4 666e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1 6678f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] 6688f2cacaeSDavid Green; CHECK: pred.load.continue2: 66980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ] 67080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ] 671e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 67280aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 6738f2cacaeSDavid Green; CHECK: pred.load.if3: 67480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP21:%.*]] = or i64 [[INDEX]], 2 67580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP21]] 67680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4 677e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2 67880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP21]] 67980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4 680e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2 6818f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 6828f2cacaeSDavid Green; CHECK: pred.load.continue4: 68380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ] 68480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ] 685e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 68680aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]] 6878f2cacaeSDavid Green; CHECK: pred.load.if5: 68880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP31:%.*]] = or i64 [[INDEX]], 3 68980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP31]] 69080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4 691e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3 69280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP31]] 69380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4 694e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3 6958f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 6968f2cacaeSDavid Green; CHECK: pred.load.continue6: 69780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ] 69880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ] 69980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP40:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP38]], <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1> 70080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP41:%.*]] = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> [[TMP40]]) 70180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP42:%.*]] = and i32 [[TMP41]], [[VEC_PHI]] 70280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP43:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP39]], <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1> 70380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP44:%.*]] = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> [[TMP43]]) 70480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP45]] = and i32 [[TMP44]], [[TMP42]] 7058f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 7068f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], <i64 4, i64 4, i64 4, i64 4> 70780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP46:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260 70880aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP46]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]] 7098f2cacaeSDavid Green; CHECK: middle.block: 7108f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 7118f2cacaeSDavid Green; CHECK: scalar.ph: 7128f2cacaeSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 7138f2cacaeSDavid Green; CHECK: for.body: 714*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]] 7158f2cacaeSDavid Green; CHECK: for.end: 716*9df0b254SNuno Lopes; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP45]], [[MIDDLE_BLOCK]] ] 7178f2cacaeSDavid Green; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]] 7188f2cacaeSDavid Green; 7198f2cacaeSDavid Greenentry: 7208f2cacaeSDavid Green br label %for.body 7218f2cacaeSDavid Green 7228f2cacaeSDavid Greenfor.body: ; preds = %entry, %for.body 7238f2cacaeSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 7248f2cacaeSDavid Green %result.08 = phi i32 [ %and, %for.body ], [ -1, %entry ] 7258f2cacaeSDavid Green %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 7268f2cacaeSDavid Green %l0 = load i32, i32* %arrayidx, align 4 7278f2cacaeSDavid Green %arrayidx2 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 7288f2cacaeSDavid Green %l1 = load i32, i32* %arrayidx2, align 4 7298f2cacaeSDavid Green %add = and i32 %result.08, %l0 7308f2cacaeSDavid Green %and = and i32 %add, %l1 7318f2cacaeSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 7328f2cacaeSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 7338f2cacaeSDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 257 7348f2cacaeSDavid Green br i1 %exitcond, label %for.end, label %for.body 7358f2cacaeSDavid Green 7368f2cacaeSDavid Greenfor.end: ; preds = %for.body, %entry 7378f2cacaeSDavid Green %result.0.lcssa = phi i32 [ %and, %for.body ] 7388f2cacaeSDavid Green ret i32 %result.0.lcssa 7398f2cacaeSDavid Green} 7408f2cacaeSDavid Green 7418f2cacaeSDavid Greendefine i32 @reduction_or(i32* nocapture %A, i32* nocapture %B) { 7428f2cacaeSDavid Green; CHECK-LABEL: @reduction_or( 7438f2cacaeSDavid Green; CHECK-NEXT: entry: 7448f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 7458f2cacaeSDavid Green; CHECK: vector.ph: 7468f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 7478f2cacaeSDavid Green; CHECK: vector.body: 74880aa7e14SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ] 74980aa7e14SFlorian Hahn; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ] 75080aa7e14SFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP43:%.*]], [[PRED_LOAD_CONTINUE6]] ] 75180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i64> [[VEC_IND]], <i64 257, i64 257, i64 257, i64 257> 752e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 75380aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 7548f2cacaeSDavid Green; CHECK: pred.load.if: 75580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 75680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4 757e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0 75880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 7598f2cacaeSDavid Green; CHECK-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4 760e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0 7618f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 7628f2cacaeSDavid Green; CHECK: pred.load.continue: 76380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ] 76480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ] 765e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 76680aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]] 7678f2cacaeSDavid Green; CHECK: pred.load.if1: 76880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = or i64 [[INDEX]], 1 76980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP11]] 77080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4 771e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1 77280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP11]] 77380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4 774e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1 7758f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] 7768f2cacaeSDavid Green; CHECK: pred.load.continue2: 77780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ] 77880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ] 779e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 78080aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 7818f2cacaeSDavid Green; CHECK: pred.load.if3: 78280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP21:%.*]] = or i64 [[INDEX]], 2 78380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP21]] 78480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4 785e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2 78680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP21]] 78780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4 788e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2 7898f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 7908f2cacaeSDavid Green; CHECK: pred.load.continue4: 79180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ] 79280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ] 793e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 79480aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]] 7958f2cacaeSDavid Green; CHECK: pred.load.if5: 79680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP31:%.*]] = or i64 [[INDEX]], 3 79780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP31]] 79880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4 799e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3 80080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP31]] 80180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4 802e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3 8038f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 8048f2cacaeSDavid Green; CHECK: pred.load.continue6: 80580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ] 80680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ] 80780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP40:%.*]] = add nsw <4 x i32> [[TMP39]], [[TMP38]] 80880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP41:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP40]], <4 x i32> zeroinitializer 80980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP42:%.*]] = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> [[TMP41]]) 81080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP43]] = or i32 [[TMP42]], [[VEC_PHI]] 8118f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 8128f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], <i64 4, i64 4, i64 4, i64 4> 81380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP44:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260 81480aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP44]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]] 8158f2cacaeSDavid Green; CHECK: middle.block: 8168f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 8178f2cacaeSDavid Green; CHECK: scalar.ph: 8188f2cacaeSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 8198f2cacaeSDavid Green; CHECK: for.body: 820*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]] 8218f2cacaeSDavid Green; CHECK: for.end: 822*9df0b254SNuno Lopes; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP43]], [[MIDDLE_BLOCK]] ] 8238f2cacaeSDavid Green; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]] 8248f2cacaeSDavid Green; 8258f2cacaeSDavid Greenentry: 8268f2cacaeSDavid Green br label %for.body 8278f2cacaeSDavid Green 8288f2cacaeSDavid Greenfor.body: ; preds = %entry, %for.body 8298f2cacaeSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 8308f2cacaeSDavid Green %result.08 = phi i32 [ %or, %for.body ], [ 0, %entry ] 8318f2cacaeSDavid Green %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 8328f2cacaeSDavid Green %l0 = load i32, i32* %arrayidx, align 4 8338f2cacaeSDavid Green %arrayidx2 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 8348f2cacaeSDavid Green %l1 = load i32, i32* %arrayidx2, align 4 8358f2cacaeSDavid Green %add = add nsw i32 %l1, %l0 8368f2cacaeSDavid Green %or = or i32 %add, %result.08 8378f2cacaeSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 8388f2cacaeSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 8398f2cacaeSDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 257 8408f2cacaeSDavid Green br i1 %exitcond, label %for.end, label %for.body 8418f2cacaeSDavid Green 8428f2cacaeSDavid Greenfor.end: ; preds = %for.body, %entry 8438f2cacaeSDavid Green %result.0.lcssa = phi i32 [ %or, %for.body ] 8448f2cacaeSDavid Green ret i32 %result.0.lcssa 8458f2cacaeSDavid Green} 8468f2cacaeSDavid Green 8478f2cacaeSDavid Greendefine i32 @reduction_xor(i32* nocapture %A, i32* nocapture %B) { 8488f2cacaeSDavid Green; CHECK-LABEL: @reduction_xor( 8498f2cacaeSDavid Green; CHECK-NEXT: entry: 8508f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 8518f2cacaeSDavid Green; CHECK: vector.ph: 8528f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 8538f2cacaeSDavid Green; CHECK: vector.body: 85480aa7e14SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ] 85580aa7e14SFlorian Hahn; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ] 85680aa7e14SFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP43:%.*]], [[PRED_LOAD_CONTINUE6]] ] 85780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i64> [[VEC_IND]], <i64 257, i64 257, i64 257, i64 257> 858e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 85980aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 8608f2cacaeSDavid Green; CHECK: pred.load.if: 86180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 86280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4 863e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0 86480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 8658f2cacaeSDavid Green; CHECK-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4 866e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0 8678f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 8688f2cacaeSDavid Green; CHECK: pred.load.continue: 86980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ] 87080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ] 871e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 87280aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]] 8738f2cacaeSDavid Green; CHECK: pred.load.if1: 87480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = or i64 [[INDEX]], 1 87580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP11]] 87680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4 877e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1 87880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP11]] 87980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4 880e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1 8818f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] 8828f2cacaeSDavid Green; CHECK: pred.load.continue2: 88380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ] 88480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ] 885e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 88680aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 8878f2cacaeSDavid Green; CHECK: pred.load.if3: 88880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP21:%.*]] = or i64 [[INDEX]], 2 88980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP21]] 89080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4 891e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2 89280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP21]] 89380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4 894e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2 8958f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 8968f2cacaeSDavid Green; CHECK: pred.load.continue4: 89780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ] 89880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ] 899e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 90080aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]] 9018f2cacaeSDavid Green; CHECK: pred.load.if5: 90280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP31:%.*]] = or i64 [[INDEX]], 3 90380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP31]] 90480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4 905e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3 90680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, i32* [[B]], i64 [[TMP31]] 90780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4 908e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3 9098f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 9108f2cacaeSDavid Green; CHECK: pred.load.continue6: 91180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ] 91280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ] 91380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP40:%.*]] = add nsw <4 x i32> [[TMP39]], [[TMP38]] 91480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP41:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP40]], <4 x i32> zeroinitializer 91580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP42:%.*]] = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> [[TMP41]]) 91680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP43]] = xor i32 [[TMP42]], [[VEC_PHI]] 9178f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 9188f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], <i64 4, i64 4, i64 4, i64 4> 91980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP44:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260 92080aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP44]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]] 9218f2cacaeSDavid Green; CHECK: middle.block: 9228f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 9238f2cacaeSDavid Green; CHECK: scalar.ph: 9248f2cacaeSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 9258f2cacaeSDavid Green; CHECK: for.body: 926*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]] 9278f2cacaeSDavid Green; CHECK: for.end: 928*9df0b254SNuno Lopes; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP43]], [[MIDDLE_BLOCK]] ] 9298f2cacaeSDavid Green; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]] 9308f2cacaeSDavid Green; 9318f2cacaeSDavid Greenentry: 9328f2cacaeSDavid Green br label %for.body 9338f2cacaeSDavid Green 9348f2cacaeSDavid Greenfor.body: ; preds = %entry, %for.body 9358f2cacaeSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 9368f2cacaeSDavid Green %result.08 = phi i32 [ %xor, %for.body ], [ 0, %entry ] 9378f2cacaeSDavid Green %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 9388f2cacaeSDavid Green %l0 = load i32, i32* %arrayidx, align 4 9398f2cacaeSDavid Green %arrayidx2 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 9408f2cacaeSDavid Green %l1 = load i32, i32* %arrayidx2, align 4 9418f2cacaeSDavid Green %add = add nsw i32 %l1, %l0 9428f2cacaeSDavid Green %xor = xor i32 %add, %result.08 9438f2cacaeSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 9448f2cacaeSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 9458f2cacaeSDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 257 9468f2cacaeSDavid Green br i1 %exitcond, label %for.end, label %for.body 9478f2cacaeSDavid Green 9488f2cacaeSDavid Greenfor.end: ; preds = %for.body, %entry 9498f2cacaeSDavid Green %result.0.lcssa = phi i32 [ %xor, %for.body ] 9508f2cacaeSDavid Green ret i32 %result.0.lcssa 9518f2cacaeSDavid Green} 9528f2cacaeSDavid Green 9538f2cacaeSDavid Greendefine float @reduction_fadd(float* nocapture %A, float* nocapture %B) { 9548f2cacaeSDavid Green; CHECK-LABEL: @reduction_fadd( 9558f2cacaeSDavid Green; CHECK-NEXT: entry: 9568f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 9578f2cacaeSDavid Green; CHECK: vector.ph: 9588f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 9598f2cacaeSDavid Green; CHECK: vector.body: 96080aa7e14SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ] 96180aa7e14SFlorian Hahn; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ] 9629cd7c534SHuihui Zhang; CHECK-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, [[VECTOR_PH]] ], [ [[TMP43:%.*]], [[PRED_LOAD_CONTINUE6]] ] 96380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i64> [[VEC_IND]], <i64 257, i64 257, i64 257, i64 257> 964e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 96580aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 9668f2cacaeSDavid Green; CHECK: pred.load.if: 96780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, float* [[A:%.*]], i64 [[INDEX]] 96880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = load float, float* [[TMP2]], align 4 969e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> poison, float [[TMP3]], i64 0 97080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, float* [[B:%.*]], i64 [[INDEX]] 9718f2cacaeSDavid Green; CHECK-NEXT: [[TMP6:%.*]] = load float, float* [[TMP5]], align 4 972e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x float> poison, float [[TMP6]], i64 0 9738f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 9748f2cacaeSDavid Green; CHECK: pred.load.continue: 97580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ] 97680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ] 977e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 97880aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]] 9798f2cacaeSDavid Green; CHECK: pred.load.if1: 98080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = or i64 [[INDEX]], 1 98180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds float, float* [[A]], i64 [[TMP11]] 98280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = load float, float* [[TMP12]], align 4 983e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x float> [[TMP8]], float [[TMP13]], i64 1 98480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds float, float* [[B]], i64 [[TMP11]] 98580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP16:%.*]] = load float, float* [[TMP15]], align 4 986e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x float> [[TMP9]], float [[TMP16]], i64 1 9878f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] 9888f2cacaeSDavid Green; CHECK: pred.load.continue2: 98980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x float> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ] 99080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x float> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ] 991e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 99280aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 9938f2cacaeSDavid Green; CHECK: pred.load.if3: 99480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP21:%.*]] = or i64 [[INDEX]], 2 99580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds float, float* [[A]], i64 [[TMP21]] 99680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP23:%.*]] = load float, float* [[TMP22]], align 4 997e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x float> [[TMP18]], float [[TMP23]], i64 2 99880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds float, float* [[B]], i64 [[TMP21]] 99980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP26:%.*]] = load float, float* [[TMP25]], align 4 1000e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x float> [[TMP19]], float [[TMP26]], i64 2 10018f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 10028f2cacaeSDavid Green; CHECK: pred.load.continue4: 100380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x float> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ] 100480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x float> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ] 1005e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 100680aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]] 10078f2cacaeSDavid Green; CHECK: pred.load.if5: 100880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP31:%.*]] = or i64 [[INDEX]], 3 100980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds float, float* [[A]], i64 [[TMP31]] 101080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP33:%.*]] = load float, float* [[TMP32]], align 4 1011e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x float> [[TMP28]], float [[TMP33]], i64 3 101280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds float, float* [[B]], i64 [[TMP31]] 101380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP36:%.*]] = load float, float* [[TMP35]], align 4 1014e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x float> [[TMP29]], float [[TMP36]], i64 3 10158f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 10168f2cacaeSDavid Green; CHECK: pred.load.continue6: 101780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x float> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ] 101880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x float> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ] 1019dcb8222dSRosie Sumpter; CHECK-NEXT: [[TMP40:%.*]] = select fast <4 x i1> [[TMP0]], <4 x float> [[TMP38]], <4 x float> zeroinitializer 1020dcb8222dSRosie Sumpter; CHECK-NEXT: [[TMP41:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float [[VEC_PHI]], <4 x float> [[TMP40]]) 1021dcb8222dSRosie Sumpter; CHECK-NEXT: [[TMP42:%.*]] = select fast <4 x i1> [[TMP0]], <4 x float> [[TMP39]], <4 x float> zeroinitializer 10229cd7c534SHuihui Zhang; CHECK-NEXT: [[TMP43]] = call fast float @llvm.vector.reduce.fadd.v4f32(float [[TMP41]], <4 x float> [[TMP42]]) 10238f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 10248f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], <i64 4, i64 4, i64 4, i64 4> 1025dcb8222dSRosie Sumpter; CHECK-NEXT: [[TMP44:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260 1026dcb8222dSRosie Sumpter; CHECK-NEXT: br i1 [[TMP44]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]] 10278f2cacaeSDavid Green; CHECK: middle.block: 10288f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 10298f2cacaeSDavid Green; CHECK: scalar.ph: 10308f2cacaeSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 10318f2cacaeSDavid Green; CHECK: for.body: 1032*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]] 10338f2cacaeSDavid Green; CHECK: for.end: 1034*9df0b254SNuno Lopes; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = phi float [ poison, [[FOR_BODY]] ], [ [[TMP43]], [[MIDDLE_BLOCK]] ] 10358f2cacaeSDavid Green; CHECK-NEXT: ret float [[RESULT_0_LCSSA]] 10368f2cacaeSDavid Green; 10378f2cacaeSDavid Greenentry: 10388f2cacaeSDavid Green br label %for.body 10398f2cacaeSDavid Green 10408f2cacaeSDavid Greenfor.body: ; preds = %entry, %for.body 10418f2cacaeSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 10428f2cacaeSDavid Green %result.08 = phi float [ %fadd, %for.body ], [ 0.0, %entry ] 10438f2cacaeSDavid Green %arrayidx = getelementptr inbounds float, float* %A, i64 %indvars.iv 10448f2cacaeSDavid Green %l0 = load float, float* %arrayidx, align 4 10458f2cacaeSDavid Green %arrayidx2 = getelementptr inbounds float, float* %B, i64 %indvars.iv 10468f2cacaeSDavid Green %l1 = load float, float* %arrayidx2, align 4 10478f2cacaeSDavid Green %add = fadd fast float %result.08, %l0 10488f2cacaeSDavid Green %fadd = fadd fast float %add, %l1 10498f2cacaeSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 10508f2cacaeSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 10518f2cacaeSDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 257 10528f2cacaeSDavid Green br i1 %exitcond, label %for.end, label %for.body 10538f2cacaeSDavid Green 10548f2cacaeSDavid Greenfor.end: ; preds = %for.body, %entry 10558f2cacaeSDavid Green %result.0.lcssa = phi float [ %fadd, %for.body ] 10568f2cacaeSDavid Green ret float %result.0.lcssa 10578f2cacaeSDavid Green} 10588f2cacaeSDavid Green 10598f2cacaeSDavid Greendefine float @reduction_fmul(float* nocapture %A, float* nocapture %B) { 10608f2cacaeSDavid Green; CHECK-LABEL: @reduction_fmul( 10618f2cacaeSDavid Green; CHECK-NEXT: entry: 10628f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 10638f2cacaeSDavid Green; CHECK: vector.ph: 10648f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 10658f2cacaeSDavid Green; CHECK: vector.body: 106680aa7e14SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ] 106780aa7e14SFlorian Hahn; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ] 106880aa7e14SFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, [[VECTOR_PH]] ], [ [[TMP45:%.*]], [[PRED_LOAD_CONTINUE6]] ] 106980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i64> [[VEC_IND]], <i64 257, i64 257, i64 257, i64 257> 1070e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 107180aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 10728f2cacaeSDavid Green; CHECK: pred.load.if: 107380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, float* [[A:%.*]], i64 [[INDEX]] 107480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = load float, float* [[TMP2]], align 4 1075e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> poison, float [[TMP3]], i64 0 107680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, float* [[B:%.*]], i64 [[INDEX]] 10778f2cacaeSDavid Green; CHECK-NEXT: [[TMP6:%.*]] = load float, float* [[TMP5]], align 4 1078e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x float> poison, float [[TMP6]], i64 0 10798f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 10808f2cacaeSDavid Green; CHECK: pred.load.continue: 108180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ] 108280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ] 1083e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 108480aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]] 10858f2cacaeSDavid Green; CHECK: pred.load.if1: 108680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = or i64 [[INDEX]], 1 108780aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds float, float* [[A]], i64 [[TMP11]] 108880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = load float, float* [[TMP12]], align 4 1089e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x float> [[TMP8]], float [[TMP13]], i64 1 109080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds float, float* [[B]], i64 [[TMP11]] 109180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP16:%.*]] = load float, float* [[TMP15]], align 4 1092e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x float> [[TMP9]], float [[TMP16]], i64 1 10938f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] 10948f2cacaeSDavid Green; CHECK: pred.load.continue2: 109580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x float> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ] 109680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x float> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ] 1097e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 109880aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 10998f2cacaeSDavid Green; CHECK: pred.load.if3: 110080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP21:%.*]] = or i64 [[INDEX]], 2 110180aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds float, float* [[A]], i64 [[TMP21]] 110280aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP23:%.*]] = load float, float* [[TMP22]], align 4 1103e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x float> [[TMP18]], float [[TMP23]], i64 2 110480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds float, float* [[B]], i64 [[TMP21]] 110580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP26:%.*]] = load float, float* [[TMP25]], align 4 1106e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x float> [[TMP19]], float [[TMP26]], i64 2 11078f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 11088f2cacaeSDavid Green; CHECK: pred.load.continue4: 110980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x float> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ] 111080aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x float> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ] 1111e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 111280aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]] 11138f2cacaeSDavid Green; CHECK: pred.load.if5: 111480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP31:%.*]] = or i64 [[INDEX]], 3 111580aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds float, float* [[A]], i64 [[TMP31]] 111680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP33:%.*]] = load float, float* [[TMP32]], align 4 1117e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x float> [[TMP28]], float [[TMP33]], i64 3 111880aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds float, float* [[B]], i64 [[TMP31]] 111980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP36:%.*]] = load float, float* [[TMP35]], align 4 1120e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x float> [[TMP29]], float [[TMP36]], i64 3 11218f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 11228f2cacaeSDavid Green; CHECK: pred.load.continue6: 112380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x float> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ] 112480aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x float> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ] 1125dcb8222dSRosie Sumpter; CHECK-NEXT: [[TMP40:%.*]] = select fast <4 x i1> [[TMP0]], <4 x float> [[TMP38]], <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00> 112680aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP41:%.*]] = call fast float @llvm.vector.reduce.fmul.v4f32(float 1.000000e+00, <4 x float> [[TMP40]]) 1127dcb8222dSRosie Sumpter; CHECK-NEXT: [[TMP42:%.*]] = fmul fast float [[TMP41]], [[VEC_PHI]] 1128dcb8222dSRosie Sumpter; CHECK-NEXT: [[TMP43:%.*]] = select fast <4 x i1> [[TMP0]], <4 x float> [[TMP39]], <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00> 112980aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP44:%.*]] = call fast float @llvm.vector.reduce.fmul.v4f32(float 1.000000e+00, <4 x float> [[TMP43]]) 1130dcb8222dSRosie Sumpter; CHECK-NEXT: [[TMP45]] = fmul fast float [[TMP44]], [[TMP42]] 11318f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 11328f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], <i64 4, i64 4, i64 4, i64 4> 113380aa7e14SFlorian Hahn; CHECK-NEXT: [[TMP46:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260 113480aa7e14SFlorian Hahn; CHECK-NEXT: br i1 [[TMP46]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]] 11358f2cacaeSDavid Green; CHECK: middle.block: 11368f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 11378f2cacaeSDavid Green; CHECK: scalar.ph: 11388f2cacaeSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 11398f2cacaeSDavid Green; CHECK: for.body: 1140*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP23:![0-9]+]] 11418f2cacaeSDavid Green; CHECK: for.end: 1142*9df0b254SNuno Lopes; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = phi float [ poison, [[FOR_BODY]] ], [ [[TMP45]], [[MIDDLE_BLOCK]] ] 11438f2cacaeSDavid Green; CHECK-NEXT: ret float [[RESULT_0_LCSSA]] 11448f2cacaeSDavid Green; 11458f2cacaeSDavid Greenentry: 11468f2cacaeSDavid Green br label %for.body 11478f2cacaeSDavid Green 11488f2cacaeSDavid Greenfor.body: ; preds = %entry, %for.body 11498f2cacaeSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 11508f2cacaeSDavid Green %result.08 = phi float [ %fmul, %for.body ], [ 0.0, %entry ] 11518f2cacaeSDavid Green %arrayidx = getelementptr inbounds float, float* %A, i64 %indvars.iv 11528f2cacaeSDavid Green %l0 = load float, float* %arrayidx, align 4 11538f2cacaeSDavid Green %arrayidx2 = getelementptr inbounds float, float* %B, i64 %indvars.iv 11548f2cacaeSDavid Green %l1 = load float, float* %arrayidx2, align 4 11558f2cacaeSDavid Green %add = fmul fast float %result.08, %l0 11568f2cacaeSDavid Green %fmul = fmul fast float %add, %l1 11578f2cacaeSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 11588f2cacaeSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 11598f2cacaeSDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 257 11608f2cacaeSDavid Green br i1 %exitcond, label %for.end, label %for.body 11618f2cacaeSDavid Green 11628f2cacaeSDavid Greenfor.end: ; preds = %for.body, %entry 11638f2cacaeSDavid Green %result.0.lcssa = phi float [ %fmul, %for.body ] 11648f2cacaeSDavid Green ret float %result.0.lcssa 11658f2cacaeSDavid Green} 11668f2cacaeSDavid Green 11678f2cacaeSDavid Greendefine i32 @reduction_min(i32* nocapture %A, i32* nocapture %B) { 11688f2cacaeSDavid Green; CHECK-LABEL: @reduction_min( 11698f2cacaeSDavid Green; CHECK-NEXT: entry: 11708f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 11718f2cacaeSDavid Green; CHECK: vector.ph: 11728f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 11738f2cacaeSDavid Green; CHECK: vector.body: 11748f2cacaeSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ] 11758f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ] 1176a266af72SNikita Popov; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 1000, [[VECTOR_PH]] ], [ [[TMP26:%.*]], [[PRED_LOAD_CONTINUE6]] ] 11778f2cacaeSDavid Green; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i64> [[VEC_IND]], <i64 257, i64 257, i64 257, i64 257> 1178e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 11798f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 11808f2cacaeSDavid Green; CHECK: pred.load.if: 11818f2cacaeSDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 11828f2cacaeSDavid Green; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4 1183e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0 11848f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 11858f2cacaeSDavid Green; CHECK: pred.load.continue: 11864a8e6ed2SJuneyoung Lee; CHECK-NEXT: [[TMP5:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ] 1187e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 11888f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]] 11898f2cacaeSDavid Green; CHECK: pred.load.if1: 11908f2cacaeSDavid Green; CHECK-NEXT: [[TMP7:%.*]] = or i64 [[INDEX]], 1 11918f2cacaeSDavid Green; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP7]] 11928f2cacaeSDavid Green; CHECK-NEXT: [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4 1193e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i64 1 11948f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] 11958f2cacaeSDavid Green; CHECK: pred.load.continue2: 11968f2cacaeSDavid Green; CHECK-NEXT: [[TMP11:%.*]] = phi <4 x i32> [ [[TMP5]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP10]], [[PRED_LOAD_IF1]] ] 1197e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 11988f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 11998f2cacaeSDavid Green; CHECK: pred.load.if3: 12008f2cacaeSDavid Green; CHECK-NEXT: [[TMP13:%.*]] = or i64 [[INDEX]], 2 12018f2cacaeSDavid Green; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP13]] 12028f2cacaeSDavid Green; CHECK-NEXT: [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4 1203e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP16:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP15]], i64 2 12048f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 12058f2cacaeSDavid Green; CHECK: pred.load.continue4: 12068f2cacaeSDavid Green; CHECK-NEXT: [[TMP17:%.*]] = phi <4 x i32> [ [[TMP11]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP16]], [[PRED_LOAD_IF3]] ] 1207e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP18:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 12088f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP18]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]] 12098f2cacaeSDavid Green; CHECK: pred.load.if5: 12108f2cacaeSDavid Green; CHECK-NEXT: [[TMP19:%.*]] = or i64 [[INDEX]], 3 12118f2cacaeSDavid Green; CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP19]] 12128f2cacaeSDavid Green; CHECK-NEXT: [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4 1213e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP22:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP21]], i64 3 12148f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 12158f2cacaeSDavid Green; CHECK: pred.load.continue6: 12168f2cacaeSDavid Green; CHECK-NEXT: [[TMP23:%.*]] = phi <4 x i32> [ [[TMP17]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP22]], [[PRED_LOAD_IF5]] ] 1217be6e8e50SDavid Green; CHECK-NEXT: [[TMP24:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP23]], <4 x i32> <i32 2147483647, i32 2147483647, i32 2147483647, i32 2147483647> 1218be6e8e50SDavid Green; CHECK-NEXT: [[TMP25:%.*]] = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> [[TMP24]]) 1219a266af72SNikita Popov; CHECK-NEXT: [[TMP26]] = call i32 @llvm.smin.i32(i32 [[TMP25]], i32 [[VEC_PHI]]) 12208f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 12218f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], <i64 4, i64 4, i64 4, i64 4> 1222a266af72SNikita Popov; CHECK-NEXT: [[TMP27:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260 1223a266af72SNikita Popov; CHECK-NEXT: br i1 [[TMP27]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]] 12248f2cacaeSDavid Green; CHECK: middle.block: 12258f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 12268f2cacaeSDavid Green; CHECK: scalar.ph: 12278f2cacaeSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 12288f2cacaeSDavid Green; CHECK: for.body: 1229*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP25:![0-9]+]] 12308f2cacaeSDavid Green; CHECK: for.end: 1231*9df0b254SNuno Lopes; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP26]], [[MIDDLE_BLOCK]] ] 12328f2cacaeSDavid Green; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]] 12338f2cacaeSDavid Green; 12348f2cacaeSDavid Greenentry: 12358f2cacaeSDavid Green br label %for.body 12368f2cacaeSDavid Green 12378f2cacaeSDavid Greenfor.body: ; preds = %entry, %for.body 12388f2cacaeSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 12398f2cacaeSDavid Green %result.08 = phi i32 [ %v0, %for.body ], [ 1000, %entry ] 12408f2cacaeSDavid Green %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 12418f2cacaeSDavid Green %l0 = load i32, i32* %arrayidx, align 4 12428f2cacaeSDavid Green %c0 = icmp slt i32 %result.08, %l0 12438f2cacaeSDavid Green %v0 = select i1 %c0, i32 %result.08, i32 %l0 12448f2cacaeSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 12458f2cacaeSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 12468f2cacaeSDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 257 12478f2cacaeSDavid Green br i1 %exitcond, label %for.end, label %for.body 12488f2cacaeSDavid Green 12498f2cacaeSDavid Greenfor.end: ; preds = %for.body, %entry 12508f2cacaeSDavid Green %result.0.lcssa = phi i32 [ %v0, %for.body ] 12518f2cacaeSDavid Green ret i32 %result.0.lcssa 12528f2cacaeSDavid Green} 12538f2cacaeSDavid Green 12548f2cacaeSDavid Greendefine i32 @reduction_max(i32* nocapture %A, i32* nocapture %B) { 12558f2cacaeSDavid Green; CHECK-LABEL: @reduction_max( 12568f2cacaeSDavid Green; CHECK-NEXT: entry: 12578f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 12588f2cacaeSDavid Green; CHECK: vector.ph: 12598f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 12608f2cacaeSDavid Green; CHECK: vector.body: 12618f2cacaeSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ] 12628f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ] 1263a266af72SNikita Popov; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 1000, [[VECTOR_PH]] ], [ [[TMP26:%.*]], [[PRED_LOAD_CONTINUE6]] ] 12648f2cacaeSDavid Green; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i64> [[VEC_IND]], <i64 257, i64 257, i64 257, i64 257> 1265e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 12668f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 12678f2cacaeSDavid Green; CHECK: pred.load.if: 12688f2cacaeSDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 12698f2cacaeSDavid Green; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4 1270e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0 12718f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 12728f2cacaeSDavid Green; CHECK: pred.load.continue: 12734a8e6ed2SJuneyoung Lee; CHECK-NEXT: [[TMP5:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ] 1274e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 12758f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]] 12768f2cacaeSDavid Green; CHECK: pred.load.if1: 12778f2cacaeSDavid Green; CHECK-NEXT: [[TMP7:%.*]] = or i64 [[INDEX]], 1 12788f2cacaeSDavid Green; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP7]] 12798f2cacaeSDavid Green; CHECK-NEXT: [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4 1280e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i64 1 12818f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] 12828f2cacaeSDavid Green; CHECK: pred.load.continue2: 12838f2cacaeSDavid Green; CHECK-NEXT: [[TMP11:%.*]] = phi <4 x i32> [ [[TMP5]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP10]], [[PRED_LOAD_IF1]] ] 1284e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 12858f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 12868f2cacaeSDavid Green; CHECK: pred.load.if3: 12878f2cacaeSDavid Green; CHECK-NEXT: [[TMP13:%.*]] = or i64 [[INDEX]], 2 12888f2cacaeSDavid Green; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP13]] 12898f2cacaeSDavid Green; CHECK-NEXT: [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4 1290e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP16:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP15]], i64 2 12918f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 12928f2cacaeSDavid Green; CHECK: pred.load.continue4: 12938f2cacaeSDavid Green; CHECK-NEXT: [[TMP17:%.*]] = phi <4 x i32> [ [[TMP11]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP16]], [[PRED_LOAD_IF3]] ] 1294e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP18:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 12958f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP18]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]] 12968f2cacaeSDavid Green; CHECK: pred.load.if5: 12978f2cacaeSDavid Green; CHECK-NEXT: [[TMP19:%.*]] = or i64 [[INDEX]], 3 12988f2cacaeSDavid Green; CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[TMP19]] 12998f2cacaeSDavid Green; CHECK-NEXT: [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4 1300e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP22:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP21]], i64 3 13018f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 13028f2cacaeSDavid Green; CHECK: pred.load.continue6: 13038f2cacaeSDavid Green; CHECK-NEXT: [[TMP23:%.*]] = phi <4 x i32> [ [[TMP17]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP22]], [[PRED_LOAD_IF5]] ] 1304be6e8e50SDavid Green; CHECK-NEXT: [[TMP24:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP23]], <4 x i32> zeroinitializer 1305be6e8e50SDavid Green; CHECK-NEXT: [[TMP25:%.*]] = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> [[TMP24]]) 1306a266af72SNikita Popov; CHECK-NEXT: [[TMP26]] = call i32 @llvm.umax.i32(i32 [[TMP25]], i32 [[VEC_PHI]]) 13078f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 13088f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], <i64 4, i64 4, i64 4, i64 4> 1309a266af72SNikita Popov; CHECK-NEXT: [[TMP27:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260 1310a266af72SNikita Popov; CHECK-NEXT: br i1 [[TMP27]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP26:![0-9]+]] 13118f2cacaeSDavid Green; CHECK: middle.block: 13128f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 13138f2cacaeSDavid Green; CHECK: scalar.ph: 13148f2cacaeSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 13158f2cacaeSDavid Green; CHECK: for.body: 1316*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP27:![0-9]+]] 13178f2cacaeSDavid Green; CHECK: for.end: 1318*9df0b254SNuno Lopes; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP26]], [[MIDDLE_BLOCK]] ] 13198f2cacaeSDavid Green; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]] 13208f2cacaeSDavid Green; 13218f2cacaeSDavid Greenentry: 13228f2cacaeSDavid Green br label %for.body 13238f2cacaeSDavid Green 13248f2cacaeSDavid Greenfor.body: ; preds = %entry, %for.body 13258f2cacaeSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 13268f2cacaeSDavid Green %result.08 = phi i32 [ %v0, %for.body ], [ 1000, %entry ] 13278f2cacaeSDavid Green %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 13288f2cacaeSDavid Green %l0 = load i32, i32* %arrayidx, align 4 13298f2cacaeSDavid Green %c0 = icmp ugt i32 %result.08, %l0 13308f2cacaeSDavid Green %v0 = select i1 %c0, i32 %result.08, i32 %l0 13318f2cacaeSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 13328f2cacaeSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 13338f2cacaeSDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 257 13348f2cacaeSDavid Green br i1 %exitcond, label %for.end, label %for.body 13358f2cacaeSDavid Green 13368f2cacaeSDavid Greenfor.end: ; preds = %for.body, %entry 13378f2cacaeSDavid Green %result.0.lcssa = phi i32 [ %v0, %for.body ] 13388f2cacaeSDavid Green ret i32 %result.0.lcssa 13398f2cacaeSDavid Green} 13408f2cacaeSDavid Green 13418f2cacaeSDavid Green; Conditional reductions with multi-input phis. 13428f2cacaeSDavid Greendefine float @reduction_conditional(float* %A, float* %B, float* %C, float %S) { 13438f2cacaeSDavid Green; CHECK-LABEL: @reduction_conditional( 13448f2cacaeSDavid Green; CHECK-NEXT: entry: 13458f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 13468f2cacaeSDavid Green; CHECK: vector.ph: 1347e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP0:%.*]] = insertelement <4 x float> <float poison, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, float [[S:%.*]], i64 0 13488f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 13498f2cacaeSDavid Green; CHECK: vector.body: 13508f2cacaeSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 13518f2cacaeSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x float> [ [[TMP0]], [[VECTOR_PH]] ], [ [[PREDPHI3:%.*]], [[VECTOR_BODY]] ] 13528f2cacaeSDavid Green; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, float* [[A:%.*]], i64 [[INDEX]] 13538f2cacaeSDavid Green; CHECK-NEXT: [[TMP2:%.*]] = bitcast float* [[TMP1]] to <4 x float>* 13548f2cacaeSDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, <4 x float>* [[TMP2]], align 4 13558f2cacaeSDavid Green; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds float, float* [[B:%.*]], i64 [[INDEX]] 13568f2cacaeSDavid Green; CHECK-NEXT: [[TMP4:%.*]] = bitcast float* [[TMP3]] to <4 x float>* 13578f2cacaeSDavid Green; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x float>, <4 x float>* [[TMP4]], align 4 13588f2cacaeSDavid Green; CHECK-NEXT: [[TMP5:%.*]] = fcmp ogt <4 x float> [[WIDE_LOAD]], [[WIDE_LOAD1]] 13598f2cacaeSDavid Green; CHECK-NEXT: [[TMP6:%.*]] = fcmp ule <4 x float> [[WIDE_LOAD1]], <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00> 13608f2cacaeSDavid Green; CHECK-NEXT: [[TMP7:%.*]] = fcmp ogt <4 x float> [[WIDE_LOAD]], <float 2.000000e+00, float 2.000000e+00, float 2.000000e+00, float 2.000000e+00> 1361ed253ef7SJuneyoung Lee; CHECK-NEXT: [[TMP8:%.*]] = and <4 x i1> [[TMP5]], [[TMP6]] 1362ed253ef7SJuneyoung Lee; CHECK-NEXT: [[TMP9:%.*]] = and <4 x i1> [[TMP8]], [[TMP7]] 13638f2cacaeSDavid Green; CHECK-NEXT: [[TMP10:%.*]] = xor <4 x i1> [[TMP7]], <i1 true, i1 true, i1 true, i1 true> 13648f2cacaeSDavid Green; CHECK-NEXT: [[TMP11:%.*]] = and <4 x i1> [[TMP8]], [[TMP10]] 13658f2cacaeSDavid Green; CHECK-NEXT: [[TMP12:%.*]] = xor <4 x i1> [[TMP5]], <i1 true, i1 true, i1 true, i1 true> 13668f2cacaeSDavid Green; CHECK-NEXT: [[PREDPHI_V:%.*]] = select <4 x i1> [[TMP9]], <4 x float> [[WIDE_LOAD1]], <4 x float> [[WIDE_LOAD]] 13678a156d1cSJuneyoung Lee; CHECK-NEXT: [[TMP13:%.*]] = select <4 x i1> [[TMP12]], <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i1> [[TMP11]] 13689cd7c534SHuihui Zhang; CHECK-NEXT: [[PREDPHI2:%.*]] = select <4 x i1> [[TMP13]], <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, <4 x float> [[PREDPHI_V]] 13699cd7c534SHuihui Zhang; CHECK-NEXT: [[PREDPHI3]] = fadd fast <4 x float> [[VEC_PHI]], [[PREDPHI2]] 137023c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 13718f2cacaeSDavid Green; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], 128 1372e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]] 13738f2cacaeSDavid Green; CHECK: middle.block: 137420b386aaSNikita Popov; CHECK-NEXT: [[TMP15:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float -0.000000e+00, <4 x float> [[PREDPHI3]]) 13758f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 13768f2cacaeSDavid Green; CHECK: scalar.ph: 13778f2cacaeSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 13788f2cacaeSDavid Green; CHECK: for.body: 1379*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[IF_THEN:%.*]], label [[FOR_INC:%.*]] 13808f2cacaeSDavid Green; CHECK: if.then: 1381*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[IF_THEN8:%.*]], label [[IF_ELSE:%.*]] 13828f2cacaeSDavid Green; CHECK: if.then8: 13838f2cacaeSDavid Green; CHECK-NEXT: br label [[FOR_INC]] 13848f2cacaeSDavid Green; CHECK: if.else: 1385*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[IF_THEN16:%.*]], label [[FOR_INC]] 13868f2cacaeSDavid Green; CHECK: if.then16: 13878f2cacaeSDavid Green; CHECK-NEXT: br label [[FOR_INC]] 13888f2cacaeSDavid Green; CHECK: for.inc: 1389*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_BODY]], label [[FOR_END]], !llvm.loop [[LOOP29:![0-9]+]] 13908f2cacaeSDavid Green; CHECK: for.end: 1391*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_1_LCSSA:%.*]] = phi float [ poison, [[FOR_INC]] ], [ [[TMP15]], [[MIDDLE_BLOCK]] ] 13928f2cacaeSDavid Green; CHECK-NEXT: ret float [[SUM_1_LCSSA]] 13938f2cacaeSDavid Green; 13948f2cacaeSDavid Greenentry: 13958f2cacaeSDavid Green br label %for.body 13968f2cacaeSDavid Green 13978f2cacaeSDavid Greenfor.body: 13988f2cacaeSDavid Green %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.inc ] 13998f2cacaeSDavid Green %sum.033 = phi float [ %S, %entry ], [ %sum.1, %for.inc ] 14008f2cacaeSDavid Green %arrayidx = getelementptr inbounds float, float* %A, i64 %indvars.iv 14018f2cacaeSDavid Green %l0 = load float, float* %arrayidx, align 4 14028f2cacaeSDavid Green %arrayidx2 = getelementptr inbounds float, float* %B, i64 %indvars.iv 14038f2cacaeSDavid Green %l1 = load float, float* %arrayidx2, align 4 14048f2cacaeSDavid Green %cmp3 = fcmp ogt float %l0, %l1 14058f2cacaeSDavid Green br i1 %cmp3, label %if.then, label %for.inc 14068f2cacaeSDavid Green 14078f2cacaeSDavid Greenif.then: 14088f2cacaeSDavid Green %cmp6 = fcmp ogt float %l1, 1.000000e+00 14098f2cacaeSDavid Green br i1 %cmp6, label %if.then8, label %if.else 14108f2cacaeSDavid Green 14118f2cacaeSDavid Greenif.then8: 14128f2cacaeSDavid Green %add = fadd fast float %sum.033, %l0 14138f2cacaeSDavid Green br label %for.inc 14148f2cacaeSDavid Green 14158f2cacaeSDavid Greenif.else: 14168f2cacaeSDavid Green %cmp14 = fcmp ogt float %l0, 2.000000e+00 14178f2cacaeSDavid Green br i1 %cmp14, label %if.then16, label %for.inc 14188f2cacaeSDavid Green 14198f2cacaeSDavid Greenif.then16: 14208f2cacaeSDavid Green %add19 = fadd fast float %sum.033, %l1 14218f2cacaeSDavid Green br label %for.inc 14228f2cacaeSDavid Green 14238f2cacaeSDavid Greenfor.inc: 14248f2cacaeSDavid Green %sum.1 = phi float [ %add, %if.then8 ], [ %add19, %if.then16 ], [ %sum.033, %if.else ], [ %sum.033, %for.body ] 14258f2cacaeSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 14268f2cacaeSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 14278f2cacaeSDavid Green %exitcond = icmp ne i32 %lftr.wideiv, 128 14288f2cacaeSDavid Green br i1 %exitcond, label %for.body, label %for.end 14298f2cacaeSDavid Green 14308f2cacaeSDavid Greenfor.end: 14318f2cacaeSDavid Green %sum.1.lcssa = phi float [ %sum.1, %for.inc ] 14328f2cacaeSDavid Green ret float %sum.1.lcssa 14338f2cacaeSDavid Green} 14348f2cacaeSDavid Green 14358f2cacaeSDavid Greendefine i8 @reduction_add_trunc(i8* noalias nocapture %A) { 14368f2cacaeSDavid Green; CHECK-LABEL: @reduction_add_trunc( 14378f2cacaeSDavid Green; CHECK-NEXT: entry: 14388f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 14398f2cacaeSDavid Green; CHECK: vector.ph: 14408f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 14418f2cacaeSDavid Green; CHECK: vector.body: 14428f2cacaeSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ] 14438f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ] 14448f2cacaeSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ <i32 255, i32 0, i32 0, i32 0>, [[VECTOR_PH]] ], [ [[TMP30:%.*]], [[PRED_LOAD_CONTINUE6]] ] 1445be6e8e50SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i32> [[VEC_IND]], <i32 257, i32 257, i32 257, i32 257> 1446be6e8e50SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = and <4 x i32> [[VEC_PHI]], <i32 255, i32 255, i32 255, i32 255> 1447e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 14488f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP2]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 14498f2cacaeSDavid Green; CHECK: pred.load.if: 14508f2cacaeSDavid Green; CHECK-NEXT: [[TMP3:%.*]] = sext i32 [[INDEX]] to i64 14518f2cacaeSDavid Green; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, i8* [[A:%.*]], i64 [[TMP3]] 14528f2cacaeSDavid Green; CHECK-NEXT: [[TMP5:%.*]] = load i8, i8* [[TMP4]], align 4 1453e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x i8> poison, i8 [[TMP5]], i64 0 14548f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 14558f2cacaeSDavid Green; CHECK: pred.load.continue: 14564a8e6ed2SJuneyoung Lee; CHECK-NEXT: [[TMP7:%.*]] = phi <4 x i8> [ poison, [[VECTOR_BODY]] ], [ [[TMP6]], [[PRED_LOAD_IF]] ] 1457e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP8:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 14588f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP8]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]] 14598f2cacaeSDavid Green; CHECK: pred.load.if1: 14608f2cacaeSDavid Green; CHECK-NEXT: [[TMP9:%.*]] = or i32 [[INDEX]], 1 14618f2cacaeSDavid Green; CHECK-NEXT: [[TMP10:%.*]] = sext i32 [[TMP9]] to i64 14628f2cacaeSDavid Green; CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 [[TMP10]] 14638f2cacaeSDavid Green; CHECK-NEXT: [[TMP12:%.*]] = load i8, i8* [[TMP11]], align 4 1464e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP13:%.*]] = insertelement <4 x i8> [[TMP7]], i8 [[TMP12]], i64 1 14658f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] 14668f2cacaeSDavid Green; CHECK: pred.load.continue2: 14678f2cacaeSDavid Green; CHECK-NEXT: [[TMP14:%.*]] = phi <4 x i8> [ [[TMP7]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP13]], [[PRED_LOAD_IF1]] ] 1468e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP15:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 14698f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP15]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 14708f2cacaeSDavid Green; CHECK: pred.load.if3: 14718f2cacaeSDavid Green; CHECK-NEXT: [[TMP16:%.*]] = or i32 [[INDEX]], 2 14728f2cacaeSDavid Green; CHECK-NEXT: [[TMP17:%.*]] = sext i32 [[TMP16]] to i64 14738f2cacaeSDavid Green; CHECK-NEXT: [[TMP18:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 [[TMP17]] 14748f2cacaeSDavid Green; CHECK-NEXT: [[TMP19:%.*]] = load i8, i8* [[TMP18]], align 4 1475e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP20:%.*]] = insertelement <4 x i8> [[TMP14]], i8 [[TMP19]], i64 2 14768f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 14778f2cacaeSDavid Green; CHECK: pred.load.continue4: 14788f2cacaeSDavid Green; CHECK-NEXT: [[TMP21:%.*]] = phi <4 x i8> [ [[TMP14]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP20]], [[PRED_LOAD_IF3]] ] 1479e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP22:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 14808f2cacaeSDavid Green; CHECK-NEXT: br i1 [[TMP22]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]] 14818f2cacaeSDavid Green; CHECK: pred.load.if5: 14828f2cacaeSDavid Green; CHECK-NEXT: [[TMP23:%.*]] = or i32 [[INDEX]], 3 14838f2cacaeSDavid Green; CHECK-NEXT: [[TMP24:%.*]] = sext i32 [[TMP23]] to i64 14848f2cacaeSDavid Green; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 [[TMP24]] 14858f2cacaeSDavid Green; CHECK-NEXT: [[TMP26:%.*]] = load i8, i8* [[TMP25]], align 4 1486e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i8> [[TMP21]], i8 [[TMP26]], i64 3 14878f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 14888f2cacaeSDavid Green; CHECK: pred.load.continue6: 14898f2cacaeSDavid Green; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i8> [ [[TMP21]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP27]], [[PRED_LOAD_IF5]] ] 14908f2cacaeSDavid Green; CHECK-NEXT: [[TMP29:%.*]] = zext <4 x i8> [[TMP28]] to <4 x i32> 1491be6e8e50SDavid Green; CHECK-NEXT: [[TMP30]] = add nuw nsw <4 x i32> [[TMP1]], [[TMP29]] 14928f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i32 [[INDEX]], 4 14938f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4> 14948f2cacaeSDavid Green; CHECK-NEXT: [[TMP31:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260 1495e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP31]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP30:![0-9]+]] 14968f2cacaeSDavid Green; CHECK: middle.block: 1497be6e8e50SDavid Green; CHECK-NEXT: [[TMP32:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP30]], <4 x i32> [[VEC_PHI]] 14988f2cacaeSDavid Green; CHECK-NEXT: [[TMP33:%.*]] = trunc <4 x i32> [[TMP32]] to <4 x i8> 14998f2cacaeSDavid Green; CHECK-NEXT: [[TMP34:%.*]] = call i8 @llvm.vector.reduce.add.v4i8(<4 x i8> [[TMP33]]) 15008f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 15018f2cacaeSDavid Green; CHECK: scalar.ph: 15028f2cacaeSDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 15038f2cacaeSDavid Green; CHECK: .lr.ph: 1504*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP31:![0-9]+]] 15058f2cacaeSDavid Green; CHECK: ._crit_edge: 1506*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i8 [ poison, [[DOTLR_PH]] ], [ [[TMP34]], [[MIDDLE_BLOCK]] ] 15078f2cacaeSDavid Green; CHECK-NEXT: ret i8 [[SUM_0_LCSSA]] 15088f2cacaeSDavid Green; 15098f2cacaeSDavid Greenentry: 15108f2cacaeSDavid Green br label %.lr.ph 15118f2cacaeSDavid Green 15128f2cacaeSDavid Green.lr.ph: ; preds = %entry, %.lr.ph 15138f2cacaeSDavid Green %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 15148f2cacaeSDavid Green %sum.02p = phi i32 [ %l9, %.lr.ph ], [ 255, %entry ] 15158f2cacaeSDavid Green %sum.02 = and i32 %sum.02p, 255 15168f2cacaeSDavid Green %l2 = getelementptr inbounds i8, i8* %A, i32 %indvars.iv 15178f2cacaeSDavid Green %l3 = load i8, i8* %l2, align 4 15188f2cacaeSDavid Green %l3e = zext i8 %l3 to i32 15198f2cacaeSDavid Green %l9 = add i32 %sum.02, %l3e 15208f2cacaeSDavid Green %indvars.iv.next = add i32 %indvars.iv, 1 15218f2cacaeSDavid Green %exitcond = icmp eq i32 %indvars.iv.next, 257 15228f2cacaeSDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 15238f2cacaeSDavid Green 15248f2cacaeSDavid Green._crit_edge: ; preds = %.lr.ph 15258f2cacaeSDavid Green %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ] 15268f2cacaeSDavid Green %ret = trunc i32 %sum.0.lcssa to i8 15278f2cacaeSDavid Green ret i8 %ret 15288f2cacaeSDavid Green} 15298f2cacaeSDavid Green 15308f2cacaeSDavid Green 15318f2cacaeSDavid Greendefine i8 @reduction_and_trunc(i8* noalias nocapture %A) { 15328f2cacaeSDavid Green; CHECK-LABEL: @reduction_and_trunc( 15338f2cacaeSDavid Green; CHECK-NEXT: entry: 15348f2cacaeSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 15358f2cacaeSDavid Green; CHECK: vector.ph: 15368f2cacaeSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 15378f2cacaeSDavid Green; CHECK: vector.body: 15388f2cacaeSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ] 15398f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ] 15409d355949SKerry McLaughlin; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ <i32 255, i32 -1, i32 -1, i32 -1>, [[VECTOR_PH]] ], [ [[TMP29:%.*]], [[PRED_LOAD_CONTINUE6]] ] 15418f2cacaeSDavid Green; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i32> [[VEC_IND]], <i32 257, i32 257, i32 257, i32 257> 1542e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0 15439d355949SKerry McLaughlin; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 15448f2cacaeSDavid Green; CHECK: pred.load.if: 15459d355949SKerry McLaughlin; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[INDEX]] to i64 15469d355949SKerry McLaughlin; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8, i8* [[A:%.*]], i64 [[TMP2]] 15479d355949SKerry McLaughlin; CHECK-NEXT: [[TMP4:%.*]] = load i8, i8* [[TMP3]], align 4 1548e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x i8> poison, i8 [[TMP4]], i64 0 15498f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 15508f2cacaeSDavid Green; CHECK: pred.load.continue: 15519d355949SKerry McLaughlin; CHECK-NEXT: [[TMP6:%.*]] = phi <4 x i8> [ poison, [[VECTOR_BODY]] ], [ [[TMP5]], [[PRED_LOAD_IF]] ] 1552e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP7:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1 15539d355949SKerry McLaughlin; CHECK-NEXT: br i1 [[TMP7]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]] 15548f2cacaeSDavid Green; CHECK: pred.load.if1: 15559d355949SKerry McLaughlin; CHECK-NEXT: [[TMP8:%.*]] = or i32 [[INDEX]], 1 15569d355949SKerry McLaughlin; CHECK-NEXT: [[TMP9:%.*]] = sext i32 [[TMP8]] to i64 15579d355949SKerry McLaughlin; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 [[TMP9]] 15589d355949SKerry McLaughlin; CHECK-NEXT: [[TMP11:%.*]] = load i8, i8* [[TMP10]], align 4 1559e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP12:%.*]] = insertelement <4 x i8> [[TMP6]], i8 [[TMP11]], i64 1 15608f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] 15618f2cacaeSDavid Green; CHECK: pred.load.continue2: 15629d355949SKerry McLaughlin; CHECK-NEXT: [[TMP13:%.*]] = phi <4 x i8> [ [[TMP6]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP12]], [[PRED_LOAD_IF1]] ] 1563e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP14:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2 15649d355949SKerry McLaughlin; CHECK-NEXT: br i1 [[TMP14]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 15658f2cacaeSDavid Green; CHECK: pred.load.if3: 15669d355949SKerry McLaughlin; CHECK-NEXT: [[TMP15:%.*]] = or i32 [[INDEX]], 2 15679d355949SKerry McLaughlin; CHECK-NEXT: [[TMP16:%.*]] = sext i32 [[TMP15]] to i64 15689d355949SKerry McLaughlin; CHECK-NEXT: [[TMP17:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 [[TMP16]] 15699d355949SKerry McLaughlin; CHECK-NEXT: [[TMP18:%.*]] = load i8, i8* [[TMP17]], align 4 1570e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP19:%.*]] = insertelement <4 x i8> [[TMP13]], i8 [[TMP18]], i64 2 15718f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 15728f2cacaeSDavid Green; CHECK: pred.load.continue4: 15739d355949SKerry McLaughlin; CHECK-NEXT: [[TMP20:%.*]] = phi <4 x i8> [ [[TMP13]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP19]], [[PRED_LOAD_IF3]] ] 1574e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP21:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3 15759d355949SKerry McLaughlin; CHECK-NEXT: br i1 [[TMP21]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]] 15768f2cacaeSDavid Green; CHECK: pred.load.if5: 15779d355949SKerry McLaughlin; CHECK-NEXT: [[TMP22:%.*]] = or i32 [[INDEX]], 3 15789d355949SKerry McLaughlin; CHECK-NEXT: [[TMP23:%.*]] = sext i32 [[TMP22]] to i64 15799d355949SKerry McLaughlin; CHECK-NEXT: [[TMP24:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 [[TMP23]] 15809d355949SKerry McLaughlin; CHECK-NEXT: [[TMP25:%.*]] = load i8, i8* [[TMP24]], align 4 1581e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP26:%.*]] = insertelement <4 x i8> [[TMP20]], i8 [[TMP25]], i64 3 15828f2cacaeSDavid Green; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 15838f2cacaeSDavid Green; CHECK: pred.load.continue6: 15849d355949SKerry McLaughlin; CHECK-NEXT: [[TMP27:%.*]] = phi <4 x i8> [ [[TMP20]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP26]], [[PRED_LOAD_IF5]] ] 15859d355949SKerry McLaughlin; CHECK-NEXT: [[TMP28:%.*]] = zext <4 x i8> [[TMP27]] to <4 x i32> 15869d355949SKerry McLaughlin; CHECK-NEXT: [[TMP29]] = and <4 x i32> [[VEC_PHI]], [[TMP28]] 15878f2cacaeSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i32 [[INDEX]], 4 15888f2cacaeSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4> 15899d355949SKerry McLaughlin; CHECK-NEXT: [[TMP30:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260 15909d355949SKerry McLaughlin; CHECK-NEXT: br i1 [[TMP30]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP32:![0-9]+]] 15918f2cacaeSDavid Green; CHECK: middle.block: 15929d355949SKerry McLaughlin; CHECK-NEXT: [[TMP31:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP29]], <4 x i32> [[VEC_PHI]] 15939d355949SKerry McLaughlin; CHECK-NEXT: [[TMP32:%.*]] = trunc <4 x i32> [[TMP31]] to <4 x i8> 15949d355949SKerry McLaughlin; CHECK-NEXT: [[TMP33:%.*]] = call i8 @llvm.vector.reduce.and.v4i8(<4 x i8> [[TMP32]]) 15958f2cacaeSDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 15968f2cacaeSDavid Green; CHECK: scalar.ph: 15978f2cacaeSDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 15988f2cacaeSDavid Green; CHECK: .lr.ph: 1599*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP33:![0-9]+]] 16008f2cacaeSDavid Green; CHECK: ._crit_edge: 1601*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i8 [ poison, [[DOTLR_PH]] ], [ [[TMP33]], [[MIDDLE_BLOCK]] ] 16029d355949SKerry McLaughlin; CHECK-NEXT: ret i8 [[SUM_0_LCSSA]] 16038f2cacaeSDavid Green; 16048f2cacaeSDavid Greenentry: 16058f2cacaeSDavid Green br label %.lr.ph 16068f2cacaeSDavid Green 16078f2cacaeSDavid Green.lr.ph: ; preds = %entry, %.lr.ph 16088f2cacaeSDavid Green %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 16098f2cacaeSDavid Green %sum.02p = phi i32 [ %l9, %.lr.ph ], [ 255, %entry ] 16108f2cacaeSDavid Green %sum.02 = and i32 %sum.02p, 255 16118f2cacaeSDavid Green %l2 = getelementptr inbounds i8, i8* %A, i32 %indvars.iv 16128f2cacaeSDavid Green %l3 = load i8, i8* %l2, align 4 16138f2cacaeSDavid Green %l3e = zext i8 %l3 to i32 16148f2cacaeSDavid Green %l9 = and i32 %sum.02, %l3e 16158f2cacaeSDavid Green %indvars.iv.next = add i32 %indvars.iv, 1 16168f2cacaeSDavid Green %exitcond = icmp eq i32 %indvars.iv.next, 257 16178f2cacaeSDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 16188f2cacaeSDavid Green 16198f2cacaeSDavid Green._crit_edge: ; preds = %.lr.ph 16208f2cacaeSDavid Green %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ] 16218f2cacaeSDavid Green %ret = trunc i32 %sum.0.lcssa to i8 16228f2cacaeSDavid Green ret i8 %ret 16238f2cacaeSDavid Green} 1624