1ec7e4a9aSDavid Green; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 279b1b4a5SSanjay Patel; RUN: opt < %s -loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -prefer-inloop-reductions -dce -instcombine -S | FileCheck %s 3ec7e4a9aSDavid Green 4ec7e4a9aSDavid Greentarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 5ec7e4a9aSDavid Green 62f4c3e80SDavid Greendefine i32 @reduction_sum_single(i32* noalias nocapture %A) { 72f4c3e80SDavid Green; CHECK-LABEL: @reduction_sum_single( 8ec7e4a9aSDavid Green; CHECK-NEXT: entry: 92f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 10ec7e4a9aSDavid Green; CHECK: vector.ph: 11ec7e4a9aSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 12ec7e4a9aSDavid Green; CHECK: vector.body: 13ec7e4a9aSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 14745bf6cfSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP3:%.*]], [[VECTOR_BODY]] ] 152f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 162f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32* [[TMP0]] to <4 x i32>* 172f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4 18322d0afdSAmara Emerson; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]]) 19745bf6cfSDavid Green; CHECK-NEXT: [[TMP3]] = add i32 [[TMP2]], [[VEC_PHI]] 2023c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 21745bf6cfSDavid Green; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 22e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] 23ec7e4a9aSDavid Green; CHECK: middle.block: 242f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 25ec7e4a9aSDavid Green; CHECK: scalar.ph: 262f4c3e80SDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 272f4c3e80SDavid Green; CHECK: .lr.ph: 28*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP2:![0-9]+]] 292f4c3e80SDavid Green; CHECK: ._crit_edge: 30*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP3]], [[MIDDLE_BLOCK]] ] 31ec7e4a9aSDavid Green; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]] 32ec7e4a9aSDavid Green; 33ec7e4a9aSDavid Greenentry: 342f4c3e80SDavid Green br label %.lr.ph 352f4c3e80SDavid Green 362f4c3e80SDavid Green.lr.ph: ; preds = %entry, %.lr.ph 372f4c3e80SDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 382f4c3e80SDavid Green %sum.02 = phi i32 [ %l7, %.lr.ph ], [ 0, %entry ] 392f4c3e80SDavid Green %l2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 402f4c3e80SDavid Green %l3 = load i32, i32* %l2, align 4 412f4c3e80SDavid Green %l7 = add i32 %sum.02, %l3 422f4c3e80SDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 432f4c3e80SDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 442f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 452f4c3e80SDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 462f4c3e80SDavid Green 472f4c3e80SDavid Green._crit_edge: ; preds = %.lr.ph 482f4c3e80SDavid Green %sum.0.lcssa = phi i32 [ %l7, %.lr.ph ] 492f4c3e80SDavid Green ret i32 %sum.0.lcssa 502f4c3e80SDavid Green} 512f4c3e80SDavid Green 522f4c3e80SDavid Greendefine i32 @reduction_sum(i32* noalias nocapture %A, i32* noalias nocapture %B) { 532f4c3e80SDavid Green; CHECK-LABEL: @reduction_sum( 542f4c3e80SDavid Green; CHECK-NEXT: entry: 552f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 562f4c3e80SDavid Green; CHECK: vector.ph: 572f4c3e80SDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 582f4c3e80SDavid Green; CHECK: vector.body: 592f4c3e80SDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 60745bf6cfSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ] 61cc88445aSSanjay Patel; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ] 622f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 632f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32* [[TMP0]] to <4 x i32>* 642f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4 652f4c3e80SDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 662f4c3e80SDavid Green; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32* [[TMP2]] to <4 x i32>* 67cc88445aSSanjay Patel; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, <4 x i32>* [[TMP3]], align 4 68cc88445aSSanjay Patel; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[VEC_IND]]) 69745bf6cfSDavid Green; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[TMP4]], [[VEC_PHI]] 70322d0afdSAmara Emerson; CHECK-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]]) 71745bf6cfSDavid Green; CHECK-NEXT: [[TMP7:%.*]] = add i32 [[TMP6]], [[TMP5]] 72cc88445aSSanjay Patel; CHECK-NEXT: [[TMP8:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD1]]) 73745bf6cfSDavid Green; CHECK-NEXT: [[TMP9]] = add i32 [[TMP8]], [[TMP7]] 7423c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 75cc88445aSSanjay Patel; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4> 76745bf6cfSDavid Green; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 77e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP10]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]] 782f4c3e80SDavid Green; CHECK: middle.block: 792f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 802f4c3e80SDavid Green; CHECK: scalar.ph: 812f4c3e80SDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 822f4c3e80SDavid Green; CHECK: .lr.ph: 83*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP5:![0-9]+]] 842f4c3e80SDavid Green; CHECK: ._crit_edge: 85*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP9]], [[MIDDLE_BLOCK]] ] 862f4c3e80SDavid Green; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]] 872f4c3e80SDavid Green; 882f4c3e80SDavid Greenentry: 892f4c3e80SDavid Green br label %.lr.ph 902f4c3e80SDavid Green 912f4c3e80SDavid Green.lr.ph: ; preds = %entry, %.lr.ph 922f4c3e80SDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 932f4c3e80SDavid Green %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ] 942f4c3e80SDavid Green %l2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 952f4c3e80SDavid Green %l3 = load i32, i32* %l2, align 4 962f4c3e80SDavid Green %l4 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 972f4c3e80SDavid Green %l5 = load i32, i32* %l4, align 4 982f4c3e80SDavid Green %l6 = trunc i64 %indvars.iv to i32 992f4c3e80SDavid Green %l7 = add i32 %sum.02, %l6 1002f4c3e80SDavid Green %l8 = add i32 %l7, %l3 1012f4c3e80SDavid Green %l9 = add i32 %l8, %l5 1022f4c3e80SDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 1032f4c3e80SDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1042f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 1052f4c3e80SDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 1062f4c3e80SDavid Green 1072f4c3e80SDavid Green._crit_edge: ; preds = %.lr.ph 1082f4c3e80SDavid Green %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ] 1092f4c3e80SDavid Green ret i32 %sum.0.lcssa 1102f4c3e80SDavid Green} 1112f4c3e80SDavid Green 1122f4c3e80SDavid Greendefine i32 @reduction_sum_const(i32* noalias nocapture %A) { 1132f4c3e80SDavid Green; CHECK-LABEL: @reduction_sum_const( 1142f4c3e80SDavid Green; CHECK-NEXT: entry: 1152f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 1162f4c3e80SDavid Green; CHECK: vector.ph: 1172f4c3e80SDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 1182f4c3e80SDavid Green; CHECK: vector.body: 1192f4c3e80SDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 120745bf6cfSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP4:%.*]], [[VECTOR_BODY]] ] 1212f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 1222f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32* [[TMP0]] to <4 x i32>* 1232f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4 124322d0afdSAmara Emerson; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]]) 125745bf6cfSDavid Green; CHECK-NEXT: [[TMP3:%.*]] = add i32 [[TMP2]], [[VEC_PHI]] 126745bf6cfSDavid Green; CHECK-NEXT: [[TMP4]] = add i32 [[TMP3]], 12 12723c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 128745bf6cfSDavid Green; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 129e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP5]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]] 1302f4c3e80SDavid Green; CHECK: middle.block: 1312f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 1322f4c3e80SDavid Green; CHECK: scalar.ph: 1332f4c3e80SDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 1342f4c3e80SDavid Green; CHECK: .lr.ph: 135*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP7:![0-9]+]] 1362f4c3e80SDavid Green; CHECK: ._crit_edge: 137*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP4]], [[MIDDLE_BLOCK]] ] 1382f4c3e80SDavid Green; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]] 1392f4c3e80SDavid Green; 1402f4c3e80SDavid Greenentry: 1412f4c3e80SDavid Green br label %.lr.ph 1422f4c3e80SDavid Green 1432f4c3e80SDavid Green.lr.ph: ; preds = %entry, %.lr.ph 1442f4c3e80SDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 1452f4c3e80SDavid Green %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ] 1462f4c3e80SDavid Green %l2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 1472f4c3e80SDavid Green %l3 = load i32, i32* %l2, align 4 1482f4c3e80SDavid Green %l7 = add i32 %sum.02, %l3 1492f4c3e80SDavid Green %l9 = add i32 %l7, 3 1502f4c3e80SDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 1512f4c3e80SDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1522f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 1532f4c3e80SDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 1542f4c3e80SDavid Green 1552f4c3e80SDavid Green._crit_edge: ; preds = %.lr.ph 1562f4c3e80SDavid Green %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ] 1572f4c3e80SDavid Green ret i32 %sum.0.lcssa 1582f4c3e80SDavid Green} 1592f4c3e80SDavid Green 1602f4c3e80SDavid Greendefine i32 @reduction_prod(i32* noalias nocapture %A, i32* noalias nocapture %B) { 1612f4c3e80SDavid Green; CHECK-LABEL: @reduction_prod( 1622f4c3e80SDavid Green; CHECK-NEXT: entry: 1632f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 1642f4c3e80SDavid Green; CHECK: vector.ph: 1652f4c3e80SDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 1662f4c3e80SDavid Green; CHECK: vector.body: 1672f4c3e80SDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 168745bf6cfSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 1, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ] 169cc88445aSSanjay Patel; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ] 1702f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 1712f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32* [[TMP0]] to <4 x i32>* 1722f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4 1732f4c3e80SDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 1742f4c3e80SDavid Green; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32* [[TMP2]] to <4 x i32>* 175cc88445aSSanjay Patel; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, <4 x i32>* [[TMP3]], align 4 176cc88445aSSanjay Patel; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[VEC_IND]]) 177745bf6cfSDavid Green; CHECK-NEXT: [[TMP5:%.*]] = mul i32 [[TMP4]], [[VEC_PHI]] 178322d0afdSAmara Emerson; CHECK-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD]]) 179745bf6cfSDavid Green; CHECK-NEXT: [[TMP7:%.*]] = mul i32 [[TMP6]], [[TMP5]] 180cc88445aSSanjay Patel; CHECK-NEXT: [[TMP8:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD1]]) 181745bf6cfSDavid Green; CHECK-NEXT: [[TMP9]] = mul i32 [[TMP8]], [[TMP7]] 18223c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 183cc88445aSSanjay Patel; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4> 184745bf6cfSDavid Green; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 185e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP10]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]] 1862f4c3e80SDavid Green; CHECK: middle.block: 1872f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 1882f4c3e80SDavid Green; CHECK: scalar.ph: 1892f4c3e80SDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 1902f4c3e80SDavid Green; CHECK: .lr.ph: 191*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP9:![0-9]+]] 1922f4c3e80SDavid Green; CHECK: ._crit_edge: 193*9df0b254SNuno Lopes; CHECK-NEXT: [[PROD_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP9]], [[MIDDLE_BLOCK]] ] 1942f4c3e80SDavid Green; CHECK-NEXT: ret i32 [[PROD_0_LCSSA]] 1952f4c3e80SDavid Green; 1962f4c3e80SDavid Greenentry: 1972f4c3e80SDavid Green br label %.lr.ph 1982f4c3e80SDavid Green 1992f4c3e80SDavid Green.lr.ph: ; preds = %entry, %.lr.ph 2002f4c3e80SDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 2012f4c3e80SDavid Green %prod.02 = phi i32 [ %l9, %.lr.ph ], [ 1, %entry ] 2022f4c3e80SDavid Green %l2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 2032f4c3e80SDavid Green %l3 = load i32, i32* %l2, align 4 2042f4c3e80SDavid Green %l4 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 2052f4c3e80SDavid Green %l5 = load i32, i32* %l4, align 4 2062f4c3e80SDavid Green %l6 = trunc i64 %indvars.iv to i32 2072f4c3e80SDavid Green %l7 = mul i32 %prod.02, %l6 2082f4c3e80SDavid Green %l8 = mul i32 %l7, %l3 2092f4c3e80SDavid Green %l9 = mul i32 %l8, %l5 2102f4c3e80SDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 2112f4c3e80SDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 2122f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 2132f4c3e80SDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 2142f4c3e80SDavid Green 2152f4c3e80SDavid Green._crit_edge: ; preds = %.lr.ph 2162f4c3e80SDavid Green %prod.0.lcssa = phi i32 [ %l9, %.lr.ph ] 2172f4c3e80SDavid Green ret i32 %prod.0.lcssa 2182f4c3e80SDavid Green} 2192f4c3e80SDavid Green 2202f4c3e80SDavid Greendefine i32 @reduction_mix(i32* noalias nocapture %A, i32* noalias nocapture %B) { 2212f4c3e80SDavid Green; CHECK-LABEL: @reduction_mix( 2222f4c3e80SDavid Green; CHECK-NEXT: entry: 2232f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 2242f4c3e80SDavid Green; CHECK: vector.ph: 2252f4c3e80SDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 2262f4c3e80SDavid Green; CHECK: vector.body: 2272f4c3e80SDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 228745bf6cfSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP8:%.*]], [[VECTOR_BODY]] ] 229cc88445aSSanjay Patel; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ] 2302f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 2312f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32* [[TMP0]] to <4 x i32>* 2322f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4 2332f4c3e80SDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 2342f4c3e80SDavid Green; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32* [[TMP2]] to <4 x i32>* 235cc88445aSSanjay Patel; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, <4 x i32>* [[TMP3]], align 4 236cc88445aSSanjay Patel; CHECK-NEXT: [[TMP4:%.*]] = mul nsw <4 x i32> [[WIDE_LOAD1]], [[WIDE_LOAD]] 237cc88445aSSanjay Patel; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[VEC_IND]]) 238745bf6cfSDavid Green; CHECK-NEXT: [[TMP6:%.*]] = add i32 [[TMP5]], [[VEC_PHI]] 239322d0afdSAmara Emerson; CHECK-NEXT: [[TMP7:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP4]]) 240745bf6cfSDavid Green; CHECK-NEXT: [[TMP8]] = add i32 [[TMP7]], [[TMP6]] 24123c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 242cc88445aSSanjay Patel; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4> 243745bf6cfSDavid Green; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 244e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]] 2452f4c3e80SDavid Green; CHECK: middle.block: 2462f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 2472f4c3e80SDavid Green; CHECK: scalar.ph: 2482f4c3e80SDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 2492f4c3e80SDavid Green; CHECK: .lr.ph: 250*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP11:![0-9]+]] 2512f4c3e80SDavid Green; CHECK: ._crit_edge: 252*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP8]], [[MIDDLE_BLOCK]] ] 2532f4c3e80SDavid Green; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]] 2542f4c3e80SDavid Green; 2552f4c3e80SDavid Greenentry: 2562f4c3e80SDavid Green br label %.lr.ph 2572f4c3e80SDavid Green 2582f4c3e80SDavid Green.lr.ph: ; preds = %entry, %.lr.ph 2592f4c3e80SDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 2602f4c3e80SDavid Green %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ] 2612f4c3e80SDavid Green %l2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 2622f4c3e80SDavid Green %l3 = load i32, i32* %l2, align 4 2632f4c3e80SDavid Green %l4 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 2642f4c3e80SDavid Green %l5 = load i32, i32* %l4, align 4 2652f4c3e80SDavid Green %l6 = mul nsw i32 %l5, %l3 2662f4c3e80SDavid Green %l7 = trunc i64 %indvars.iv to i32 2672f4c3e80SDavid Green %l8 = add i32 %sum.02, %l7 2682f4c3e80SDavid Green %l9 = add i32 %l8, %l6 2692f4c3e80SDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 2702f4c3e80SDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 2712f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 2722f4c3e80SDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 2732f4c3e80SDavid Green 2742f4c3e80SDavid Green._crit_edge: ; preds = %.lr.ph 2752f4c3e80SDavid Green %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ] 2762f4c3e80SDavid Green ret i32 %sum.0.lcssa 2772f4c3e80SDavid Green} 2782f4c3e80SDavid Green 2792f4c3e80SDavid Greendefine i32 @reduction_mul(i32* noalias nocapture %A, i32* noalias nocapture %B) { 2802f4c3e80SDavid Green; CHECK-LABEL: @reduction_mul( 2812f4c3e80SDavid Green; CHECK-NEXT: entry: 2822f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 2832f4c3e80SDavid Green; CHECK: vector.ph: 2842f4c3e80SDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 2852f4c3e80SDavid Green; CHECK: vector.body: 2862f4c3e80SDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 287745bf6cfSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 19, [[VECTOR_PH]] ], [ [[TMP7:%.*]], [[VECTOR_BODY]] ] 2882f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 2892f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32* [[TMP0]] to <4 x i32>* 2902f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4 2912f4c3e80SDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 2922f4c3e80SDavid Green; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32* [[TMP2]] to <4 x i32>* 2932f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, <4 x i32>* [[TMP3]], align 4 294322d0afdSAmara Emerson; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD]]) 295745bf6cfSDavid Green; CHECK-NEXT: [[TMP5:%.*]] = mul i32 [[TMP4]], [[VEC_PHI]] 296322d0afdSAmara Emerson; CHECK-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[WIDE_LOAD1]]) 297745bf6cfSDavid Green; CHECK-NEXT: [[TMP7]] = mul i32 [[TMP6]], [[TMP5]] 29823c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 299745bf6cfSDavid Green; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 300e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]] 3012f4c3e80SDavid Green; CHECK: middle.block: 3022f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 3032f4c3e80SDavid Green; CHECK: scalar.ph: 3042f4c3e80SDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 3052f4c3e80SDavid Green; CHECK: .lr.ph: 306*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP13:![0-9]+]] 3072f4c3e80SDavid Green; CHECK: ._crit_edge: 308*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP7]], [[MIDDLE_BLOCK]] ] 3092f4c3e80SDavid Green; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]] 3102f4c3e80SDavid Green; 3112f4c3e80SDavid Greenentry: 3122f4c3e80SDavid Green br label %.lr.ph 3132f4c3e80SDavid Green 3142f4c3e80SDavid Green.lr.ph: ; preds = %entry, %.lr.ph 3152f4c3e80SDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 3162f4c3e80SDavid Green %sum.02 = phi i32 [ %l7, %.lr.ph ], [ 19, %entry ] 3172f4c3e80SDavid Green %l2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 3182f4c3e80SDavid Green %l3 = load i32, i32* %l2, align 4 3192f4c3e80SDavid Green %l4 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 3202f4c3e80SDavid Green %l5 = load i32, i32* %l4, align 4 3212f4c3e80SDavid Green %l6 = mul i32 %sum.02, %l3 3222f4c3e80SDavid Green %l7 = mul i32 %l6, %l5 3232f4c3e80SDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 3242f4c3e80SDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 3252f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 3262f4c3e80SDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 3272f4c3e80SDavid Green 3282f4c3e80SDavid Green._crit_edge: ; preds = %.lr.ph 3292f4c3e80SDavid Green %sum.0.lcssa = phi i32 [ %l7, %.lr.ph ] 3302f4c3e80SDavid Green ret i32 %sum.0.lcssa 3312f4c3e80SDavid Green} 3322f4c3e80SDavid Green 3332f4c3e80SDavid Greendefine i32 @start_at_non_zero(i32* nocapture %in, i32* nocapture %coeff, i32* nocapture %out) { 3342f4c3e80SDavid Green; CHECK-LABEL: @start_at_non_zero( 3352f4c3e80SDavid Green; CHECK-NEXT: entry: 3362f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 3372f4c3e80SDavid Green; CHECK: vector.ph: 3382f4c3e80SDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 3392f4c3e80SDavid Green; CHECK: vector.body: 3402f4c3e80SDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 341745bf6cfSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 120, [[VECTOR_PH]] ], [ [[TMP6:%.*]], [[VECTOR_BODY]] ] 3422f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, i32* [[IN:%.*]], i64 [[INDEX]] 3432f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32* [[TMP0]] to <4 x i32>* 3442f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4 3452f4c3e80SDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[COEFF:%.*]], i64 [[INDEX]] 3462f4c3e80SDavid Green; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32* [[TMP2]] to <4 x i32>* 3472f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, <4 x i32>* [[TMP3]], align 4 3482f4c3e80SDavid Green; CHECK-NEXT: [[TMP4:%.*]] = mul nsw <4 x i32> [[WIDE_LOAD1]], [[WIDE_LOAD]] 349322d0afdSAmara Emerson; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP4]]) 350745bf6cfSDavid Green; CHECK-NEXT: [[TMP6]] = add i32 [[TMP5]], [[VEC_PHI]] 35123c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 352745bf6cfSDavid Green; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 353e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]] 3542f4c3e80SDavid Green; CHECK: middle.block: 3552f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 3562f4c3e80SDavid Green; CHECK: scalar.ph: 3572f4c3e80SDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 3582f4c3e80SDavid Green; CHECK: for.body: 359*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]] 3602f4c3e80SDavid Green; CHECK: for.end: 361*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP6]], [[MIDDLE_BLOCK]] ] 3622f4c3e80SDavid Green; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]] 3632f4c3e80SDavid Green; 3642f4c3e80SDavid Greenentry: 3652f4c3e80SDavid Green br label %for.body 366ec7e4a9aSDavid Green 367ec7e4a9aSDavid Greenfor.body: ; preds = %entry, %for.body 368ec7e4a9aSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 369ec7e4a9aSDavid Green %sum.09 = phi i32 [ %add, %for.body ], [ 120, %entry ] 370ec7e4a9aSDavid Green %arrayidx = getelementptr inbounds i32, i32* %in, i64 %indvars.iv 3712f4c3e80SDavid Green %l0 = load i32, i32* %arrayidx, align 4 372ec7e4a9aSDavid Green %arrayidx2 = getelementptr inbounds i32, i32* %coeff, i64 %indvars.iv 3732f4c3e80SDavid Green %l1 = load i32, i32* %arrayidx2, align 4 3742f4c3e80SDavid Green %mul = mul nsw i32 %l1, %l0 375ec7e4a9aSDavid Green %add = add nsw i32 %mul, %sum.09 376ec7e4a9aSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 377ec7e4a9aSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 3782f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 379ec7e4a9aSDavid Green br i1 %exitcond, label %for.end, label %for.body 380ec7e4a9aSDavid Green 381ec7e4a9aSDavid Greenfor.end: ; preds = %for.body, %entry 3822f4c3e80SDavid Green %sum.0.lcssa = phi i32 [ %add, %for.body ] 383ec7e4a9aSDavid Green ret i32 %sum.0.lcssa 384ec7e4a9aSDavid Green} 385ec7e4a9aSDavid Green 3862f4c3e80SDavid Greendefine i32 @reduction_and(i32* nocapture %A, i32* nocapture %B) { 387ec7e4a9aSDavid Green; CHECK-LABEL: @reduction_and( 388ec7e4a9aSDavid Green; CHECK-NEXT: entry: 3892f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 390ec7e4a9aSDavid Green; CHECK: vector.ph: 391ec7e4a9aSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 392ec7e4a9aSDavid Green; CHECK: vector.body: 393ec7e4a9aSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 394745bf6cfSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ -1, [[VECTOR_PH]] ], [ [[TMP7:%.*]], [[VECTOR_BODY]] ] 3952f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 3962f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32* [[TMP0]] to <4 x i32>* 3972f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4 3982f4c3e80SDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 3992f4c3e80SDavid Green; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32* [[TMP2]] to <4 x i32>* 4002f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, <4 x i32>* [[TMP3]], align 4 401322d0afdSAmara Emerson; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> [[WIDE_LOAD]]) 402745bf6cfSDavid Green; CHECK-NEXT: [[TMP5:%.*]] = and i32 [[TMP4]], [[VEC_PHI]] 403322d0afdSAmara Emerson; CHECK-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> [[WIDE_LOAD1]]) 404745bf6cfSDavid Green; CHECK-NEXT: [[TMP7]] = and i32 [[TMP6]], [[TMP5]] 40523c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 406745bf6cfSDavid Green; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 407e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]] 408ec7e4a9aSDavid Green; CHECK: middle.block: 4092f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 410ec7e4a9aSDavid Green; CHECK: scalar.ph: 411ec7e4a9aSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 412ec7e4a9aSDavid Green; CHECK: for.body: 413*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]] 414ec7e4a9aSDavid Green; CHECK: for.end: 415*9df0b254SNuno Lopes; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP7]], [[MIDDLE_BLOCK]] ] 416ec7e4a9aSDavid Green; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]] 417ec7e4a9aSDavid Green; 418ec7e4a9aSDavid Greenentry: 4192f4c3e80SDavid Green br label %for.body 420ec7e4a9aSDavid Green 421ec7e4a9aSDavid Greenfor.body: ; preds = %entry, %for.body 422ec7e4a9aSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 423ec7e4a9aSDavid Green %result.08 = phi i32 [ %and, %for.body ], [ -1, %entry ] 424ec7e4a9aSDavid Green %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 4252f4c3e80SDavid Green %l0 = load i32, i32* %arrayidx, align 4 426ec7e4a9aSDavid Green %arrayidx2 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 4272f4c3e80SDavid Green %l1 = load i32, i32* %arrayidx2, align 4 4282f4c3e80SDavid Green %add = and i32 %result.08, %l0 4292f4c3e80SDavid Green %and = and i32 %add, %l1 430ec7e4a9aSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 431ec7e4a9aSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 4322f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 433ec7e4a9aSDavid Green br i1 %exitcond, label %for.end, label %for.body 434ec7e4a9aSDavid Green 435ec7e4a9aSDavid Greenfor.end: ; preds = %for.body, %entry 4362f4c3e80SDavid Green %result.0.lcssa = phi i32 [ %and, %for.body ] 437ec7e4a9aSDavid Green ret i32 %result.0.lcssa 438ec7e4a9aSDavid Green} 439ec7e4a9aSDavid Green 4402f4c3e80SDavid Greendefine i32 @reduction_or(i32* nocapture %A, i32* nocapture %B) { 441ec7e4a9aSDavid Green; CHECK-LABEL: @reduction_or( 442ec7e4a9aSDavid Green; CHECK-NEXT: entry: 4432f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 444ec7e4a9aSDavid Green; CHECK: vector.ph: 445ec7e4a9aSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 446ec7e4a9aSDavid Green; CHECK: vector.body: 447ec7e4a9aSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 448745bf6cfSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP6:%.*]], [[VECTOR_BODY]] ] 4492f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 4502f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32* [[TMP0]] to <4 x i32>* 4512f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4 4522f4c3e80SDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 4532f4c3e80SDavid Green; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32* [[TMP2]] to <4 x i32>* 4542f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, <4 x i32>* [[TMP3]], align 4 4552f4c3e80SDavid Green; CHECK-NEXT: [[TMP4:%.*]] = add nsw <4 x i32> [[WIDE_LOAD1]], [[WIDE_LOAD]] 456322d0afdSAmara Emerson; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> [[TMP4]]) 457745bf6cfSDavid Green; CHECK-NEXT: [[TMP6]] = or i32 [[TMP5]], [[VEC_PHI]] 45823c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 459745bf6cfSDavid Green; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 460e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]] 461ec7e4a9aSDavid Green; CHECK: middle.block: 4622f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 463ec7e4a9aSDavid Green; CHECK: scalar.ph: 464ec7e4a9aSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 465ec7e4a9aSDavid Green; CHECK: for.body: 466*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]] 467ec7e4a9aSDavid Green; CHECK: for.end: 468*9df0b254SNuno Lopes; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP6]], [[MIDDLE_BLOCK]] ] 469ec7e4a9aSDavid Green; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]] 470ec7e4a9aSDavid Green; 471ec7e4a9aSDavid Greenentry: 4722f4c3e80SDavid Green br label %for.body 473ec7e4a9aSDavid Green 474ec7e4a9aSDavid Greenfor.body: ; preds = %entry, %for.body 475ec7e4a9aSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 476ec7e4a9aSDavid Green %result.08 = phi i32 [ %or, %for.body ], [ 0, %entry ] 477ec7e4a9aSDavid Green %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 4782f4c3e80SDavid Green %l0 = load i32, i32* %arrayidx, align 4 479ec7e4a9aSDavid Green %arrayidx2 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 4802f4c3e80SDavid Green %l1 = load i32, i32* %arrayidx2, align 4 4812f4c3e80SDavid Green %add = add nsw i32 %l1, %l0 482ec7e4a9aSDavid Green %or = or i32 %add, %result.08 483ec7e4a9aSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 484ec7e4a9aSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 4852f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 486ec7e4a9aSDavid Green br i1 %exitcond, label %for.end, label %for.body 487ec7e4a9aSDavid Green 488ec7e4a9aSDavid Greenfor.end: ; preds = %for.body, %entry 4892f4c3e80SDavid Green %result.0.lcssa = phi i32 [ %or, %for.body ] 490ec7e4a9aSDavid Green ret i32 %result.0.lcssa 491ec7e4a9aSDavid Green} 492ec7e4a9aSDavid Green 4932f4c3e80SDavid Greendefine i32 @reduction_xor(i32* nocapture %A, i32* nocapture %B) { 494ec7e4a9aSDavid Green; CHECK-LABEL: @reduction_xor( 495ec7e4a9aSDavid Green; CHECK-NEXT: entry: 4962f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 497ec7e4a9aSDavid Green; CHECK: vector.ph: 498ec7e4a9aSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 499ec7e4a9aSDavid Green; CHECK: vector.body: 500ec7e4a9aSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 501745bf6cfSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP6:%.*]], [[VECTOR_BODY]] ] 5022f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 5032f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32* [[TMP0]] to <4 x i32>* 5042f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4 5052f4c3e80SDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 5062f4c3e80SDavid Green; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32* [[TMP2]] to <4 x i32>* 5072f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, <4 x i32>* [[TMP3]], align 4 5082f4c3e80SDavid Green; CHECK-NEXT: [[TMP4:%.*]] = add nsw <4 x i32> [[WIDE_LOAD1]], [[WIDE_LOAD]] 509322d0afdSAmara Emerson; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> [[TMP4]]) 510745bf6cfSDavid Green; CHECK-NEXT: [[TMP6]] = xor i32 [[TMP5]], [[VEC_PHI]] 51123c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 512745bf6cfSDavid Green; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 513e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]] 514ec7e4a9aSDavid Green; CHECK: middle.block: 5152f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 516ec7e4a9aSDavid Green; CHECK: scalar.ph: 517ec7e4a9aSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 518ec7e4a9aSDavid Green; CHECK: for.body: 519*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]] 520ec7e4a9aSDavid Green; CHECK: for.end: 521*9df0b254SNuno Lopes; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP6]], [[MIDDLE_BLOCK]] ] 522ec7e4a9aSDavid Green; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]] 523ec7e4a9aSDavid Green; 524ec7e4a9aSDavid Greenentry: 5252f4c3e80SDavid Green br label %for.body 526ec7e4a9aSDavid Green 527ec7e4a9aSDavid Greenfor.body: ; preds = %entry, %for.body 528ec7e4a9aSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 529ec7e4a9aSDavid Green %result.08 = phi i32 [ %xor, %for.body ], [ 0, %entry ] 530ec7e4a9aSDavid Green %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 5312f4c3e80SDavid Green %l0 = load i32, i32* %arrayidx, align 4 532ec7e4a9aSDavid Green %arrayidx2 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 5332f4c3e80SDavid Green %l1 = load i32, i32* %arrayidx2, align 4 5342f4c3e80SDavid Green %add = add nsw i32 %l1, %l0 535ec7e4a9aSDavid Green %xor = xor i32 %add, %result.08 536ec7e4a9aSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 537ec7e4a9aSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 5382f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 539ec7e4a9aSDavid Green br i1 %exitcond, label %for.end, label %for.body 540ec7e4a9aSDavid Green 541ec7e4a9aSDavid Greenfor.end: ; preds = %for.body, %entry 5422f4c3e80SDavid Green %result.0.lcssa = phi i32 [ %xor, %for.body ] 543ec7e4a9aSDavid Green ret i32 %result.0.lcssa 544ec7e4a9aSDavid Green} 545ec7e4a9aSDavid Green 5462f4c3e80SDavid Greendefine float @reduction_fadd(float* nocapture %A, float* nocapture %B) { 547ec7e4a9aSDavid Green; CHECK-LABEL: @reduction_fadd( 548ec7e4a9aSDavid Green; CHECK-NEXT: entry: 5492f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 550ec7e4a9aSDavid Green; CHECK: vector.ph: 551ec7e4a9aSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 552ec7e4a9aSDavid Green; CHECK: vector.body: 553ec7e4a9aSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 5549cd7c534SHuihui Zhang; CHECK-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, [[VECTOR_PH]] ], [ [[TMP5:%.*]], [[VECTOR_BODY]] ] 5552f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds float, float* [[A:%.*]], i64 [[INDEX]] 5562f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast float* [[TMP0]] to <4 x float>* 5572f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, <4 x float>* [[TMP1]], align 4 5582f4c3e80SDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, float* [[B:%.*]], i64 [[INDEX]] 5592f4c3e80SDavid Green; CHECK-NEXT: [[TMP3:%.*]] = bitcast float* [[TMP2]] to <4 x float>* 5602f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x float>, <4 x float>* [[TMP3]], align 4 561dcb8222dSRosie Sumpter; CHECK-NEXT: [[TMP4:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float [[VEC_PHI]], <4 x float> [[WIDE_LOAD]]) 5629cd7c534SHuihui Zhang; CHECK-NEXT: [[TMP5]] = call fast float @llvm.vector.reduce.fadd.v4f32(float [[TMP4]], <4 x float> [[WIDE_LOAD1]]) 56323c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 564dcb8222dSRosie Sumpter; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 565dcb8222dSRosie Sumpter; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]] 566ec7e4a9aSDavid Green; CHECK: middle.block: 5672f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 568ec7e4a9aSDavid Green; CHECK: scalar.ph: 569ec7e4a9aSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 570ec7e4a9aSDavid Green; CHECK: for.body: 571*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP23:![0-9]+]] 572ec7e4a9aSDavid Green; CHECK: for.end: 573*9df0b254SNuno Lopes; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = phi float [ poison, [[FOR_BODY]] ], [ [[TMP5]], [[MIDDLE_BLOCK]] ] 574ec7e4a9aSDavid Green; CHECK-NEXT: ret float [[RESULT_0_LCSSA]] 575ec7e4a9aSDavid Green; 576ec7e4a9aSDavid Greenentry: 5772f4c3e80SDavid Green br label %for.body 578ec7e4a9aSDavid Green 579ec7e4a9aSDavid Greenfor.body: ; preds = %entry, %for.body 580ec7e4a9aSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 581ec7e4a9aSDavid Green %result.08 = phi float [ %fadd, %for.body ], [ 0.0, %entry ] 582ec7e4a9aSDavid Green %arrayidx = getelementptr inbounds float, float* %A, i64 %indvars.iv 5832f4c3e80SDavid Green %l0 = load float, float* %arrayidx, align 4 584ec7e4a9aSDavid Green %arrayidx2 = getelementptr inbounds float, float* %B, i64 %indvars.iv 5852f4c3e80SDavid Green %l1 = load float, float* %arrayidx2, align 4 5862f4c3e80SDavid Green %add = fadd fast float %result.08, %l0 5872f4c3e80SDavid Green %fadd = fadd fast float %add, %l1 588ec7e4a9aSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 589ec7e4a9aSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 5902f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 591ec7e4a9aSDavid Green br i1 %exitcond, label %for.end, label %for.body 592ec7e4a9aSDavid Green 593ec7e4a9aSDavid Greenfor.end: ; preds = %for.body, %entry 5942f4c3e80SDavid Green %result.0.lcssa = phi float [ %fadd, %for.body ] 595ec7e4a9aSDavid Green ret float %result.0.lcssa 596ec7e4a9aSDavid Green} 597ec7e4a9aSDavid Green 5982f4c3e80SDavid Greendefine float @reduction_fmul(float* nocapture %A, float* nocapture %B) { 599ec7e4a9aSDavid Green; CHECK-LABEL: @reduction_fmul( 600ec7e4a9aSDavid Green; CHECK-NEXT: entry: 6012f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 602ec7e4a9aSDavid Green; CHECK: vector.ph: 603ec7e4a9aSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 604ec7e4a9aSDavid Green; CHECK: vector.body: 605ec7e4a9aSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 606745bf6cfSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, [[VECTOR_PH]] ], [ [[TMP7:%.*]], [[VECTOR_BODY]] ] 6072f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds float, float* [[A:%.*]], i64 [[INDEX]] 6082f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast float* [[TMP0]] to <4 x float>* 6092f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, <4 x float>* [[TMP1]], align 4 6102f4c3e80SDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, float* [[B:%.*]], i64 [[INDEX]] 6112f4c3e80SDavid Green; CHECK-NEXT: [[TMP3:%.*]] = bitcast float* [[TMP2]] to <4 x float>* 6122f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x float>, <4 x float>* [[TMP3]], align 4 613322d0afdSAmara Emerson; CHECK-NEXT: [[TMP4:%.*]] = call fast float @llvm.vector.reduce.fmul.v4f32(float 1.000000e+00, <4 x float> [[WIDE_LOAD]]) 614dcb8222dSRosie Sumpter; CHECK-NEXT: [[TMP5:%.*]] = fmul fast float [[TMP4]], [[VEC_PHI]] 615322d0afdSAmara Emerson; CHECK-NEXT: [[TMP6:%.*]] = call fast float @llvm.vector.reduce.fmul.v4f32(float 1.000000e+00, <4 x float> [[WIDE_LOAD1]]) 616dcb8222dSRosie Sumpter; CHECK-NEXT: [[TMP7]] = fmul fast float [[TMP6]], [[TMP5]] 61723c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 618745bf6cfSDavid Green; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 619e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]] 620ec7e4a9aSDavid Green; CHECK: middle.block: 6212f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 622ec7e4a9aSDavid Green; CHECK: scalar.ph: 623ec7e4a9aSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 624ec7e4a9aSDavid Green; CHECK: for.body: 625*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP25:![0-9]+]] 626ec7e4a9aSDavid Green; CHECK: for.end: 627*9df0b254SNuno Lopes; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = phi float [ poison, [[FOR_BODY]] ], [ [[TMP7]], [[MIDDLE_BLOCK]] ] 628ec7e4a9aSDavid Green; CHECK-NEXT: ret float [[RESULT_0_LCSSA]] 629ec7e4a9aSDavid Green; 630ec7e4a9aSDavid Greenentry: 6312f4c3e80SDavid Green br label %for.body 632ec7e4a9aSDavid Green 633ec7e4a9aSDavid Greenfor.body: ; preds = %entry, %for.body 634ec7e4a9aSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 635ec7e4a9aSDavid Green %result.08 = phi float [ %fmul, %for.body ], [ 0.0, %entry ] 636ec7e4a9aSDavid Green %arrayidx = getelementptr inbounds float, float* %A, i64 %indvars.iv 6372f4c3e80SDavid Green %l0 = load float, float* %arrayidx, align 4 638ec7e4a9aSDavid Green %arrayidx2 = getelementptr inbounds float, float* %B, i64 %indvars.iv 6392f4c3e80SDavid Green %l1 = load float, float* %arrayidx2, align 4 6402f4c3e80SDavid Green %add = fmul fast float %result.08, %l0 6412f4c3e80SDavid Green %fmul = fmul fast float %add, %l1 642ec7e4a9aSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 643ec7e4a9aSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 6442f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 645ec7e4a9aSDavid Green br i1 %exitcond, label %for.end, label %for.body 646ec7e4a9aSDavid Green 647ec7e4a9aSDavid Greenfor.end: ; preds = %for.body, %entry 6482f4c3e80SDavid Green %result.0.lcssa = phi float [ %fmul, %for.body ] 649ec7e4a9aSDavid Green ret float %result.0.lcssa 650ec7e4a9aSDavid Green} 651ec7e4a9aSDavid Green 6522f4c3e80SDavid Greendefine i32 @reduction_min(i32* nocapture %A, i32* nocapture %B) { 653ec7e4a9aSDavid Green; CHECK-LABEL: @reduction_min( 654ec7e4a9aSDavid Green; CHECK-NEXT: entry: 6552f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 656ec7e4a9aSDavid Green; CHECK: vector.ph: 657ec7e4a9aSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 658ec7e4a9aSDavid Green; CHECK: vector.body: 659ec7e4a9aSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 660a266af72SNikita Popov; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 1000, [[VECTOR_PH]] ], [ [[TMP3:%.*]], [[VECTOR_BODY]] ] 6612f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 6622f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32* [[TMP0]] to <4 x i32>* 6632f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4 664322d0afdSAmara Emerson; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> [[WIDE_LOAD]]) 665a266af72SNikita Popov; CHECK-NEXT: [[TMP3]] = call i32 @llvm.smin.i32(i32 [[TMP2]], i32 [[VEC_PHI]]) 66623c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 667a266af72SNikita Popov; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 668a266af72SNikita Popov; CHECK-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP26:![0-9]+]] 669ec7e4a9aSDavid Green; CHECK: middle.block: 6702f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 671ec7e4a9aSDavid Green; CHECK: scalar.ph: 672ec7e4a9aSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 673ec7e4a9aSDavid Green; CHECK: for.body: 674*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP27:![0-9]+]] 675ec7e4a9aSDavid Green; CHECK: for.end: 676*9df0b254SNuno Lopes; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP3]], [[MIDDLE_BLOCK]] ] 677ec7e4a9aSDavid Green; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]] 678ec7e4a9aSDavid Green; 679ec7e4a9aSDavid Greenentry: 6802f4c3e80SDavid Green br label %for.body 681ec7e4a9aSDavid Green 682ec7e4a9aSDavid Greenfor.body: ; preds = %entry, %for.body 683ec7e4a9aSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 684ec7e4a9aSDavid Green %result.08 = phi i32 [ %v0, %for.body ], [ 1000, %entry ] 685ec7e4a9aSDavid Green %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 6862f4c3e80SDavid Green %l0 = load i32, i32* %arrayidx, align 4 6872f4c3e80SDavid Green %c0 = icmp slt i32 %result.08, %l0 6882f4c3e80SDavid Green %v0 = select i1 %c0, i32 %result.08, i32 %l0 689ec7e4a9aSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 690ec7e4a9aSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 6912f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 692ec7e4a9aSDavid Green br i1 %exitcond, label %for.end, label %for.body 693ec7e4a9aSDavid Green 694ec7e4a9aSDavid Greenfor.end: ; preds = %for.body, %entry 6952f4c3e80SDavid Green %result.0.lcssa = phi i32 [ %v0, %for.body ] 696ec7e4a9aSDavid Green ret i32 %result.0.lcssa 697ec7e4a9aSDavid Green} 698ec7e4a9aSDavid Green 6992f4c3e80SDavid Greendefine i32 @reduction_max(i32* nocapture %A, i32* nocapture %B) { 700ec7e4a9aSDavid Green; CHECK-LABEL: @reduction_max( 701ec7e4a9aSDavid Green; CHECK-NEXT: entry: 7022f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 703ec7e4a9aSDavid Green; CHECK: vector.ph: 704ec7e4a9aSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 705ec7e4a9aSDavid Green; CHECK: vector.body: 706ec7e4a9aSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 707a266af72SNikita Popov; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 1000, [[VECTOR_PH]] ], [ [[TMP3:%.*]], [[VECTOR_BODY]] ] 7082f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 7092f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32* [[TMP0]] to <4 x i32>* 7102f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4 711322d0afdSAmara Emerson; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> [[WIDE_LOAD]]) 712a266af72SNikita Popov; CHECK-NEXT: [[TMP3]] = call i32 @llvm.umax.i32(i32 [[TMP2]], i32 [[VEC_PHI]]) 71323c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 714a266af72SNikita Popov; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 715a266af72SNikita Popov; CHECK-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]] 716ec7e4a9aSDavid Green; CHECK: middle.block: 7172f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 718ec7e4a9aSDavid Green; CHECK: scalar.ph: 719ec7e4a9aSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 720ec7e4a9aSDavid Green; CHECK: for.body: 721*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP29:![0-9]+]] 722ec7e4a9aSDavid Green; CHECK: for.end: 723*9df0b254SNuno Lopes; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP3]], [[MIDDLE_BLOCK]] ] 724ec7e4a9aSDavid Green; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]] 725ec7e4a9aSDavid Green; 726ec7e4a9aSDavid Greenentry: 7272f4c3e80SDavid Green br label %for.body 728ec7e4a9aSDavid Green 729ec7e4a9aSDavid Greenfor.body: ; preds = %entry, %for.body 730ec7e4a9aSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 731ec7e4a9aSDavid Green %result.08 = phi i32 [ %v0, %for.body ], [ 1000, %entry ] 732ec7e4a9aSDavid Green %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 7332f4c3e80SDavid Green %l0 = load i32, i32* %arrayidx, align 4 7342f4c3e80SDavid Green %c0 = icmp ugt i32 %result.08, %l0 7352f4c3e80SDavid Green %v0 = select i1 %c0, i32 %result.08, i32 %l0 736ec7e4a9aSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 737ec7e4a9aSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 7382f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 739ec7e4a9aSDavid Green br i1 %exitcond, label %for.end, label %for.body 740ec7e4a9aSDavid Green 741ec7e4a9aSDavid Greenfor.end: ; preds = %for.body, %entry 7422f4c3e80SDavid Green %result.0.lcssa = phi i32 [ %v0, %for.body ] 743ec7e4a9aSDavid Green ret i32 %result.0.lcssa 744ec7e4a9aSDavid Green} 745ec7e4a9aSDavid Green 746ec7e4a9aSDavid Green; Sub we can create a reduction, but not inloop 7472f4c3e80SDavid Greendefine i32 @reduction_sub_lhs(i32* noalias nocapture %A) { 748ec7e4a9aSDavid Green; CHECK-LABEL: @reduction_sub_lhs( 749ec7e4a9aSDavid Green; CHECK-NEXT: entry: 7502f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 751ec7e4a9aSDavid Green; CHECK: vector.ph: 752ec7e4a9aSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 753ec7e4a9aSDavid Green; CHECK: vector.body: 754ec7e4a9aSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 7552f4c3e80SDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP2:%.*]], [[VECTOR_BODY]] ] 7562f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 7572f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32* [[TMP0]] to <4 x i32>* 7582f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4 7592f4c3e80SDavid Green; CHECK-NEXT: [[TMP2]] = sub <4 x i32> [[VEC_PHI]], [[WIDE_LOAD]] 76023c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 7612f4c3e80SDavid Green; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 762e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP3]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP30:![0-9]+]] 763ec7e4a9aSDavid Green; CHECK: middle.block: 764322d0afdSAmara Emerson; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP2]]) 7652f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 766ec7e4a9aSDavid Green; CHECK: scalar.ph: 767ec7e4a9aSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 768ec7e4a9aSDavid Green; CHECK: for.body: 769*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP31:![0-9]+]] 770ec7e4a9aSDavid Green; CHECK: for.end: 771*9df0b254SNuno Lopes; CHECK-NEXT: [[X_0_LCSSA:%.*]] = phi i32 [ poison, [[FOR_BODY]] ], [ [[TMP4]], [[MIDDLE_BLOCK]] ] 772ec7e4a9aSDavid Green; CHECK-NEXT: ret i32 [[X_0_LCSSA]] 773ec7e4a9aSDavid Green; 774ec7e4a9aSDavid Greenentry: 7752f4c3e80SDavid Green br label %for.body 776ec7e4a9aSDavid Green 777ec7e4a9aSDavid Greenfor.body: ; preds = %entry, %for.body 778ec7e4a9aSDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 779ec7e4a9aSDavid Green %x.05 = phi i32 [ %sub, %for.body ], [ 0, %entry ] 780ec7e4a9aSDavid Green %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 7812f4c3e80SDavid Green %l0 = load i32, i32* %arrayidx, align 4 7822f4c3e80SDavid Green %sub = sub nsw i32 %x.05, %l0 783ec7e4a9aSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 784ec7e4a9aSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 7852f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 786ec7e4a9aSDavid Green br i1 %exitcond, label %for.end, label %for.body 787ec7e4a9aSDavid Green 788ec7e4a9aSDavid Greenfor.end: ; preds = %for.body, %entry 7892f4c3e80SDavid Green %x.0.lcssa = phi i32 [ %sub, %for.body ] 790ec7e4a9aSDavid Green ret i32 %x.0.lcssa 791ec7e4a9aSDavid Green} 792ec7e4a9aSDavid Green 793ec7e4a9aSDavid Green; Conditional reductions with multi-input phis. 794ec7e4a9aSDavid Greendefine float @reduction_conditional(float* %A, float* %B, float* %C, float %S) { 795ec7e4a9aSDavid Green; CHECK-LABEL: @reduction_conditional( 796ec7e4a9aSDavid Green; CHECK-NEXT: entry: 797ec7e4a9aSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 798ec7e4a9aSDavid Green; CHECK: vector.ph: 799e6ad9ef4SPhilip Reames; CHECK-NEXT: [[TMP0:%.*]] = insertelement <4 x float> <float poison, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, float [[S:%.*]], i64 0 800ec7e4a9aSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 801ec7e4a9aSDavid Green; CHECK: vector.body: 802ec7e4a9aSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 803ec7e4a9aSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x float> [ [[TMP0]], [[VECTOR_PH]] ], [ [[PREDPHI3:%.*]], [[VECTOR_BODY]] ] 804ec7e4a9aSDavid Green; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, float* [[A:%.*]], i64 [[INDEX]] 805ec7e4a9aSDavid Green; CHECK-NEXT: [[TMP2:%.*]] = bitcast float* [[TMP1]] to <4 x float>* 806ec7e4a9aSDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, <4 x float>* [[TMP2]], align 4 807ec7e4a9aSDavid Green; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds float, float* [[B:%.*]], i64 [[INDEX]] 808ec7e4a9aSDavid Green; CHECK-NEXT: [[TMP4:%.*]] = bitcast float* [[TMP3]] to <4 x float>* 809ec7e4a9aSDavid Green; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x float>, <4 x float>* [[TMP4]], align 4 810ec7e4a9aSDavid Green; CHECK-NEXT: [[TMP5:%.*]] = fcmp ogt <4 x float> [[WIDE_LOAD]], [[WIDE_LOAD1]] 811ec7e4a9aSDavid Green; CHECK-NEXT: [[TMP6:%.*]] = fcmp ule <4 x float> [[WIDE_LOAD1]], <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00> 812ec7e4a9aSDavid Green; CHECK-NEXT: [[TMP7:%.*]] = fcmp ogt <4 x float> [[WIDE_LOAD]], <float 2.000000e+00, float 2.000000e+00, float 2.000000e+00, float 2.000000e+00> 813ed253ef7SJuneyoung Lee; CHECK-NEXT: [[TMP8:%.*]] = and <4 x i1> [[TMP5]], [[TMP6]] 814ed253ef7SJuneyoung Lee; CHECK-NEXT: [[TMP9:%.*]] = and <4 x i1> [[TMP8]], [[TMP7]] 815ec7e4a9aSDavid Green; CHECK-NEXT: [[TMP10:%.*]] = xor <4 x i1> [[TMP7]], <i1 true, i1 true, i1 true, i1 true> 816ec7e4a9aSDavid Green; CHECK-NEXT: [[TMP11:%.*]] = and <4 x i1> [[TMP8]], [[TMP10]] 817ec7e4a9aSDavid Green; CHECK-NEXT: [[TMP12:%.*]] = xor <4 x i1> [[TMP5]], <i1 true, i1 true, i1 true, i1 true> 818ec7e4a9aSDavid Green; CHECK-NEXT: [[PREDPHI_V:%.*]] = select <4 x i1> [[TMP9]], <4 x float> [[WIDE_LOAD1]], <4 x float> [[WIDE_LOAD]] 8198a156d1cSJuneyoung Lee; CHECK-NEXT: [[TMP13:%.*]] = select <4 x i1> [[TMP12]], <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i1> [[TMP11]] 8209cd7c534SHuihui Zhang; CHECK-NEXT: [[PREDPHI2:%.*]] = select <4 x i1> [[TMP13]], <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, <4 x float> [[PREDPHI_V]] 8219cd7c534SHuihui Zhang; CHECK-NEXT: [[PREDPHI3]] = fadd fast <4 x float> [[VEC_PHI]], [[PREDPHI2]] 82223c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 823ec7e4a9aSDavid Green; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], 128 824e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP32:![0-9]+]] 825ec7e4a9aSDavid Green; CHECK: middle.block: 82620b386aaSNikita Popov; CHECK-NEXT: [[TMP15:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float -0.000000e+00, <4 x float> [[PREDPHI3]]) 827ec7e4a9aSDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 828ec7e4a9aSDavid Green; CHECK: scalar.ph: 829ec7e4a9aSDavid Green; CHECK-NEXT: br label [[FOR_BODY:%.*]] 830ec7e4a9aSDavid Green; CHECK: for.body: 831*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[IF_THEN:%.*]], label [[FOR_INC:%.*]] 832ec7e4a9aSDavid Green; CHECK: if.then: 833*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[IF_THEN8:%.*]], label [[IF_ELSE:%.*]] 834ec7e4a9aSDavid Green; CHECK: if.then8: 835ec7e4a9aSDavid Green; CHECK-NEXT: br label [[FOR_INC]] 836ec7e4a9aSDavid Green; CHECK: if.else: 837*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[IF_THEN16:%.*]], label [[FOR_INC]] 838ec7e4a9aSDavid Green; CHECK: if.then16: 839ec7e4a9aSDavid Green; CHECK-NEXT: br label [[FOR_INC]] 840ec7e4a9aSDavid Green; CHECK: for.inc: 841*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[FOR_BODY]], label [[FOR_END]], !llvm.loop [[LOOP33:![0-9]+]] 842ec7e4a9aSDavid Green; CHECK: for.end: 843*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_1_LCSSA:%.*]] = phi float [ poison, [[FOR_INC]] ], [ [[TMP15]], [[MIDDLE_BLOCK]] ] 844ec7e4a9aSDavid Green; CHECK-NEXT: ret float [[SUM_1_LCSSA]] 845ec7e4a9aSDavid Green; 846ec7e4a9aSDavid Greenentry: 847ec7e4a9aSDavid Green br label %for.body 848ec7e4a9aSDavid Green 849ec7e4a9aSDavid Greenfor.body: 850ec7e4a9aSDavid Green %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.inc ] 851ec7e4a9aSDavid Green %sum.033 = phi float [ %S, %entry ], [ %sum.1, %for.inc ] 852ec7e4a9aSDavid Green %arrayidx = getelementptr inbounds float, float* %A, i64 %indvars.iv 8532f4c3e80SDavid Green %l0 = load float, float* %arrayidx, align 4 854ec7e4a9aSDavid Green %arrayidx2 = getelementptr inbounds float, float* %B, i64 %indvars.iv 8552f4c3e80SDavid Green %l1 = load float, float* %arrayidx2, align 4 8562f4c3e80SDavid Green %cmp3 = fcmp ogt float %l0, %l1 857ec7e4a9aSDavid Green br i1 %cmp3, label %if.then, label %for.inc 858ec7e4a9aSDavid Green 859ec7e4a9aSDavid Greenif.then: 8602f4c3e80SDavid Green %cmp6 = fcmp ogt float %l1, 1.000000e+00 861ec7e4a9aSDavid Green br i1 %cmp6, label %if.then8, label %if.else 862ec7e4a9aSDavid Green 863ec7e4a9aSDavid Greenif.then8: 8642f4c3e80SDavid Green %add = fadd fast float %sum.033, %l0 865ec7e4a9aSDavid Green br label %for.inc 866ec7e4a9aSDavid Green 867ec7e4a9aSDavid Greenif.else: 8682f4c3e80SDavid Green %cmp14 = fcmp ogt float %l0, 2.000000e+00 869ec7e4a9aSDavid Green br i1 %cmp14, label %if.then16, label %for.inc 870ec7e4a9aSDavid Green 871ec7e4a9aSDavid Greenif.then16: 8722f4c3e80SDavid Green %add19 = fadd fast float %sum.033, %l1 873ec7e4a9aSDavid Green br label %for.inc 874ec7e4a9aSDavid Green 875ec7e4a9aSDavid Greenfor.inc: 876ec7e4a9aSDavid Green %sum.1 = phi float [ %add, %if.then8 ], [ %add19, %if.then16 ], [ %sum.033, %if.else ], [ %sum.033, %for.body ] 877ec7e4a9aSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 878ec7e4a9aSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 879ec7e4a9aSDavid Green %exitcond = icmp ne i32 %lftr.wideiv, 128 880ec7e4a9aSDavid Green br i1 %exitcond, label %for.body, label %for.end 881ec7e4a9aSDavid Green 882ec7e4a9aSDavid Greenfor.end: 883ec7e4a9aSDavid Green %sum.1.lcssa = phi float [ %sum.1, %for.inc ] 884ec7e4a9aSDavid Green ret float %sum.1.lcssa 885ec7e4a9aSDavid Green} 886ec7e4a9aSDavid Green 8872f4c3e80SDavid Greendefine i32 @reduction_sum_multiuse(i32* noalias nocapture %A, i32* noalias nocapture %B) { 888ec7e4a9aSDavid Green; CHECK-LABEL: @reduction_sum_multiuse( 8892f4c3e80SDavid Green; CHECK-NEXT: entry: 890ec7e4a9aSDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 891ec7e4a9aSDavid Green; CHECK: .lr.ph: 8922f4c3e80SDavid Green; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[DOTLR_PH]] ], [ 0, [[ENTRY:%.*]] ] 8932f4c3e80SDavid Green; CHECK-NEXT: [[SUM_02:%.*]] = phi i32 [ [[L10:%.*]], [[DOTLR_PH]] ], [ 0, [[ENTRY]] ] 8942f4c3e80SDavid Green; CHECK-NEXT: [[L2:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]] 8952f4c3e80SDavid Green; CHECK-NEXT: [[L3:%.*]] = load i32, i32* [[L2]], align 4 8962f4c3e80SDavid Green; CHECK-NEXT: [[L6:%.*]] = trunc i64 [[INDVARS_IV]] to i32 8972f4c3e80SDavid Green; CHECK-NEXT: [[L7:%.*]] = add i32 [[SUM_02]], [[L6]] 8982f4c3e80SDavid Green; CHECK-NEXT: [[L8:%.*]] = add i32 [[L7]], [[L3]] 8992f4c3e80SDavid Green; CHECK-NEXT: [[L10]] = add i32 [[L8]], [[SUM_02]] 900ec7e4a9aSDavid Green; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1 901cc88445aSSanjay Patel; CHECK-NEXT: [[TMP0:%.*]] = and i64 [[INDVARS_IV_NEXT]], 4294967295 902cc88445aSSanjay Patel; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[TMP0]], 256 9032f4c3e80SDavid Green; CHECK-NEXT: br i1 [[EXITCOND]], label [[END:%.*]], label [[DOTLR_PH]] 904ec7e4a9aSDavid Green; CHECK: end: 9052f4c3e80SDavid Green; CHECK-NEXT: ret i32 [[L10]] 906ec7e4a9aSDavid Green; 9072f4c3e80SDavid Greenentry: 908ec7e4a9aSDavid Green br label %.lr.ph 909ec7e4a9aSDavid Green 9102f4c3e80SDavid Green.lr.ph: ; preds = %entry, %.lr.ph 9112f4c3e80SDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 9122f4c3e80SDavid Green %sum.02 = phi i32 [ %l10, %.lr.ph ], [ 0, %entry ] 9132f4c3e80SDavid Green %l2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 9142f4c3e80SDavid Green %l3 = load i32, i32* %l2, align 4 9152f4c3e80SDavid Green %l4 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 9162f4c3e80SDavid Green %l5 = load i32, i32* %l4, align 4 9172f4c3e80SDavid Green %l6 = trunc i64 %indvars.iv to i32 9182f4c3e80SDavid Green %l7 = add i32 %sum.02, %l6 9192f4c3e80SDavid Green %l8 = add i32 %l7, %l3 9202f4c3e80SDavid Green %l9 = add i32 %l8, %l5 9212f4c3e80SDavid Green %l10 = add i32 %l8, %sum.02 922ec7e4a9aSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 923ec7e4a9aSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 9242f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 9252f4c3e80SDavid Green br i1 %exitcond, label %end, label %.lr.ph 926ec7e4a9aSDavid Green 927ec7e4a9aSDavid Greenend: 9282f4c3e80SDavid Green %f1 = phi i32 [ %l10, %.lr.ph ] 9292f4c3e80SDavid Green ret i32 %f1 930ec7e4a9aSDavid Green} 931ec7e4a9aSDavid Green 932ec7e4a9aSDavid Green; Predicated loop, cannot (yet) use in-loop reductions. 9332f4c3e80SDavid Greendefine i32 @reduction_predicated(i32* noalias nocapture %A, i32* noalias nocapture %B) { 934ec7e4a9aSDavid Green; CHECK-LABEL: @reduction_predicated( 9352f4c3e80SDavid Green; CHECK-NEXT: entry: 936ec7e4a9aSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 937ec7e4a9aSDavid Green; CHECK: vector.ph: 938ec7e4a9aSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 939ec7e4a9aSDavid Green; CHECK: vector.body: 9402f4c3e80SDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 941745bf6cfSDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ] 942cc88445aSSanjay Patel; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ] 9432f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDEX]] 9442f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32* [[TMP0]] to <4 x i32>* 9452f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4 9462f4c3e80SDavid Green; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDEX]] 9472f4c3e80SDavid Green; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32* [[TMP2]] to <4 x i32>* 948cc88445aSSanjay Patel; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, <4 x i32>* [[TMP3]], align 4 949cc88445aSSanjay Patel; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[VEC_IND]]) 950745bf6cfSDavid Green; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[TMP4]], [[VEC_PHI]] 951322d0afdSAmara Emerson; CHECK-NEXT: [[TMP6:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD]]) 952745bf6cfSDavid Green; CHECK-NEXT: [[TMP7:%.*]] = add i32 [[TMP6]], [[TMP5]] 953cc88445aSSanjay Patel; CHECK-NEXT: [[TMP8:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[WIDE_LOAD1]]) 954745bf6cfSDavid Green; CHECK-NEXT: [[TMP9]] = add i32 [[TMP8]], [[TMP7]] 95523c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 956cc88445aSSanjay Patel; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 4, i32 4, i32 4, i32 4> 957745bf6cfSDavid Green; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 958e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP10]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP34:![0-9]+]] 959ec7e4a9aSDavid Green; CHECK: middle.block: 9602f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 961ec7e4a9aSDavid Green; CHECK: scalar.ph: 962ec7e4a9aSDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 963ec7e4a9aSDavid Green; CHECK: .lr.ph: 964*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP35:![0-9]+]] 965ec7e4a9aSDavid Green; CHECK: ._crit_edge: 966*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i32 [ poison, [[DOTLR_PH]] ], [ [[TMP9]], [[MIDDLE_BLOCK]] ] 967ec7e4a9aSDavid Green; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]] 968ec7e4a9aSDavid Green; 9692f4c3e80SDavid Greenentry: 9702f4c3e80SDavid Green br label %.lr.ph 971ec7e4a9aSDavid Green 9722f4c3e80SDavid Green.lr.ph: ; preds = %entry, %.lr.ph 9732f4c3e80SDavid Green %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 9742f4c3e80SDavid Green %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ] 9752f4c3e80SDavid Green %l2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 9762f4c3e80SDavid Green %l3 = load i32, i32* %l2, align 4 9772f4c3e80SDavid Green %l4 = getelementptr inbounds i32, i32* %B, i64 %indvars.iv 9782f4c3e80SDavid Green %l5 = load i32, i32* %l4, align 4 9792f4c3e80SDavid Green %l6 = trunc i64 %indvars.iv to i32 9802f4c3e80SDavid Green %l7 = add i32 %sum.02, %l6 9812f4c3e80SDavid Green %l8 = add i32 %l7, %l3 9822f4c3e80SDavid Green %l9 = add i32 %l8, %l5 983ec7e4a9aSDavid Green %indvars.iv.next = add i64 %indvars.iv, 1 984ec7e4a9aSDavid Green %lftr.wideiv = trunc i64 %indvars.iv.next to i32 9852f4c3e80SDavid Green %exitcond = icmp eq i32 %lftr.wideiv, 256 986ec7e4a9aSDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph, !llvm.loop !6 987ec7e4a9aSDavid Green 9882f4c3e80SDavid Green._crit_edge: ; preds = %.lr.ph 9892f4c3e80SDavid Green %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ] 990ec7e4a9aSDavid Green ret i32 %sum.0.lcssa 991ec7e4a9aSDavid Green} 992ec7e4a9aSDavid Green 9932f4c3e80SDavid Greendefine i8 @reduction_add_trunc(i8* noalias nocapture %A) { 9942f4c3e80SDavid Green; CHECK-LABEL: @reduction_add_trunc( 9952f4c3e80SDavid Green; CHECK-NEXT: entry: 9962f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 9972f4c3e80SDavid Green; CHECK: vector.ph: 9982f4c3e80SDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 9992f4c3e80SDavid Green; CHECK: vector.body: 10002f4c3e80SDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 10012f4c3e80SDavid Green; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i8> [ <i8 -1, i8 0, i8 0, i8 0>, [[VECTOR_PH]] ], [ [[TMP3:%.*]], [[VECTOR_BODY]] ] 10022f4c3e80SDavid Green; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[INDEX]] to i64 10032f4c3e80SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, i8* [[A:%.*]], i64 [[TMP0]] 10042f4c3e80SDavid Green; CHECK-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to <4 x i8>* 10052f4c3e80SDavid Green; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, <4 x i8>* [[TMP2]], align 4 10062f4c3e80SDavid Green; CHECK-NEXT: [[TMP3]] = add <4 x i8> [[VEC_PHI]], [[WIDE_LOAD]] 100723c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4 10082f4c3e80SDavid Green; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 256 1009e639bcceSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP36:![0-9]+]] 10102f4c3e80SDavid Green; CHECK: middle.block: 1011322d0afdSAmara Emerson; CHECK-NEXT: [[TMP5:%.*]] = call i8 @llvm.vector.reduce.add.v4i8(<4 x i8> [[TMP3]]) 10122f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 10132f4c3e80SDavid Green; CHECK: scalar.ph: 10142f4c3e80SDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 10152f4c3e80SDavid Green; CHECK: .lr.ph: 1016*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP37:![0-9]+]] 10172f4c3e80SDavid Green; CHECK: ._crit_edge: 1018*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i8 [ poison, [[DOTLR_PH]] ], [ [[TMP5]], [[MIDDLE_BLOCK]] ] 10192f4c3e80SDavid Green; CHECK-NEXT: ret i8 [[SUM_0_LCSSA]] 10202f4c3e80SDavid Green; 10212f4c3e80SDavid Greenentry: 10222f4c3e80SDavid Green br label %.lr.ph 10232f4c3e80SDavid Green 10242f4c3e80SDavid Green.lr.ph: ; preds = %entry, %.lr.ph 10252f4c3e80SDavid Green %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 10262f4c3e80SDavid Green %sum.02p = phi i32 [ %l9, %.lr.ph ], [ 255, %entry ] 10272f4c3e80SDavid Green %sum.02 = and i32 %sum.02p, 255 10282f4c3e80SDavid Green %l2 = getelementptr inbounds i8, i8* %A, i32 %indvars.iv 10292f4c3e80SDavid Green %l3 = load i8, i8* %l2, align 4 10302f4c3e80SDavid Green %l3e = zext i8 %l3 to i32 10312f4c3e80SDavid Green %l9 = add i32 %sum.02, %l3e 10322f4c3e80SDavid Green %indvars.iv.next = add i32 %indvars.iv, 1 10332f4c3e80SDavid Green %exitcond = icmp eq i32 %indvars.iv.next, 256 10342f4c3e80SDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 10352f4c3e80SDavid Green 10362f4c3e80SDavid Green._crit_edge: ; preds = %.lr.ph 10372f4c3e80SDavid Green %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ] 10382f4c3e80SDavid Green %ret = trunc i32 %sum.0.lcssa to i8 10392f4c3e80SDavid Green ret i8 %ret 10402f4c3e80SDavid Green} 10412f4c3e80SDavid Green 10422f4c3e80SDavid Green 10432f4c3e80SDavid Greendefine i8 @reduction_and_trunc(i8* noalias nocapture %A) { 10442f4c3e80SDavid Green; CHECK-LABEL: @reduction_and_trunc( 10452f4c3e80SDavid Green; CHECK-NEXT: entry: 10462f4c3e80SDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 10472f4c3e80SDavid Green; CHECK: vector.ph: 10482f4c3e80SDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 10492f4c3e80SDavid Green; CHECK: vector.body: 10502f4c3e80SDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 10519d355949SKerry McLaughlin; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i8> [ <i8 -1, i8 -1, i8 -1, i8 -1>, [[VECTOR_PH]] ], [ [[TMP3:%.*]], [[VECTOR_BODY]] ] 10529d355949SKerry McLaughlin; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[INDEX]] to i64 10539d355949SKerry McLaughlin; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, i8* [[A:%.*]], i64 [[TMP0]] 10549d355949SKerry McLaughlin; CHECK-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to <4 x i8>* 10559d355949SKerry McLaughlin; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, <4 x i8>* [[TMP2]], align 4 10569d355949SKerry McLaughlin; CHECK-NEXT: [[TMP3]] = and <4 x i8> [[VEC_PHI]], [[WIDE_LOAD]] 105723c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4 10589d355949SKerry McLaughlin; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 256 10599d355949SKerry McLaughlin; CHECK-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP38:![0-9]+]] 10602f4c3e80SDavid Green; CHECK: middle.block: 10619d355949SKerry McLaughlin; CHECK-NEXT: [[TMP5:%.*]] = call i8 @llvm.vector.reduce.and.v4i8(<4 x i8> [[TMP3]]) 10622f4c3e80SDavid Green; CHECK-NEXT: br i1 true, label [[DOT_CRIT_EDGE:%.*]], label [[SCALAR_PH]] 10632f4c3e80SDavid Green; CHECK: scalar.ph: 10642f4c3e80SDavid Green; CHECK-NEXT: br label [[DOTLR_PH:%.*]] 10652f4c3e80SDavid Green; CHECK: .lr.ph: 1066*9df0b254SNuno Lopes; CHECK-NEXT: br i1 poison, label [[DOT_CRIT_EDGE]], label [[DOTLR_PH]], !llvm.loop [[LOOP39:![0-9]+]] 10672f4c3e80SDavid Green; CHECK: ._crit_edge: 1068*9df0b254SNuno Lopes; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i8 [ poison, [[DOTLR_PH]] ], [ [[TMP5]], [[MIDDLE_BLOCK]] ] 10699d355949SKerry McLaughlin; CHECK-NEXT: ret i8 [[SUM_0_LCSSA]] 10702f4c3e80SDavid Green; 10712f4c3e80SDavid Greenentry: 10722f4c3e80SDavid Green br label %.lr.ph 10732f4c3e80SDavid Green 10742f4c3e80SDavid Green.lr.ph: ; preds = %entry, %.lr.ph 10752f4c3e80SDavid Green %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ] 10762f4c3e80SDavid Green %sum.02p = phi i32 [ %l9, %.lr.ph ], [ 255, %entry ] 10772f4c3e80SDavid Green %sum.02 = and i32 %sum.02p, 255 10782f4c3e80SDavid Green %l2 = getelementptr inbounds i8, i8* %A, i32 %indvars.iv 10792f4c3e80SDavid Green %l3 = load i8, i8* %l2, align 4 10802f4c3e80SDavid Green %l3e = zext i8 %l3 to i32 10812f4c3e80SDavid Green %l9 = and i32 %sum.02, %l3e 10822f4c3e80SDavid Green %indvars.iv.next = add i32 %indvars.iv, 1 10832f4c3e80SDavid Green %exitcond = icmp eq i32 %indvars.iv.next, 256 10842f4c3e80SDavid Green br i1 %exitcond, label %._crit_edge, label %.lr.ph 10852f4c3e80SDavid Green 10862f4c3e80SDavid Green._crit_edge: ; preds = %.lr.ph 10872f4c3e80SDavid Green %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ] 10882f4c3e80SDavid Green %ret = trunc i32 %sum.0.lcssa to i8 10892f4c3e80SDavid Green ret i8 %ret 10902f4c3e80SDavid Green} 10912f4c3e80SDavid Green 1092c2441b6bSRosie Sumpter; Test case when loop has a call to the llvm.fmuladd intrinsic. 1093c2441b6bSRosie Sumpterdefine float @reduction_fmuladd(float* %a, float* %b, i64 %n) { 1094c2441b6bSRosie Sumpter; CHECK-LABEL: @reduction_fmuladd( 1095c2441b6bSRosie Sumpter; CHECK-NEXT: entry: 1096c2441b6bSRosie Sumpter; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N:%.*]], 4 1097c2441b6bSRosie Sumpter; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 1098c2441b6bSRosie Sumpter; CHECK: vector.ph: 1099c2441b6bSRosie Sumpter; CHECK-NEXT: [[N_VEC:%.*]] = and i64 [[N]], -4 1100c2441b6bSRosie Sumpter; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 1101c2441b6bSRosie Sumpter; CHECK: vector.body: 1102c2441b6bSRosie Sumpter; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 1103c2441b6bSRosie Sumpter; CHECK-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, [[VECTOR_PH]] ], [ [[TMP6:%.*]], [[VECTOR_BODY]] ] 1104c2441b6bSRosie Sumpter; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds float, float* [[A:%.*]], i64 [[INDEX]] 1105c2441b6bSRosie Sumpter; CHECK-NEXT: [[TMP1:%.*]] = bitcast float* [[TMP0]] to <4 x float>* 1106c2441b6bSRosie Sumpter; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, <4 x float>* [[TMP1]], align 4 1107c2441b6bSRosie Sumpter; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, float* [[B:%.*]], i64 [[INDEX]] 1108c2441b6bSRosie Sumpter; CHECK-NEXT: [[TMP3:%.*]] = bitcast float* [[TMP2]] to <4 x float>* 1109c2441b6bSRosie Sumpter; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x float>, <4 x float>* [[TMP3]], align 4 1110c2441b6bSRosie Sumpter; CHECK-NEXT: [[TMP4:%.*]] = fmul <4 x float> [[WIDE_LOAD]], [[WIDE_LOAD1]] 1111c2441b6bSRosie Sumpter; CHECK-NEXT: [[TMP5:%.*]] = call float @llvm.vector.reduce.fadd.v4f32(float -0.000000e+00, <4 x float> [[TMP4]]) 1112c2441b6bSRosie Sumpter; CHECK-NEXT: [[TMP6]] = fadd float [[TMP5]], [[VEC_PHI]] 1113c2441b6bSRosie Sumpter; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 1114c2441b6bSRosie Sumpter; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 1115c2441b6bSRosie Sumpter; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP40:![0-9]+]] 1116c2441b6bSRosie Sumpter; CHECK: middle.block: 1117c2441b6bSRosie Sumpter; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N_VEC]], [[N]] 1118c2441b6bSRosie Sumpter; CHECK-NEXT: br i1 [[CMP_N]], label [[FOR_END:%.*]], label [[SCALAR_PH]] 1119c2441b6bSRosie Sumpter; CHECK: scalar.ph: 1120c2441b6bSRosie Sumpter; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ] 1121c2441b6bSRosie Sumpter; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = phi float [ [[TMP6]], [[MIDDLE_BLOCK]] ], [ 0.000000e+00, [[ENTRY]] ] 1122c2441b6bSRosie Sumpter; CHECK-NEXT: br label [[FOR_BODY:%.*]] 1123c2441b6bSRosie Sumpter; CHECK: for.body: 1124c2441b6bSRosie Sumpter; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[FOR_BODY]] ] 1125c2441b6bSRosie Sumpter; CHECK-NEXT: [[SUM_07:%.*]] = phi float [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[MULADD:%.*]], [[FOR_BODY]] ] 1126c2441b6bSRosie Sumpter; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, float* [[A]], i64 [[IV]] 1127c2441b6bSRosie Sumpter; CHECK-NEXT: [[TMP8:%.*]] = load float, float* [[ARRAYIDX]], align 4 1128c2441b6bSRosie Sumpter; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds float, float* [[B]], i64 [[IV]] 1129c2441b6bSRosie Sumpter; CHECK-NEXT: [[TMP9:%.*]] = load float, float* [[ARRAYIDX2]], align 4 1130c2441b6bSRosie Sumpter; CHECK-NEXT: [[MULADD]] = tail call float @llvm.fmuladd.f32(float [[TMP8]], float [[TMP9]], float [[SUM_07]]) 1131c2441b6bSRosie Sumpter; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1 1132c2441b6bSRosie Sumpter; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]] 1133c2441b6bSRosie Sumpter; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP41:![0-9]+]] 1134c2441b6bSRosie Sumpter; CHECK: for.end: 1135c2441b6bSRosie Sumpter; CHECK-NEXT: [[MULADD_LCSSA:%.*]] = phi float [ [[MULADD]], [[FOR_BODY]] ], [ [[TMP6]], [[MIDDLE_BLOCK]] ] 1136c2441b6bSRosie Sumpter; CHECK-NEXT: ret float [[MULADD_LCSSA]] 1137e6ad9ef4SPhilip Reames; 1138c2441b6bSRosie Sumpter 1139c2441b6bSRosie Sumpterentry: 1140c2441b6bSRosie Sumpter br label %for.body 1141c2441b6bSRosie Sumpter 1142c2441b6bSRosie Sumpterfor.body: 1143c2441b6bSRosie Sumpter %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ] 1144c2441b6bSRosie Sumpter %sum.07 = phi float [ 0.000000e+00, %entry ], [ %muladd, %for.body ] 1145c2441b6bSRosie Sumpter %arrayidx = getelementptr inbounds float, float* %a, i64 %iv 1146c2441b6bSRosie Sumpter %0 = load float, float* %arrayidx, align 4 1147c2441b6bSRosie Sumpter %arrayidx2 = getelementptr inbounds float, float* %b, i64 %iv 1148c2441b6bSRosie Sumpter %1 = load float, float* %arrayidx2, align 4 1149c2441b6bSRosie Sumpter %muladd = tail call float @llvm.fmuladd.f32(float %0, float %1, float %sum.07) 1150c2441b6bSRosie Sumpter %iv.next = add nuw nsw i64 %iv, 1 1151c2441b6bSRosie Sumpter %exitcond.not = icmp eq i64 %iv.next, %n 1152c2441b6bSRosie Sumpter br i1 %exitcond.not, label %for.end, label %for.body 1153c2441b6bSRosie Sumpter 1154c2441b6bSRosie Sumpterfor.end: 1155c2441b6bSRosie Sumpter ret float %muladd 1156c2441b6bSRosie Sumpter} 1157c2441b6bSRosie Sumpter 1158c2441b6bSRosie Sumpterdeclare float @llvm.fmuladd.f32(float, float, float) 1159c2441b6bSRosie Sumpter 1160ec7e4a9aSDavid Green!6 = distinct !{!6, !7, !8} 1161ec7e4a9aSDavid Green!7 = !{!"llvm.loop.vectorize.predicate.enable", i1 true} 1162ec7e4a9aSDavid Green!8 = !{!"llvm.loop.vectorize.enable", i1 true} 1163