1b8088adaSDavid Green; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
279b1b4a5SSanjay Patel; RUN: opt < %s -loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -prefer-predicate-over-epilogue=predicate-else-scalar-epilogue -prefer-predicated-reduction-select -dce -instcombine -S | FileCheck %s
3b8088adaSDavid Green
4b8088adaSDavid Greentarget datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
5b8088adaSDavid Green
6b8088adaSDavid Greendefine i32 @reduction_sum_single(i32* noalias nocapture %A) {
7b8088adaSDavid Green; CHECK-LABEL: @reduction_sum_single(
84517488eSSimon Pilgrim; CHECK-NEXT:  entry:
94517488eSSimon Pilgrim; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
104517488eSSimon Pilgrim; CHECK:       vector.ph:
114517488eSSimon Pilgrim; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
12b8088adaSDavid Green; CHECK:       vector.body:
134517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]
144517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]
154517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP25:%.*]], [[PRED_LOAD_CONTINUE6]] ]
164517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult <4 x i32> [[VEC_IND]], <i32 257, i32 257, i32 257, i32 257>
174517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0
184517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]
194517488eSSimon Pilgrim; CHECK:       pred.load.if:
204517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i32 [[INDEX]]
214517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4
224517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0
234517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE]]
244517488eSSimon Pilgrim; CHECK:       pred.load.continue:
254517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP5:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]
264517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1
274517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP6]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]
284517488eSSimon Pilgrim; CHECK:       pred.load.if1:
294517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP7:%.*]] = or i32 [[INDEX]], 1
304517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP7]]
314517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
324517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP10:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i64 1
334517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE2]]
344517488eSSimon Pilgrim; CHECK:       pred.load.continue2:
354517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP11:%.*]] = phi <4 x i32> [ [[TMP5]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP10]], [[PRED_LOAD_IF1]] ]
364517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP12:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2
374517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP12]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]
384517488eSSimon Pilgrim; CHECK:       pred.load.if3:
394517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP13:%.*]] = or i32 [[INDEX]], 2
404517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP14:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP13]]
414517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4
424517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP15]], i64 2
434517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE4]]
444517488eSSimon Pilgrim; CHECK:       pred.load.continue4:
454517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP17:%.*]] = phi <4 x i32> [ [[TMP11]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP16]], [[PRED_LOAD_IF3]] ]
464517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP18:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3
474517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP18]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]
484517488eSSimon Pilgrim; CHECK:       pred.load.if5:
494517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP19:%.*]] = or i32 [[INDEX]], 3
504517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP20:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP19]]
514517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
524517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP22:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP21]], i64 3
534517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE6]]
544517488eSSimon Pilgrim; CHECK:       pred.load.continue6:
554517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP23:%.*]] = phi <4 x i32> [ [[TMP17]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP22]], [[PRED_LOAD_IF5]] ]
564517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP24:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP23]], <4 x i32> zeroinitializer
574517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP25]] = add <4 x i32> [[VEC_PHI]], [[TMP24]]
584517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX_NEXT]] = add i32 [[INDEX]], 4
594517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4>
604517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP26:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260
614517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP26]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
62b8088adaSDavid Green; CHECK:       middle.block:
634517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP27:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP25]])
644517488eSSimon Pilgrim; CHECK-NEXT:    br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]]
654517488eSSimon Pilgrim; CHECK:       scalar.ph:
664517488eSSimon Pilgrim; CHECK-NEXT:    br label [[DOTLR_PH:%.*]]
674517488eSSimon Pilgrim; CHECK:       .lr.ph:
68*9df0b254SNuno Lopes; CHECK-NEXT:    br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP2:![0-9]+]]
694517488eSSimon Pilgrim; CHECK:       ._crit_edge:
70*9df0b254SNuno Lopes; CHECK-NEXT:    [[SUM_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP27]], [[MIDDLE_BLOCK]] ]
714517488eSSimon Pilgrim; CHECK-NEXT:    ret i32 [[SUM_0_LCSSA]]
72b8088adaSDavid Green;
73b8088adaSDavid Greenentry:
74b8088adaSDavid Green  br label %.lr.ph
75b8088adaSDavid Green
76b8088adaSDavid Green.lr.ph:                                           ; preds = %entry, %.lr.ph
77b8088adaSDavid Green  %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]
78b8088adaSDavid Green  %sum.02 = phi i32 [ %l7, %.lr.ph ], [ 0, %entry ]
79b8088adaSDavid Green  %l2 = getelementptr inbounds i32, i32* %A, i32 %indvars.iv
80b8088adaSDavid Green  %l3 = load i32, i32* %l2, align 4
81b8088adaSDavid Green  %l7 = add i32 %sum.02, %l3
82b8088adaSDavid Green  %indvars.iv.next = add i32 %indvars.iv, 1
83b8088adaSDavid Green  %exitcond = icmp eq i32 %indvars.iv.next, 257
84b8088adaSDavid Green  br i1 %exitcond, label %._crit_edge, label %.lr.ph
85b8088adaSDavid Green
86b8088adaSDavid Green._crit_edge:                                      ; preds = %.lr.ph
87b8088adaSDavid Green  %sum.0.lcssa = phi i32 [ %l7, %.lr.ph ]
88b8088adaSDavid Green  ret i32 %sum.0.lcssa
89b8088adaSDavid Green}
90b8088adaSDavid Green
91b8088adaSDavid Greendefine i32 @reduction_sum(i32* noalias nocapture %A, i32* noalias nocapture %B) {
92b8088adaSDavid Green; CHECK-LABEL: @reduction_sum(
934517488eSSimon Pilgrim; CHECK-NEXT:  entry:
944517488eSSimon Pilgrim; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
954517488eSSimon Pilgrim; CHECK:       vector.ph:
964517488eSSimon Pilgrim; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
974517488eSSimon Pilgrim; CHECK:       vector.body:
984517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]
994517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]
1004517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP43:%.*]], [[PRED_LOAD_CONTINUE6]] ]
1014517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult <4 x i32> [[VEC_IND]], <i32 257, i32 257, i32 257, i32 257>
1024517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0
1034517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]
1044517488eSSimon Pilgrim; CHECK:       pred.load.if:
1054517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i32 [[INDEX]]
1064517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4
1074517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0
1084517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i32 [[INDEX]]
1094517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
1104517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0
1114517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE]]
1124517488eSSimon Pilgrim; CHECK:       pred.load.continue:
1134517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]
1144517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]
1154517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1
1164517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]
1174517488eSSimon Pilgrim; CHECK:       pred.load.if1:
1184517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP11:%.*]] = or i32 [[INDEX]], 1
1194517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP11]]
1204517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
1214517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1
1224517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP11]]
1234517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4
1244517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1
1254517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE2]]
1264517488eSSimon Pilgrim; CHECK:       pred.load.continue2:
1274517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]
1284517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]
1294517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2
1304517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]
1314517488eSSimon Pilgrim; CHECK:       pred.load.if3:
1324517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP21:%.*]] = or i32 [[INDEX]], 2
1334517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP22:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP21]]
1344517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
1354517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2
1364517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP25:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP21]]
1374517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4
1384517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2
1394517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE4]]
1404517488eSSimon Pilgrim; CHECK:       pred.load.continue4:
1414517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]
1424517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]
1434517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3
1444517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]
1454517488eSSimon Pilgrim; CHECK:       pred.load.if5:
1464517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP31:%.*]] = or i32 [[INDEX]], 3
1474517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP32:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP31]]
1484517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4
1494517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3
1504517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP35:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP31]]
1514517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4
1524517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3
1534517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE6]]
1544517488eSSimon Pilgrim; CHECK:       pred.load.continue6:
1554517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]
1564517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]
1574517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP40:%.*]] = add <4 x i32> [[VEC_PHI]], [[VEC_IND]]
1584517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP41:%.*]] = add <4 x i32> [[TMP40]], [[TMP38]]
1594517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP42:%.*]] = add <4 x i32> [[TMP41]], [[TMP39]]
1604517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP43]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP42]], <4 x i32> [[VEC_PHI]]
1614517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX_NEXT]] = add i32 [[INDEX]], 4
1624517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4>
1634517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP44:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260
1644517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP44]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
165b8088adaSDavid Green; CHECK:       middle.block:
1664517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP45:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP43]])
1674517488eSSimon Pilgrim; CHECK-NEXT:    br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]]
1684517488eSSimon Pilgrim; CHECK:       scalar.ph:
1694517488eSSimon Pilgrim; CHECK-NEXT:    br label [[DOTLR_PH:%.*]]
1704517488eSSimon Pilgrim; CHECK:       .lr.ph:
171*9df0b254SNuno Lopes; CHECK-NEXT:    br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP5:![0-9]+]]
1724517488eSSimon Pilgrim; CHECK:       ._crit_edge:
173*9df0b254SNuno Lopes; CHECK-NEXT:    [[SUM_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP45]], [[MIDDLE_BLOCK]] ]
1744517488eSSimon Pilgrim; CHECK-NEXT:    ret i32 [[SUM_0_LCSSA]]
175b8088adaSDavid Green;
176b8088adaSDavid Greenentry:
177b8088adaSDavid Green  br label %.lr.ph
178b8088adaSDavid Green
179b8088adaSDavid Green.lr.ph:                                           ; preds = %entry, %.lr.ph
180b8088adaSDavid Green  %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]
181b8088adaSDavid Green  %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ]
182b8088adaSDavid Green  %l2 = getelementptr inbounds i32, i32* %A, i32 %indvars.iv
183b8088adaSDavid Green  %l3 = load i32, i32* %l2, align 4
184b8088adaSDavid Green  %l4 = getelementptr inbounds i32, i32* %B, i32 %indvars.iv
185b8088adaSDavid Green  %l5 = load i32, i32* %l4, align 4
186b8088adaSDavid Green  %l7 = add i32 %sum.02, %indvars.iv
187b8088adaSDavid Green  %l8 = add i32 %l7, %l3
188b8088adaSDavid Green  %l9 = add i32 %l8, %l5
189b8088adaSDavid Green  %indvars.iv.next = add i32 %indvars.iv, 1
190b8088adaSDavid Green  %exitcond = icmp eq i32 %indvars.iv.next, 257
191b8088adaSDavid Green  br i1 %exitcond, label %._crit_edge, label %.lr.ph
192b8088adaSDavid Green
193b8088adaSDavid Green._crit_edge:                                      ; preds = %.lr.ph
194b8088adaSDavid Green  %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ]
195b8088adaSDavid Green  ret i32 %sum.0.lcssa
196b8088adaSDavid Green}
197b8088adaSDavid Green
198b8088adaSDavid Greendefine i32 @reduction_prod(i32* noalias nocapture %A, i32* noalias nocapture %B) {
199b8088adaSDavid Green; CHECK-LABEL: @reduction_prod(
2004517488eSSimon Pilgrim; CHECK-NEXT:  entry:
2014517488eSSimon Pilgrim; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
2024517488eSSimon Pilgrim; CHECK:       vector.ph:
2034517488eSSimon Pilgrim; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
204b8088adaSDavid Green; CHECK:       vector.body:
2054517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]
2064517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]
2074517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, [[VECTOR_PH]] ], [ [[TMP42:%.*]], [[PRED_LOAD_CONTINUE6]] ]
2084517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult <4 x i32> [[VEC_IND]], <i32 257, i32 257, i32 257, i32 257>
2094517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0
2104517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]
2114517488eSSimon Pilgrim; CHECK:       pred.load.if:
2124517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i32 [[INDEX]]
2134517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4
2144517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0
2154517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i32 [[INDEX]]
2164517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
2174517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0
2184517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE]]
2194517488eSSimon Pilgrim; CHECK:       pred.load.continue:
2204517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]
2214517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]
2224517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1
2234517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]
2244517488eSSimon Pilgrim; CHECK:       pred.load.if1:
2254517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP11:%.*]] = or i32 [[INDEX]], 1
2264517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP11]]
2274517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
2284517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1
2294517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP11]]
2304517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4
2314517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1
2324517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE2]]
2334517488eSSimon Pilgrim; CHECK:       pred.load.continue2:
2344517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]
2354517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]
2364517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2
2374517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]
2384517488eSSimon Pilgrim; CHECK:       pred.load.if3:
2394517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP21:%.*]] = or i32 [[INDEX]], 2
2404517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP22:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP21]]
2414517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
2424517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2
2434517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP25:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP21]]
2444517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4
2454517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2
2464517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE4]]
2474517488eSSimon Pilgrim; CHECK:       pred.load.continue4:
2484517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]
2494517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]
2504517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3
2514517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]
2524517488eSSimon Pilgrim; CHECK:       pred.load.if5:
2534517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP31:%.*]] = or i32 [[INDEX]], 3
2544517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP32:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP31]]
2554517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4
2564517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3
2574517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP35:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP31]]
2584517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4
2594517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3
2604517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE6]]
2614517488eSSimon Pilgrim; CHECK:       pred.load.continue6:
2624517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]
2634517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]
2644517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP40:%.*]] = mul <4 x i32> [[VEC_PHI]], [[TMP38]]
2654517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP41:%.*]] = mul <4 x i32> [[TMP40]], [[TMP39]]
2664517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP42]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP41]], <4 x i32> [[VEC_PHI]]
2674517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX_NEXT]] = add i32 [[INDEX]], 4
2684517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4>
2694517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP43:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260
2704517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP43]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
271b8088adaSDavid Green; CHECK:       middle.block:
2724517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP44:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[TMP42]])
2734517488eSSimon Pilgrim; CHECK-NEXT:    br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]]
2744517488eSSimon Pilgrim; CHECK:       scalar.ph:
2754517488eSSimon Pilgrim; CHECK-NEXT:    br label [[DOTLR_PH:%.*]]
2764517488eSSimon Pilgrim; CHECK:       .lr.ph:
277*9df0b254SNuno Lopes; CHECK-NEXT:    br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP7:![0-9]+]]
2784517488eSSimon Pilgrim; CHECK:       ._crit_edge:
279*9df0b254SNuno Lopes; CHECK-NEXT:    [[PROD_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP44]], [[MIDDLE_BLOCK]] ]
2804517488eSSimon Pilgrim; CHECK-NEXT:    ret i32 [[PROD_0_LCSSA]]
281b8088adaSDavid Green;
282b8088adaSDavid Greenentry:
283b8088adaSDavid Green  br label %.lr.ph
284b8088adaSDavid Green
285b8088adaSDavid Green.lr.ph:                                           ; preds = %entry, %.lr.ph
286b8088adaSDavid Green  %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]
287b8088adaSDavid Green  %prod.02 = phi i32 [ %l9, %.lr.ph ], [ 1, %entry ]
288b8088adaSDavid Green  %l2 = getelementptr inbounds i32, i32* %A, i32 %indvars.iv
289b8088adaSDavid Green  %l3 = load i32, i32* %l2, align 4
290b8088adaSDavid Green  %l4 = getelementptr inbounds i32, i32* %B, i32 %indvars.iv
291b8088adaSDavid Green  %l5 = load i32, i32* %l4, align 4
292b8088adaSDavid Green  %l8 = mul i32 %prod.02, %l3
293b8088adaSDavid Green  %l9 = mul i32 %l8, %l5
294b8088adaSDavid Green  %indvars.iv.next = add i32 %indvars.iv, 1
295b8088adaSDavid Green  %exitcond = icmp eq i32 %indvars.iv.next, 257
296b8088adaSDavid Green  br i1 %exitcond, label %._crit_edge, label %.lr.ph
297b8088adaSDavid Green
298b8088adaSDavid Green._crit_edge:                                      ; preds = %.lr.ph
299b8088adaSDavid Green  %prod.0.lcssa = phi i32 [ %l9, %.lr.ph ]
300b8088adaSDavid Green  ret i32 %prod.0.lcssa
301b8088adaSDavid Green}
302b8088adaSDavid Green
303b8088adaSDavid Greendefine i32 @reduction_and(i32* nocapture %A, i32* nocapture %B) {
304b8088adaSDavid Green; CHECK-LABEL: @reduction_and(
3054517488eSSimon Pilgrim; CHECK-NEXT:  entry:
3064517488eSSimon Pilgrim; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
3074517488eSSimon Pilgrim; CHECK:       vector.ph:
3084517488eSSimon Pilgrim; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
309b8088adaSDavid Green; CHECK:       vector.body:
3104517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]
3114517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]
3124517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i32> [ <i32 -1, i32 -1, i32 -1, i32 -1>, [[VECTOR_PH]] ], [ [[TMP42:%.*]], [[PRED_LOAD_CONTINUE6]] ]
3134517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult <4 x i32> [[VEC_IND]], <i32 257, i32 257, i32 257, i32 257>
3144517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0
3154517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]
3164517488eSSimon Pilgrim; CHECK:       pred.load.if:
3174517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i32 [[INDEX]]
3184517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4
3194517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0
3204517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i32 [[INDEX]]
3214517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
3224517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0
3234517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE]]
3244517488eSSimon Pilgrim; CHECK:       pred.load.continue:
3254517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]
3264517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]
3274517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1
3284517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]
3294517488eSSimon Pilgrim; CHECK:       pred.load.if1:
3304517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP11:%.*]] = or i32 [[INDEX]], 1
3314517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP11]]
3324517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
3334517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1
3344517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP11]]
3354517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4
3364517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1
3374517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE2]]
3384517488eSSimon Pilgrim; CHECK:       pred.load.continue2:
3394517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]
3404517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]
3414517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2
3424517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]
3434517488eSSimon Pilgrim; CHECK:       pred.load.if3:
3444517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP21:%.*]] = or i32 [[INDEX]], 2
3454517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP22:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP21]]
3464517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
3474517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2
3484517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP25:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP21]]
3494517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4
3504517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2
3514517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE4]]
3524517488eSSimon Pilgrim; CHECK:       pred.load.continue4:
3534517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]
3544517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]
3554517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3
3564517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]
3574517488eSSimon Pilgrim; CHECK:       pred.load.if5:
3584517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP31:%.*]] = or i32 [[INDEX]], 3
3594517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP32:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP31]]
3604517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4
3614517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3
3624517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP35:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP31]]
3634517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4
3644517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3
3654517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE6]]
3664517488eSSimon Pilgrim; CHECK:       pred.load.continue6:
3674517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]
3684517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]
3694517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP40:%.*]] = and <4 x i32> [[VEC_PHI]], [[TMP38]]
3704517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP41:%.*]] = and <4 x i32> [[TMP40]], [[TMP39]]
3714517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP42]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP41]], <4 x i32> [[VEC_PHI]]
3724517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX_NEXT]] = add i32 [[INDEX]], 4
3734517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4>
3744517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP43:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260
3754517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP43]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
376b8088adaSDavid Green; CHECK:       middle.block:
3774517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP44:%.*]] = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> [[TMP42]])
3784517488eSSimon Pilgrim; CHECK-NEXT:    br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]]
3794517488eSSimon Pilgrim; CHECK:       scalar.ph:
3804517488eSSimon Pilgrim; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
3814517488eSSimon Pilgrim; CHECK:       for.body:
382*9df0b254SNuno Lopes; CHECK-NEXT:    br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
3834517488eSSimon Pilgrim; CHECK:       for.end:
384*9df0b254SNuno Lopes; CHECK-NEXT:    [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP44]], [[MIDDLE_BLOCK]] ]
3854517488eSSimon Pilgrim; CHECK-NEXT:    ret i32 [[RESULT_0_LCSSA]]
386b8088adaSDavid Green;
387b8088adaSDavid Greenentry:
388b8088adaSDavid Green  br label %for.body
389b8088adaSDavid Green
390b8088adaSDavid Greenfor.body:                                         ; preds = %entry, %for.body
391b8088adaSDavid Green  %indvars.iv = phi i32 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
392b8088adaSDavid Green  %result.08 = phi i32 [ %and, %for.body ], [ -1, %entry ]
393b8088adaSDavid Green  %arrayidx = getelementptr inbounds i32, i32* %A, i32 %indvars.iv
394b8088adaSDavid Green  %l0 = load i32, i32* %arrayidx, align 4
395b8088adaSDavid Green  %arrayidx2 = getelementptr inbounds i32, i32* %B, i32 %indvars.iv
396b8088adaSDavid Green  %l1 = load i32, i32* %arrayidx2, align 4
397b8088adaSDavid Green  %add = and i32 %result.08, %l0
398b8088adaSDavid Green  %and = and i32 %add, %l1
399b8088adaSDavid Green  %indvars.iv.next = add i32 %indvars.iv, 1
400b8088adaSDavid Green  %exitcond = icmp eq i32 %indvars.iv.next, 257
401b8088adaSDavid Green  br i1 %exitcond, label %for.end, label %for.body
402b8088adaSDavid Green
403b8088adaSDavid Greenfor.end:                                          ; preds = %for.body, %entry
404b8088adaSDavid Green  %result.0.lcssa = phi i32 [ %and, %for.body ]
405b8088adaSDavid Green  ret i32 %result.0.lcssa
406b8088adaSDavid Green}
407b8088adaSDavid Green
408b8088adaSDavid Greendefine i32 @reduction_or(i32* nocapture %A, i32* nocapture %B) {
409b8088adaSDavid Green; CHECK-LABEL: @reduction_or(
4104517488eSSimon Pilgrim; CHECK-NEXT:  entry:
4114517488eSSimon Pilgrim; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
4124517488eSSimon Pilgrim; CHECK:       vector.ph:
4134517488eSSimon Pilgrim; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
414b8088adaSDavid Green; CHECK:       vector.body:
4154517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]
4164517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]
4174517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP42:%.*]], [[PRED_LOAD_CONTINUE6]] ]
4184517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult <4 x i32> [[VEC_IND]], <i32 257, i32 257, i32 257, i32 257>
4194517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0
4204517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]
4214517488eSSimon Pilgrim; CHECK:       pred.load.if:
4224517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i32 [[INDEX]]
4234517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4
4244517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0
4254517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i32 [[INDEX]]
4264517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
4274517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0
4284517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE]]
4294517488eSSimon Pilgrim; CHECK:       pred.load.continue:
4304517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]
4314517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]
4324517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1
4334517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]
4344517488eSSimon Pilgrim; CHECK:       pred.load.if1:
4354517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP11:%.*]] = or i32 [[INDEX]], 1
4364517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP11]]
4374517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
4384517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1
4394517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP11]]
4404517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4
4414517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1
4424517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE2]]
4434517488eSSimon Pilgrim; CHECK:       pred.load.continue2:
4444517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]
4454517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]
4464517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2
4474517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]
4484517488eSSimon Pilgrim; CHECK:       pred.load.if3:
4494517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP21:%.*]] = or i32 [[INDEX]], 2
4504517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP22:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP21]]
4514517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
4524517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2
4534517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP25:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP21]]
4544517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4
4554517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2
4564517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE4]]
4574517488eSSimon Pilgrim; CHECK:       pred.load.continue4:
4584517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]
4594517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]
4604517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3
4614517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]
4624517488eSSimon Pilgrim; CHECK:       pred.load.if5:
4634517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP31:%.*]] = or i32 [[INDEX]], 3
4644517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP32:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP31]]
4654517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4
4664517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3
4674517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP35:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP31]]
4684517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4
4694517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3
4704517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE6]]
4714517488eSSimon Pilgrim; CHECK:       pred.load.continue6:
4724517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]
4734517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]
4744517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP40:%.*]] = add nsw <4 x i32> [[TMP39]], [[TMP38]]
4754517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP41:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP40]], <4 x i32> zeroinitializer
4764517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP42]] = or <4 x i32> [[VEC_PHI]], [[TMP41]]
4774517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX_NEXT]] = add i32 [[INDEX]], 4
4784517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4>
4794517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP43:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260
4804517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP43]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
481b8088adaSDavid Green; CHECK:       middle.block:
4824517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP44:%.*]] = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> [[TMP42]])
4834517488eSSimon Pilgrim; CHECK-NEXT:    br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]]
4844517488eSSimon Pilgrim; CHECK:       scalar.ph:
4854517488eSSimon Pilgrim; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
4864517488eSSimon Pilgrim; CHECK:       for.body:
487*9df0b254SNuno Lopes; CHECK-NEXT:    br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
4884517488eSSimon Pilgrim; CHECK:       for.end:
489*9df0b254SNuno Lopes; CHECK-NEXT:    [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP44]], [[MIDDLE_BLOCK]] ]
4904517488eSSimon Pilgrim; CHECK-NEXT:    ret i32 [[RESULT_0_LCSSA]]
491b8088adaSDavid Green;
492b8088adaSDavid Greenentry:
493b8088adaSDavid Green  br label %for.body
494b8088adaSDavid Green
495b8088adaSDavid Greenfor.body:                                         ; preds = %entry, %for.body
496b8088adaSDavid Green  %indvars.iv = phi i32 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
497b8088adaSDavid Green  %result.08 = phi i32 [ %or, %for.body ], [ 0, %entry ]
498b8088adaSDavid Green  %arrayidx = getelementptr inbounds i32, i32* %A, i32 %indvars.iv
499b8088adaSDavid Green  %l0 = load i32, i32* %arrayidx, align 4
500b8088adaSDavid Green  %arrayidx2 = getelementptr inbounds i32, i32* %B, i32 %indvars.iv
501b8088adaSDavid Green  %l1 = load i32, i32* %arrayidx2, align 4
502b8088adaSDavid Green  %add = add nsw i32 %l1, %l0
503b8088adaSDavid Green  %or = or i32 %add, %result.08
504b8088adaSDavid Green  %indvars.iv.next = add i32 %indvars.iv, 1
505b8088adaSDavid Green  %exitcond = icmp eq i32 %indvars.iv.next, 257
506b8088adaSDavid Green  br i1 %exitcond, label %for.end, label %for.body
507b8088adaSDavid Green
508b8088adaSDavid Greenfor.end:                                          ; preds = %for.body, %entry
509b8088adaSDavid Green  %result.0.lcssa = phi i32 [ %or, %for.body ]
510b8088adaSDavid Green  ret i32 %result.0.lcssa
511b8088adaSDavid Green}
512b8088adaSDavid Green
513b8088adaSDavid Greendefine i32 @reduction_xor(i32* nocapture %A, i32* nocapture %B) {
514b8088adaSDavid Green; CHECK-LABEL: @reduction_xor(
5154517488eSSimon Pilgrim; CHECK-NEXT:  entry:
5164517488eSSimon Pilgrim; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
5174517488eSSimon Pilgrim; CHECK:       vector.ph:
5184517488eSSimon Pilgrim; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
519816097e4SDavid Green; CHECK:       vector.body:
5204517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]
5214517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]
5224517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP42:%.*]], [[PRED_LOAD_CONTINUE6]] ]
5234517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult <4 x i32> [[VEC_IND]], <i32 257, i32 257, i32 257, i32 257>
5244517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0
5254517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]
5264517488eSSimon Pilgrim; CHECK:       pred.load.if:
5274517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i32 [[INDEX]]
5284517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4
5294517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0
5304517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i32 [[INDEX]]
5314517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
5324517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0
5334517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE]]
5344517488eSSimon Pilgrim; CHECK:       pred.load.continue:
5354517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]
5364517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]
5374517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1
5384517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]
5394517488eSSimon Pilgrim; CHECK:       pred.load.if1:
5404517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP11:%.*]] = or i32 [[INDEX]], 1
5414517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP11]]
5424517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
5434517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1
5444517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP11]]
5454517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4
5464517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1
5474517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE2]]
5484517488eSSimon Pilgrim; CHECK:       pred.load.continue2:
5494517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]
5504517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]
5514517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2
5524517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]
5534517488eSSimon Pilgrim; CHECK:       pred.load.if3:
5544517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP21:%.*]] = or i32 [[INDEX]], 2
5554517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP22:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP21]]
5564517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
5574517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2
5584517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP25:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP21]]
5594517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4
5604517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2
5614517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE4]]
5624517488eSSimon Pilgrim; CHECK:       pred.load.continue4:
5634517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]
5644517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]
5654517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3
5664517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]
5674517488eSSimon Pilgrim; CHECK:       pred.load.if5:
5684517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP31:%.*]] = or i32 [[INDEX]], 3
5694517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP32:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP31]]
5704517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4
5714517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3
5724517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP35:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[TMP31]]
5734517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4
5744517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3
5754517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE6]]
5764517488eSSimon Pilgrim; CHECK:       pred.load.continue6:
5774517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]
5784517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]
5794517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP40:%.*]] = add nsw <4 x i32> [[TMP39]], [[TMP38]]
5804517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP41:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP40]], <4 x i32> zeroinitializer
5814517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP42]] = xor <4 x i32> [[VEC_PHI]], [[TMP41]]
5824517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX_NEXT]] = add i32 [[INDEX]], 4
5834517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4>
5844517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP43:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260
5854517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP43]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
586b8088adaSDavid Green; CHECK:       middle.block:
5874517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP44:%.*]] = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> [[TMP42]])
5884517488eSSimon Pilgrim; CHECK-NEXT:    br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]]
5894517488eSSimon Pilgrim; CHECK:       scalar.ph:
5904517488eSSimon Pilgrim; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
5914517488eSSimon Pilgrim; CHECK:       for.body:
592*9df0b254SNuno Lopes; CHECK-NEXT:    br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]
5934517488eSSimon Pilgrim; CHECK:       for.end:
594*9df0b254SNuno Lopes; CHECK-NEXT:    [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP44]], [[MIDDLE_BLOCK]] ]
5954517488eSSimon Pilgrim; CHECK-NEXT:    ret i32 [[RESULT_0_LCSSA]]
596b8088adaSDavid Green;
597b8088adaSDavid Greenentry:
598b8088adaSDavid Green  br label %for.body
599b8088adaSDavid Green
600b8088adaSDavid Greenfor.body:                                         ; preds = %entry, %for.body
601b8088adaSDavid Green  %indvars.iv = phi i32 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
602b8088adaSDavid Green  %result.08 = phi i32 [ %xor, %for.body ], [ 0, %entry ]
603b8088adaSDavid Green  %arrayidx = getelementptr inbounds i32, i32* %A, i32 %indvars.iv
604b8088adaSDavid Green  %l0 = load i32, i32* %arrayidx, align 4
605b8088adaSDavid Green  %arrayidx2 = getelementptr inbounds i32, i32* %B, i32 %indvars.iv
606b8088adaSDavid Green  %l1 = load i32, i32* %arrayidx2, align 4
607b8088adaSDavid Green  %add = add nsw i32 %l1, %l0
608b8088adaSDavid Green  %xor = xor i32 %add, %result.08
609b8088adaSDavid Green  %indvars.iv.next = add i32 %indvars.iv, 1
610b8088adaSDavid Green  %exitcond = icmp eq i32 %indvars.iv.next, 257
611b8088adaSDavid Green  br i1 %exitcond, label %for.end, label %for.body
612b8088adaSDavid Green
613b8088adaSDavid Greenfor.end:                                          ; preds = %for.body, %entry
614b8088adaSDavid Green  %result.0.lcssa = phi i32 [ %xor, %for.body ]
615b8088adaSDavid Green  ret i32 %result.0.lcssa
616b8088adaSDavid Green}
617b8088adaSDavid Green
618b8088adaSDavid Greendefine float @reduction_fadd(float* nocapture %A, float* nocapture %B) {
619b8088adaSDavid Green; CHECK-LABEL: @reduction_fadd(
6204517488eSSimon Pilgrim; CHECK-NEXT:  entry:
6214517488eSSimon Pilgrim; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
6224517488eSSimon Pilgrim; CHECK:       vector.ph:
6234517488eSSimon Pilgrim; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
624b8088adaSDavid Green; CHECK:       vector.body:
6254517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]
6264517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]
6274517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_PHI:%.*]] = phi <4 x float> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP42:%.*]], [[PRED_LOAD_CONTINUE6]] ]
6284517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult <4 x i32> [[VEC_IND]], <i32 257, i32 257, i32 257, i32 257>
6294517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0
6304517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]
6314517488eSSimon Pilgrim; CHECK:       pred.load.if:
6324517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds float, float* [[A:%.*]], i32 [[INDEX]]
6334517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[TMP2]], align 4
6344517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <4 x float> poison, float [[TMP3]], i64 0
6354517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds float, float* [[B:%.*]], i32 [[INDEX]]
6364517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP6:%.*]] = load float, float* [[TMP5]], align 4
6374517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <4 x float> poison, float [[TMP6]], i64 0
6384517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE]]
6394517488eSSimon Pilgrim; CHECK:       pred.load.continue:
6404517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP8:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]
6414517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP9:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]
6424517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1
6434517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]
6444517488eSSimon Pilgrim; CHECK:       pred.load.if1:
6454517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP11:%.*]] = or i32 [[INDEX]], 1
6464517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr inbounds float, float* [[A]], i32 [[TMP11]]
6474517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP13:%.*]] = load float, float* [[TMP12]], align 4
6484517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <4 x float> [[TMP8]], float [[TMP13]], i64 1
6494517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds float, float* [[B]], i32 [[TMP11]]
6504517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP16:%.*]] = load float, float* [[TMP15]], align 4
6514517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP17:%.*]] = insertelement <4 x float> [[TMP9]], float [[TMP16]], i64 1
6524517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE2]]
6534517488eSSimon Pilgrim; CHECK:       pred.load.continue2:
6544517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP18:%.*]] = phi <4 x float> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]
6554517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP19:%.*]] = phi <4 x float> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]
6564517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2
6574517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]
6584517488eSSimon Pilgrim; CHECK:       pred.load.if3:
6594517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP21:%.*]] = or i32 [[INDEX]], 2
6604517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP22:%.*]] = getelementptr inbounds float, float* [[A]], i32 [[TMP21]]
6614517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP23:%.*]] = load float, float* [[TMP22]], align 4
6624517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP24:%.*]] = insertelement <4 x float> [[TMP18]], float [[TMP23]], i64 2
6634517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP25:%.*]] = getelementptr inbounds float, float* [[B]], i32 [[TMP21]]
6644517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP26:%.*]] = load float, float* [[TMP25]], align 4
6654517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP27:%.*]] = insertelement <4 x float> [[TMP19]], float [[TMP26]], i64 2
6664517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE4]]
6674517488eSSimon Pilgrim; CHECK:       pred.load.continue4:
6684517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP28:%.*]] = phi <4 x float> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]
6694517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP29:%.*]] = phi <4 x float> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]
6704517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3
6714517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]
6724517488eSSimon Pilgrim; CHECK:       pred.load.if5:
6734517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP31:%.*]] = or i32 [[INDEX]], 3
6744517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP32:%.*]] = getelementptr inbounds float, float* [[A]], i32 [[TMP31]]
6754517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP33:%.*]] = load float, float* [[TMP32]], align 4
6764517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP34:%.*]] = insertelement <4 x float> [[TMP28]], float [[TMP33]], i64 3
6774517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP35:%.*]] = getelementptr inbounds float, float* [[B]], i32 [[TMP31]]
6784517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP36:%.*]] = load float, float* [[TMP35]], align 4
6794517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP37:%.*]] = insertelement <4 x float> [[TMP29]], float [[TMP36]], i64 3
6804517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE6]]
6814517488eSSimon Pilgrim; CHECK:       pred.load.continue6:
6824517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP38:%.*]] = phi <4 x float> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]
6834517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP39:%.*]] = phi <4 x float> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]
6844517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP40:%.*]] = fadd fast <4 x float> [[VEC_PHI]], [[TMP38]]
6854517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP41:%.*]] = fadd fast <4 x float> [[TMP40]], [[TMP39]]
686997ecb00SDavid Sherwood; CHECK-NEXT:    [[TMP42]] = select fast <4 x i1> [[TMP0]], <4 x float> [[TMP41]], <4 x float> [[VEC_PHI]]
6874517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX_NEXT]] = add i32 [[INDEX]], 4
6884517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4>
6894517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP43:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260
6904517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP43]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]
691b8088adaSDavid Green; CHECK:       middle.block:
6924517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP44:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float -0.000000e+00, <4 x float> [[TMP42]])
6934517488eSSimon Pilgrim; CHECK-NEXT:    br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]]
6944517488eSSimon Pilgrim; CHECK:       scalar.ph:
6954517488eSSimon Pilgrim; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
6964517488eSSimon Pilgrim; CHECK:       for.body:
697*9df0b254SNuno Lopes; CHECK-NEXT:    br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]
6984517488eSSimon Pilgrim; CHECK:       for.end:
699*9df0b254SNuno Lopes; CHECK-NEXT:    [[RESULT_0_LCSSA:%.*]] = phi float [ poison, [[FOR_BODY]] ], [ [[TMP44]], [[MIDDLE_BLOCK]] ]
7004517488eSSimon Pilgrim; CHECK-NEXT:    ret float [[RESULT_0_LCSSA]]
701b8088adaSDavid Green;
702b8088adaSDavid Greenentry:
703b8088adaSDavid Green  br label %for.body
704b8088adaSDavid Green
705b8088adaSDavid Greenfor.body:                                         ; preds = %entry, %for.body
706b8088adaSDavid Green  %indvars.iv = phi i32 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
707b8088adaSDavid Green  %result.08 = phi float [ %fadd, %for.body ], [ 0.0, %entry ]
708b8088adaSDavid Green  %arrayidx = getelementptr inbounds float, float* %A, i32 %indvars.iv
709b8088adaSDavid Green  %l0 = load float, float* %arrayidx, align 4
710b8088adaSDavid Green  %arrayidx2 = getelementptr inbounds float, float* %B, i32 %indvars.iv
711b8088adaSDavid Green  %l1 = load float, float* %arrayidx2, align 4
712b8088adaSDavid Green  %add = fadd fast float %result.08, %l0
713b8088adaSDavid Green  %fadd = fadd fast float %add, %l1
714b8088adaSDavid Green  %indvars.iv.next = add i32 %indvars.iv, 1
715b8088adaSDavid Green  %exitcond = icmp eq i32 %indvars.iv.next, 257
716b8088adaSDavid Green  br i1 %exitcond, label %for.end, label %for.body
717b8088adaSDavid Green
718b8088adaSDavid Greenfor.end:                                          ; preds = %for.body, %entry
719b8088adaSDavid Green  %result.0.lcssa = phi float [ %fadd, %for.body ]
720b8088adaSDavid Green  ret float %result.0.lcssa
721b8088adaSDavid Green}
722b8088adaSDavid Green
723b8088adaSDavid Greendefine float @reduction_fmul(float* nocapture %A, float* nocapture %B) {
724b8088adaSDavid Green; CHECK-LABEL: @reduction_fmul(
7254517488eSSimon Pilgrim; CHECK-NEXT:  entry:
7264517488eSSimon Pilgrim; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
7274517488eSSimon Pilgrim; CHECK:       vector.ph:
7284517488eSSimon Pilgrim; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
729b8088adaSDavid Green; CHECK:       vector.body:
7304517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]
7314517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]
7324517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_PHI:%.*]] = phi <4 x float> [ <float 0.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, [[VECTOR_PH]] ], [ [[TMP42:%.*]], [[PRED_LOAD_CONTINUE6]] ]
7334517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult <4 x i32> [[VEC_IND]], <i32 257, i32 257, i32 257, i32 257>
7344517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0
7354517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]
7364517488eSSimon Pilgrim; CHECK:       pred.load.if:
7374517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds float, float* [[A:%.*]], i32 [[INDEX]]
7384517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[TMP2]], align 4
7394517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <4 x float> poison, float [[TMP3]], i64 0
7404517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds float, float* [[B:%.*]], i32 [[INDEX]]
7414517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP6:%.*]] = load float, float* [[TMP5]], align 4
7424517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <4 x float> poison, float [[TMP6]], i64 0
7434517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE]]
7444517488eSSimon Pilgrim; CHECK:       pred.load.continue:
7454517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP8:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]
7464517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP9:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]
7474517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1
7484517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]
7494517488eSSimon Pilgrim; CHECK:       pred.load.if1:
7504517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP11:%.*]] = or i32 [[INDEX]], 1
7514517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr inbounds float, float* [[A]], i32 [[TMP11]]
7524517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP13:%.*]] = load float, float* [[TMP12]], align 4
7534517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <4 x float> [[TMP8]], float [[TMP13]], i64 1
7544517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds float, float* [[B]], i32 [[TMP11]]
7554517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP16:%.*]] = load float, float* [[TMP15]], align 4
7564517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP17:%.*]] = insertelement <4 x float> [[TMP9]], float [[TMP16]], i64 1
7574517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE2]]
7584517488eSSimon Pilgrim; CHECK:       pred.load.continue2:
7594517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP18:%.*]] = phi <4 x float> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]
7604517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP19:%.*]] = phi <4 x float> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]
7614517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2
7624517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]
7634517488eSSimon Pilgrim; CHECK:       pred.load.if3:
7644517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP21:%.*]] = or i32 [[INDEX]], 2
7654517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP22:%.*]] = getelementptr inbounds float, float* [[A]], i32 [[TMP21]]
7664517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP23:%.*]] = load float, float* [[TMP22]], align 4
7674517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP24:%.*]] = insertelement <4 x float> [[TMP18]], float [[TMP23]], i64 2
7684517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP25:%.*]] = getelementptr inbounds float, float* [[B]], i32 [[TMP21]]
7694517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP26:%.*]] = load float, float* [[TMP25]], align 4
7704517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP27:%.*]] = insertelement <4 x float> [[TMP19]], float [[TMP26]], i64 2
7714517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE4]]
7724517488eSSimon Pilgrim; CHECK:       pred.load.continue4:
7734517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP28:%.*]] = phi <4 x float> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]
7744517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP29:%.*]] = phi <4 x float> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]
7754517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3
7764517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]
7774517488eSSimon Pilgrim; CHECK:       pred.load.if5:
7784517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP31:%.*]] = or i32 [[INDEX]], 3
7794517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP32:%.*]] = getelementptr inbounds float, float* [[A]], i32 [[TMP31]]
7804517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP33:%.*]] = load float, float* [[TMP32]], align 4
7814517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP34:%.*]] = insertelement <4 x float> [[TMP28]], float [[TMP33]], i64 3
7824517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP35:%.*]] = getelementptr inbounds float, float* [[B]], i32 [[TMP31]]
7834517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP36:%.*]] = load float, float* [[TMP35]], align 4
7844517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP37:%.*]] = insertelement <4 x float> [[TMP29]], float [[TMP36]], i64 3
7854517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE6]]
7864517488eSSimon Pilgrim; CHECK:       pred.load.continue6:
7874517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP38:%.*]] = phi <4 x float> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]
7884517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP39:%.*]] = phi <4 x float> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]
7894517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP40:%.*]] = fmul fast <4 x float> [[VEC_PHI]], [[TMP38]]
7904517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP41:%.*]] = fmul fast <4 x float> [[TMP40]], [[TMP39]]
791997ecb00SDavid Sherwood; CHECK-NEXT:    [[TMP42]] = select fast <4 x i1> [[TMP0]], <4 x float> [[TMP41]], <4 x float> [[VEC_PHI]]
7924517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX_NEXT]] = add i32 [[INDEX]], 4
7934517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4>
7944517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP43:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260
7954517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP43]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]
796b8088adaSDavid Green; CHECK:       middle.block:
7974517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP44:%.*]] = call fast float @llvm.vector.reduce.fmul.v4f32(float 1.000000e+00, <4 x float> [[TMP42]])
7984517488eSSimon Pilgrim; CHECK-NEXT:    br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]]
7994517488eSSimon Pilgrim; CHECK:       scalar.ph:
8004517488eSSimon Pilgrim; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
8014517488eSSimon Pilgrim; CHECK:       for.body:
802*9df0b254SNuno Lopes; CHECK-NEXT:    br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]
8034517488eSSimon Pilgrim; CHECK:       for.end:
804*9df0b254SNuno Lopes; CHECK-NEXT:    [[RESULT_0_LCSSA:%.*]] = phi float [ poison, [[FOR_BODY]] ], [ [[TMP44]], [[MIDDLE_BLOCK]] ]
8054517488eSSimon Pilgrim; CHECK-NEXT:    ret float [[RESULT_0_LCSSA]]
806b8088adaSDavid Green;
807b8088adaSDavid Greenentry:
808b8088adaSDavid Green  br label %for.body
809b8088adaSDavid Green
810b8088adaSDavid Greenfor.body:                                         ; preds = %entry, %for.body
811b8088adaSDavid Green  %indvars.iv = phi i32 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
812b8088adaSDavid Green  %result.08 = phi float [ %fmul, %for.body ], [ 0.0, %entry ]
813b8088adaSDavid Green  %arrayidx = getelementptr inbounds float, float* %A, i32 %indvars.iv
814b8088adaSDavid Green  %l0 = load float, float* %arrayidx, align 4
815b8088adaSDavid Green  %arrayidx2 = getelementptr inbounds float, float* %B, i32 %indvars.iv
816b8088adaSDavid Green  %l1 = load float, float* %arrayidx2, align 4
817b8088adaSDavid Green  %add = fmul fast float %result.08, %l0
818b8088adaSDavid Green  %fmul = fmul fast float %add, %l1
819b8088adaSDavid Green  %indvars.iv.next = add i32 %indvars.iv, 1
820b8088adaSDavid Green  %exitcond = icmp eq i32 %indvars.iv.next, 257
821b8088adaSDavid Green  br i1 %exitcond, label %for.end, label %for.body
822b8088adaSDavid Green
823b8088adaSDavid Greenfor.end:                                          ; preds = %for.body, %entry
824b8088adaSDavid Green  %result.0.lcssa = phi float [ %fmul, %for.body ]
825b8088adaSDavid Green  ret float %result.0.lcssa
826b8088adaSDavid Green}
827b8088adaSDavid Green
828b8088adaSDavid Greendefine i32 @reduction_min(i32* nocapture %A, i32* nocapture %B) {
829b8088adaSDavid Green; CHECK-LABEL: @reduction_min(
8304517488eSSimon Pilgrim; CHECK-NEXT:  entry:
8314517488eSSimon Pilgrim; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
8324517488eSSimon Pilgrim; CHECK:       vector.ph:
8334517488eSSimon Pilgrim; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
834b8088adaSDavid Green; CHECK:       vector.body:
8354517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]
8364517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]
837a266af72SNikita Popov; CHECK-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i32> [ <i32 1000, i32 1000, i32 1000, i32 1000>, [[VECTOR_PH]] ], [ [[TMP25:%.*]], [[PRED_LOAD_CONTINUE6]] ]
8384517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult <4 x i32> [[VEC_IND]], <i32 257, i32 257, i32 257, i32 257>
8394517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0
8404517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]
8414517488eSSimon Pilgrim; CHECK:       pred.load.if:
8424517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i32 [[INDEX]]
8434517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4
8444517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0
8454517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE]]
8464517488eSSimon Pilgrim; CHECK:       pred.load.continue:
8474517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP5:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]
8484517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1
8494517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP6]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]
8504517488eSSimon Pilgrim; CHECK:       pred.load.if1:
8514517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP7:%.*]] = or i32 [[INDEX]], 1
8524517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP7]]
8534517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
8544517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP10:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i64 1
8554517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE2]]
8564517488eSSimon Pilgrim; CHECK:       pred.load.continue2:
8574517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP11:%.*]] = phi <4 x i32> [ [[TMP5]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP10]], [[PRED_LOAD_IF1]] ]
8584517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP12:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2
8594517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP12]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]
8604517488eSSimon Pilgrim; CHECK:       pred.load.if3:
8614517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP13:%.*]] = or i32 [[INDEX]], 2
8624517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP14:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP13]]
8634517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4
8644517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP15]], i64 2
8654517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE4]]
8664517488eSSimon Pilgrim; CHECK:       pred.load.continue4:
8674517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP17:%.*]] = phi <4 x i32> [ [[TMP11]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP16]], [[PRED_LOAD_IF3]] ]
8684517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP18:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3
8694517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP18]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]
8704517488eSSimon Pilgrim; CHECK:       pred.load.if5:
8714517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP19:%.*]] = or i32 [[INDEX]], 3
8724517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP20:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP19]]
8734517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
8744517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP22:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP21]], i64 3
8754517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE6]]
8764517488eSSimon Pilgrim; CHECK:       pred.load.continue6:
8774517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP23:%.*]] = phi <4 x i32> [ [[TMP17]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP22]], [[PRED_LOAD_IF5]] ]
878a266af72SNikita Popov; CHECK-NEXT:    [[TMP24:%.*]] = call <4 x i32> @llvm.smin.v4i32(<4 x i32> [[VEC_PHI]], <4 x i32> [[TMP23]])
879a266af72SNikita Popov; CHECK-NEXT:    [[TMP25]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP24]], <4 x i32> [[VEC_PHI]]
8804517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX_NEXT]] = add i32 [[INDEX]], 4
8814517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4>
882a266af72SNikita Popov; CHECK-NEXT:    [[TMP26:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260
883a266af72SNikita Popov; CHECK-NEXT:    br i1 [[TMP26]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]
884b8088adaSDavid Green; CHECK:       middle.block:
885a266af72SNikita Popov; CHECK-NEXT:    [[TMP27:%.*]] = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> [[TMP25]])
8864517488eSSimon Pilgrim; CHECK-NEXT:    br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]]
8874517488eSSimon Pilgrim; CHECK:       scalar.ph:
8884517488eSSimon Pilgrim; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
8894517488eSSimon Pilgrim; CHECK:       for.body:
890*9df0b254SNuno Lopes; CHECK-NEXT:    br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]
8914517488eSSimon Pilgrim; CHECK:       for.end:
892*9df0b254SNuno Lopes; CHECK-NEXT:    [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP27]], [[MIDDLE_BLOCK]] ]
8934517488eSSimon Pilgrim; CHECK-NEXT:    ret i32 [[RESULT_0_LCSSA]]
894b8088adaSDavid Green;
895b8088adaSDavid Greenentry:
896b8088adaSDavid Green  br label %for.body
897b8088adaSDavid Green
898b8088adaSDavid Greenfor.body:                                         ; preds = %entry, %for.body
899b8088adaSDavid Green  %indvars.iv = phi i32 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
900b8088adaSDavid Green  %result.08 = phi i32 [ %v0, %for.body ], [ 1000, %entry ]
901b8088adaSDavid Green  %arrayidx = getelementptr inbounds i32, i32* %A, i32 %indvars.iv
902b8088adaSDavid Green  %l0 = load i32, i32* %arrayidx, align 4
903b8088adaSDavid Green  %c0 = icmp slt i32 %result.08, %l0
904b8088adaSDavid Green  %v0 = select i1 %c0, i32 %result.08, i32 %l0
905b8088adaSDavid Green  %indvars.iv.next = add i32 %indvars.iv, 1
906b8088adaSDavid Green  %exitcond = icmp eq i32 %indvars.iv.next, 257
907b8088adaSDavid Green  br i1 %exitcond, label %for.end, label %for.body
908b8088adaSDavid Green
909b8088adaSDavid Greenfor.end:                                          ; preds = %for.body, %entry
910b8088adaSDavid Green  %result.0.lcssa = phi i32 [ %v0, %for.body ]
911b8088adaSDavid Green  ret i32 %result.0.lcssa
912b8088adaSDavid Green}
913b8088adaSDavid Green
914b8088adaSDavid Greendefine i32 @reduction_max(i32* nocapture %A, i32* nocapture %B) {
915b8088adaSDavid Green; CHECK-LABEL: @reduction_max(
9164517488eSSimon Pilgrim; CHECK-NEXT:  entry:
9174517488eSSimon Pilgrim; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
9184517488eSSimon Pilgrim; CHECK:       vector.ph:
9194517488eSSimon Pilgrim; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
920b8088adaSDavid Green; CHECK:       vector.body:
9214517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]
9224517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]
923a266af72SNikita Popov; CHECK-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i32> [ <i32 1000, i32 1000, i32 1000, i32 1000>, [[VECTOR_PH]] ], [ [[TMP25:%.*]], [[PRED_LOAD_CONTINUE6]] ]
9244517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult <4 x i32> [[VEC_IND]], <i32 257, i32 257, i32 257, i32 257>
9254517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0
9264517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]
9274517488eSSimon Pilgrim; CHECK:       pred.load.if:
9284517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i32 [[INDEX]]
9294517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4
9304517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0
9314517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE]]
9324517488eSSimon Pilgrim; CHECK:       pred.load.continue:
9334517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP5:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]
9344517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1
9354517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP6]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]
9364517488eSSimon Pilgrim; CHECK:       pred.load.if1:
9374517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP7:%.*]] = or i32 [[INDEX]], 1
9384517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP7]]
9394517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
9404517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP10:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i64 1
9414517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE2]]
9424517488eSSimon Pilgrim; CHECK:       pred.load.continue2:
9434517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP11:%.*]] = phi <4 x i32> [ [[TMP5]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP10]], [[PRED_LOAD_IF1]] ]
9444517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP12:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2
9454517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP12]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]
9464517488eSSimon Pilgrim; CHECK:       pred.load.if3:
9474517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP13:%.*]] = or i32 [[INDEX]], 2
9484517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP14:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP13]]
9494517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4
9504517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP15]], i64 2
9514517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE4]]
9524517488eSSimon Pilgrim; CHECK:       pred.load.continue4:
9534517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP17:%.*]] = phi <4 x i32> [ [[TMP11]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP16]], [[PRED_LOAD_IF3]] ]
9544517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP18:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3
9554517488eSSimon Pilgrim; CHECK-NEXT:    br i1 [[TMP18]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]
9564517488eSSimon Pilgrim; CHECK:       pred.load.if5:
9574517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP19:%.*]] = or i32 [[INDEX]], 3
9584517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP20:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[TMP19]]
9594517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
9604517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP22:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP21]], i64 3
9614517488eSSimon Pilgrim; CHECK-NEXT:    br label [[PRED_LOAD_CONTINUE6]]
9624517488eSSimon Pilgrim; CHECK:       pred.load.continue6:
9634517488eSSimon Pilgrim; CHECK-NEXT:    [[TMP23:%.*]] = phi <4 x i32> [ [[TMP17]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP22]], [[PRED_LOAD_IF5]] ]
964a266af72SNikita Popov; CHECK-NEXT:    [[TMP24:%.*]] = call <4 x i32> @llvm.umax.v4i32(<4 x i32> [[VEC_PHI]], <4 x i32> [[TMP23]])
965a266af72SNikita Popov; CHECK-NEXT:    [[TMP25]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP24]], <4 x i32> [[VEC_PHI]]
9664517488eSSimon Pilgrim; CHECK-NEXT:    [[INDEX_NEXT]] = add i32 [[INDEX]], 4
9674517488eSSimon Pilgrim; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4>
968a266af72SNikita Popov; CHECK-NEXT:    [[TMP26:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260
969a266af72SNikita Popov; CHECK-NEXT:    br i1 [[TMP26]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]]
970b8088adaSDavid Green; CHECK:       middle.block:
971a266af72SNikita Popov; CHECK-NEXT:    [[TMP27:%.*]] = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> [[TMP25]])
9724517488eSSimon Pilgrim; CHECK-NEXT:    br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]]
9734517488eSSimon Pilgrim; CHECK:       scalar.ph:
9744517488eSSimon Pilgrim; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
9754517488eSSimon Pilgrim; CHECK:       for.body:
976*9df0b254SNuno Lopes; CHECK-NEXT:    br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]]
9774517488eSSimon Pilgrim; CHECK:       for.end:
978*9df0b254SNuno Lopes; CHECK-NEXT:    [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP27]], [[MIDDLE_BLOCK]] ]
9794517488eSSimon Pilgrim; CHECK-NEXT:    ret i32 [[RESULT_0_LCSSA]]
980b8088adaSDavid Green;
981b8088adaSDavid Greenentry:
982b8088adaSDavid Green  br label %for.body
983b8088adaSDavid Green
984b8088adaSDavid Greenfor.body:                                         ; preds = %entry, %for.body
985b8088adaSDavid Green  %indvars.iv = phi i32 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
986b8088adaSDavid Green  %result.08 = phi i32 [ %v0, %for.body ], [ 1000, %entry ]
987b8088adaSDavid Green  %arrayidx = getelementptr inbounds i32, i32* %A, i32 %indvars.iv
988b8088adaSDavid Green  %l0 = load i32, i32* %arrayidx, align 4
989b8088adaSDavid Green  %c0 = icmp ugt i32 %result.08, %l0
990b8088adaSDavid Green  %v0 = select i1 %c0, i32 %result.08, i32 %l0
991b8088adaSDavid Green  %indvars.iv.next = add i32 %indvars.iv, 1
992b8088adaSDavid Green  %exitcond = icmp eq i32 %indvars.iv.next, 257
993b8088adaSDavid Green  br i1 %exitcond, label %for.end, label %for.body
994b8088adaSDavid Green
995b8088adaSDavid Greenfor.end:                                          ; preds = %for.body, %entry
996b8088adaSDavid Green  %result.0.lcssa = phi i32 [ %v0, %for.body ]
997b8088adaSDavid Green  ret i32 %result.0.lcssa
998b8088adaSDavid Green}
999