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