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