10f6d93f8SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 20f6d93f8SFlorian Hahn; RUN: opt -passes=loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -epilogue-vectorization-force-VF=4 -S < %s | FileCheck %s 30f6d93f8SFlorian Hahn 40f6d93f8SFlorian Hahndefine i64 @select_icmp_const(ptr %a, i64 %n) { 50f6d93f8SFlorian Hahn; CHECK-LABEL: define i64 @select_icmp_const( 60f6d93f8SFlorian Hahn; CHECK-SAME: ptr [[A:%.*]], i64 [[N:%.*]]) { 70f6d93f8SFlorian Hahn; CHECK-NEXT: [[ITER_CHECK:.*]]: 80f6d93f8SFlorian Hahn; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 4 90f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[VEC_EPILOG_SCALAR_PH:.*]], label %[[VECTOR_MAIN_LOOP_ITER_CHECK:.*]] 100f6d93f8SFlorian Hahn; CHECK: [[VECTOR_MAIN_LOOP_ITER_CHECK]]: 110f6d93f8SFlorian Hahn; CHECK-NEXT: [[MIN_ITERS_CHECK1:%.*]] = icmp ult i64 [[N]], 4 120f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK1]], label %[[VEC_EPILOG_PH:.*]], label %[[VECTOR_PH:.*]] 130f6d93f8SFlorian Hahn; CHECK: [[VECTOR_PH]]: 140f6d93f8SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 4 150f6d93f8SFlorian Hahn; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]] 160f6d93f8SFlorian Hahn; CHECK-NEXT: br label %[[VECTOR_BODY:.*]] 170f6d93f8SFlorian Hahn; CHECK: [[VECTOR_BODY]]: 180f6d93f8SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ] 190f6d93f8SFlorian Hahn; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ] 200f6d93f8SFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i64> [ splat (i64 -9223372036854775808), %[[VECTOR_PH]] ], [ [[TMP4:%.*]], %[[VECTOR_BODY]] ] 210f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0 220f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP0]] 230f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i64, ptr [[TMP1]], i32 0 240f6d93f8SFlorian Hahn; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP2]], align 8 250f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = icmp eq <4 x i64> [[WIDE_LOAD]], splat (i64 3) 260f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP4]] = select <4 x i1> [[TMP3]], <4 x i64> [[VEC_IND]], <4 x i64> [[VEC_PHI]] 270f6d93f8SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 280f6d93f8SFlorian Hahn; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], splat (i64 4) 290f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 300f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] 310f6d93f8SFlorian Hahn; CHECK: [[MIDDLE_BLOCK]]: 320f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP6:%.*]] = call i64 @llvm.vector.reduce.smax.v4i64(<4 x i64> [[TMP4]]) 330f6d93f8SFlorian Hahn; CHECK-NEXT: [[RDX_SELECT_CMP:%.*]] = icmp ne i64 [[TMP6]], -9223372036854775808 340f6d93f8SFlorian Hahn; CHECK-NEXT: [[RDX_SELECT:%.*]] = select i1 [[RDX_SELECT_CMP]], i64 [[TMP6]], i64 3 350f6d93f8SFlorian Hahn; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]] 360f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[VEC_EPILOG_ITER_CHECK:.*]] 370f6d93f8SFlorian Hahn; CHECK: [[VEC_EPILOG_ITER_CHECK]]: 380f6d93f8SFlorian Hahn; CHECK-NEXT: [[N_VEC_REMAINING:%.*]] = sub i64 [[N]], [[N_VEC]] 390f6d93f8SFlorian Hahn; CHECK-NEXT: [[MIN_EPILOG_ITERS_CHECK:%.*]] = icmp ult i64 [[N_VEC_REMAINING]], 4 400f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[MIN_EPILOG_ITERS_CHECK]], label %[[VEC_EPILOG_SCALAR_PH]], label %[[VEC_EPILOG_PH]] 410f6d93f8SFlorian Hahn; CHECK: [[VEC_EPILOG_PH]]: 420f6d93f8SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 0, %[[VECTOR_MAIN_LOOP_ITER_CHECK]] ] 43*3397950fSMel Chen; CHECK-NEXT: [[BC_MERGE_RDX1:%.*]] = phi i64 [ [[RDX_SELECT]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 3, %[[VECTOR_MAIN_LOOP_ITER_CHECK]] ] 44*3397950fSMel Chen; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[BC_MERGE_RDX1]], 3 45*3397950fSMel Chen; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = select i1 [[TMP14]], i64 -9223372036854775808, i64 [[BC_MERGE_RDX1]] 460f6d93f8SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF2:%.*]] = urem i64 [[N]], 4 470f6d93f8SFlorian Hahn; CHECK-NEXT: [[N_VEC3:%.*]] = sub i64 [[N]], [[N_MOD_VF2]] 480f6d93f8SFlorian Hahn; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x i64> poison, i64 [[BC_RESUME_VAL]], i64 0 490f6d93f8SFlorian Hahn; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x i64> [[DOTSPLATINSERT]], <4 x i64> poison, <4 x i32> zeroinitializer 500f6d93f8SFlorian Hahn; CHECK-NEXT: [[INDUCTION:%.*]] = add <4 x i64> [[DOTSPLAT]], <i64 0, i64 1, i64 2, i64 3> 510e528ac4SFlorian Hahn; CHECK-NEXT: [[DOTSPLATINSERT8:%.*]] = insertelement <4 x i64> poison, i64 [[BC_MERGE_RDX]], i64 0 520e528ac4SFlorian Hahn; CHECK-NEXT: [[DOTSPLAT9:%.*]] = shufflevector <4 x i64> [[DOTSPLATINSERT8]], <4 x i64> poison, <4 x i32> zeroinitializer 530f6d93f8SFlorian Hahn; CHECK-NEXT: br label %[[VEC_EPILOG_VECTOR_BODY:.*]] 540f6d93f8SFlorian Hahn; CHECK: [[VEC_EPILOG_VECTOR_BODY]]: 550f6d93f8SFlorian Hahn; CHECK-NEXT: [[INDEX4:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT9:%.*]], %[[VEC_EPILOG_VECTOR_BODY]] ] 560f6d93f8SFlorian Hahn; CHECK-NEXT: [[VEC_IND5:%.*]] = phi <4 x i64> [ [[INDUCTION]], %[[VEC_EPILOG_PH]] ], [ [[VEC_IND_NEXT6:%.*]], %[[VEC_EPILOG_VECTOR_BODY]] ] 570e528ac4SFlorian Hahn; CHECK-NEXT: [[VEC_PHI7:%.*]] = phi <4 x i64> [ [[DOTSPLAT9]], %[[VEC_EPILOG_PH]] ], [ [[TMP11:%.*]], %[[VEC_EPILOG_VECTOR_BODY]] ] 580f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP7:%.*]] = add i64 [[INDEX4]], 0 590f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP7]] 600f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i64, ptr [[TMP8]], i32 0 610f6d93f8SFlorian Hahn; CHECK-NEXT: [[WIDE_LOAD8:%.*]] = load <4 x i64>, ptr [[TMP9]], align 8 620f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP10:%.*]] = icmp eq <4 x i64> [[WIDE_LOAD8]], splat (i64 3) 630f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP11]] = select <4 x i1> [[TMP10]], <4 x i64> [[VEC_IND5]], <4 x i64> [[VEC_PHI7]] 640f6d93f8SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT9]] = add nuw i64 [[INDEX4]], 4 650f6d93f8SFlorian Hahn; CHECK-NEXT: [[VEC_IND_NEXT6]] = add <4 x i64> [[VEC_IND5]], splat (i64 4) 660f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT9]], [[N_VEC3]] 670f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[TMP12]], label %[[VEC_EPILOG_MIDDLE_BLOCK:.*]], label %[[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]] 680f6d93f8SFlorian Hahn; CHECK: [[VEC_EPILOG_MIDDLE_BLOCK]]: 690f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = call i64 @llvm.vector.reduce.smax.v4i64(<4 x i64> [[TMP11]]) 700f6d93f8SFlorian Hahn; CHECK-NEXT: [[RDX_SELECT_CMP10:%.*]] = icmp ne i64 [[TMP13]], -9223372036854775808 710f6d93f8SFlorian Hahn; CHECK-NEXT: [[RDX_SELECT11:%.*]] = select i1 [[RDX_SELECT_CMP10]], i64 [[TMP13]], i64 3 720f6d93f8SFlorian Hahn; CHECK-NEXT: [[CMP_N12:%.*]] = icmp eq i64 [[N]], [[N_VEC3]] 730f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[CMP_N12]], label %[[EXIT]], label %[[VEC_EPILOG_SCALAR_PH]] 740f6d93f8SFlorian Hahn; CHECK: [[VEC_EPILOG_SCALAR_PH]]: 754ad0fdd1SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL15:%.*]] = phi i64 [ [[N_VEC3]], %[[VEC_EPILOG_MIDDLE_BLOCK]] ], [ 0, %[[ITER_CHECK]] ], [ [[N_VEC]], %[[VEC_EPILOG_ITER_CHECK]] ] 764ad0fdd1SFlorian Hahn; CHECK-NEXT: [[BC_MERGE_RDX16:%.*]] = phi i64 [ [[RDX_SELECT11]], %[[VEC_EPILOG_MIDDLE_BLOCK]] ], [ 3, %[[ITER_CHECK]] ], [ [[RDX_SELECT]], %[[VEC_EPILOG_ITER_CHECK]] ] 770f6d93f8SFlorian Hahn; CHECK-NEXT: br label %[[LOOP:.*]] 780f6d93f8SFlorian Hahn; CHECK: [[LOOP]]: 790e528ac4SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL15]], %[[VEC_EPILOG_SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ] 800e528ac4SFlorian Hahn; CHECK-NEXT: [[RDX:%.*]] = phi i64 [ [[BC_MERGE_RDX16]], %[[VEC_EPILOG_SCALAR_PH]] ], [ [[SEL:%.*]], %[[LOOP]] ] 810f6d93f8SFlorian Hahn; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[IV]] 820f6d93f8SFlorian Hahn; CHECK-NEXT: [[L:%.*]] = load i64, ptr [[GEP]], align 8 830f6d93f8SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp eq i64 [[L]], 3 840f6d93f8SFlorian Hahn; CHECK-NEXT: [[SEL]] = select i1 [[C]], i64 [[IV]], i64 [[RDX]] 850f6d93f8SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1 860f6d93f8SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]] 870f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP4:![0-9]+]] 880f6d93f8SFlorian Hahn; CHECK: [[EXIT]]: 890f6d93f8SFlorian Hahn; CHECK-NEXT: [[SEL_LCSSA:%.*]] = phi i64 [ [[SEL]], %[[LOOP]] ], [ [[RDX_SELECT]], %[[MIDDLE_BLOCK]] ], [ [[RDX_SELECT11]], %[[VEC_EPILOG_MIDDLE_BLOCK]] ] 900f6d93f8SFlorian Hahn; CHECK-NEXT: ret i64 [[SEL_LCSSA]] 910f6d93f8SFlorian Hahn; 920f6d93f8SFlorian Hahnentry: 930f6d93f8SFlorian Hahn br label %loop 940f6d93f8SFlorian Hahn 950f6d93f8SFlorian Hahnloop: 960f6d93f8SFlorian Hahn %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 970f6d93f8SFlorian Hahn %rdx = phi i64 [ 3, %entry ], [ %sel, %loop ] 980f6d93f8SFlorian Hahn %gep = getelementptr inbounds i64, ptr %a, i64 %iv 990f6d93f8SFlorian Hahn %l = load i64, ptr %gep, align 8 1000f6d93f8SFlorian Hahn %c = icmp eq i64 %l, 3 1010f6d93f8SFlorian Hahn %sel = select i1 %c, i64 %iv, i64 %rdx 1020f6d93f8SFlorian Hahn %iv.next = add nuw nsw i64 %iv, 1 1030f6d93f8SFlorian Hahn %ec = icmp eq i64 %iv.next, %n 1040f6d93f8SFlorian Hahn br i1 %ec, label %exit, label %loop 1050f6d93f8SFlorian Hahn 1060f6d93f8SFlorian Hahnexit: 1070f6d93f8SFlorian Hahn ret i64 %sel 1080f6d93f8SFlorian Hahn} 1090f6d93f8SFlorian Hahn 1100f6d93f8SFlorian Hahndefine i64 @select_fcmp_const_fast(ptr %a, i64 %n) { 1110f6d93f8SFlorian Hahn; CHECK-LABEL: define i64 @select_fcmp_const_fast( 1120f6d93f8SFlorian Hahn; CHECK-SAME: ptr [[A:%.*]], i64 [[N:%.*]]) { 1130f6d93f8SFlorian Hahn; CHECK-NEXT: [[ITER_CHECK:.*]]: 1140f6d93f8SFlorian Hahn; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 4 1150f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[VEC_EPILOG_SCALAR_PH:.*]], label %[[VECTOR_MAIN_LOOP_ITER_CHECK:.*]] 1160f6d93f8SFlorian Hahn; CHECK: [[VECTOR_MAIN_LOOP_ITER_CHECK]]: 1170f6d93f8SFlorian Hahn; CHECK-NEXT: [[MIN_ITERS_CHECK1:%.*]] = icmp ult i64 [[N]], 4 1180f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK1]], label %[[VEC_EPILOG_PH:.*]], label %[[VECTOR_PH:.*]] 1190f6d93f8SFlorian Hahn; CHECK: [[VECTOR_PH]]: 1200f6d93f8SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 4 1210f6d93f8SFlorian Hahn; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]] 1220f6d93f8SFlorian Hahn; CHECK-NEXT: br label %[[VECTOR_BODY:.*]] 1230f6d93f8SFlorian Hahn; CHECK: [[VECTOR_BODY]]: 1240f6d93f8SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ] 1250f6d93f8SFlorian Hahn; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ] 1260f6d93f8SFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i64> [ splat (i64 -9223372036854775808), %[[VECTOR_PH]] ], [ [[TMP4:%.*]], %[[VECTOR_BODY]] ] 1270f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0 1280f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP0]] 1290f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[TMP1]], i32 0 1300f6d93f8SFlorian Hahn; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP2]], align 4 1310f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = fcmp fast ueq <4 x float> [[WIDE_LOAD]], splat (float 3.000000e+00) 1320f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP4]] = select <4 x i1> [[TMP3]], <4 x i64> [[VEC_IND]], <4 x i64> [[VEC_PHI]] 1330f6d93f8SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 1340f6d93f8SFlorian Hahn; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], splat (i64 4) 1350f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 1360f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]] 1370f6d93f8SFlorian Hahn; CHECK: [[MIDDLE_BLOCK]]: 1380f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP6:%.*]] = call i64 @llvm.vector.reduce.smax.v4i64(<4 x i64> [[TMP4]]) 1390f6d93f8SFlorian Hahn; CHECK-NEXT: [[RDX_SELECT_CMP:%.*]] = icmp ne i64 [[TMP6]], -9223372036854775808 1400f6d93f8SFlorian Hahn; CHECK-NEXT: [[RDX_SELECT:%.*]] = select i1 [[RDX_SELECT_CMP]], i64 [[TMP6]], i64 2 1410f6d93f8SFlorian Hahn; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]] 1420f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[VEC_EPILOG_ITER_CHECK:.*]] 1430f6d93f8SFlorian Hahn; CHECK: [[VEC_EPILOG_ITER_CHECK]]: 1440f6d93f8SFlorian Hahn; CHECK-NEXT: [[N_VEC_REMAINING:%.*]] = sub i64 [[N]], [[N_VEC]] 1450f6d93f8SFlorian Hahn; CHECK-NEXT: [[MIN_EPILOG_ITERS_CHECK:%.*]] = icmp ult i64 [[N_VEC_REMAINING]], 4 1460f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[MIN_EPILOG_ITERS_CHECK]], label %[[VEC_EPILOG_SCALAR_PH]], label %[[VEC_EPILOG_PH]] 1470f6d93f8SFlorian Hahn; CHECK: [[VEC_EPILOG_PH]]: 1480f6d93f8SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 0, %[[VECTOR_MAIN_LOOP_ITER_CHECK]] ] 149*3397950fSMel Chen; CHECK-NEXT: [[BC_MERGE_RDX1:%.*]] = phi i64 [ [[RDX_SELECT]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 2, %[[VECTOR_MAIN_LOOP_ITER_CHECK]] ] 150*3397950fSMel Chen; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[BC_MERGE_RDX1]], 2 151*3397950fSMel Chen; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = select i1 [[TMP14]], i64 -9223372036854775808, i64 [[BC_MERGE_RDX1]] 1520f6d93f8SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF2:%.*]] = urem i64 [[N]], 4 1530f6d93f8SFlorian Hahn; CHECK-NEXT: [[N_VEC3:%.*]] = sub i64 [[N]], [[N_MOD_VF2]] 1540f6d93f8SFlorian Hahn; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x i64> poison, i64 [[BC_RESUME_VAL]], i64 0 1550f6d93f8SFlorian Hahn; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x i64> [[DOTSPLATINSERT]], <4 x i64> poison, <4 x i32> zeroinitializer 1560f6d93f8SFlorian Hahn; CHECK-NEXT: [[INDUCTION:%.*]] = add <4 x i64> [[DOTSPLAT]], <i64 0, i64 1, i64 2, i64 3> 1570e528ac4SFlorian Hahn; CHECK-NEXT: [[DOTSPLATINSERT8:%.*]] = insertelement <4 x i64> poison, i64 [[BC_MERGE_RDX]], i64 0 1580e528ac4SFlorian Hahn; CHECK-NEXT: [[DOTSPLAT9:%.*]] = shufflevector <4 x i64> [[DOTSPLATINSERT8]], <4 x i64> poison, <4 x i32> zeroinitializer 1590f6d93f8SFlorian Hahn; CHECK-NEXT: br label %[[VEC_EPILOG_VECTOR_BODY:.*]] 1600f6d93f8SFlorian Hahn; CHECK: [[VEC_EPILOG_VECTOR_BODY]]: 1610f6d93f8SFlorian Hahn; CHECK-NEXT: [[INDEX4:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT9:%.*]], %[[VEC_EPILOG_VECTOR_BODY]] ] 1620f6d93f8SFlorian Hahn; CHECK-NEXT: [[VEC_IND5:%.*]] = phi <4 x i64> [ [[INDUCTION]], %[[VEC_EPILOG_PH]] ], [ [[VEC_IND_NEXT6:%.*]], %[[VEC_EPILOG_VECTOR_BODY]] ] 1630e528ac4SFlorian Hahn; CHECK-NEXT: [[VEC_PHI7:%.*]] = phi <4 x i64> [ [[DOTSPLAT9]], %[[VEC_EPILOG_PH]] ], [ [[TMP11:%.*]], %[[VEC_EPILOG_VECTOR_BODY]] ] 1640f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP7:%.*]] = add i64 [[INDEX4]], 0 1650f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP7]] 1660f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds float, ptr [[TMP8]], i32 0 1670f6d93f8SFlorian Hahn; CHECK-NEXT: [[WIDE_LOAD8:%.*]] = load <4 x float>, ptr [[TMP9]], align 4 1680f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP10:%.*]] = fcmp fast ueq <4 x float> [[WIDE_LOAD8]], splat (float 3.000000e+00) 1690f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP11]] = select <4 x i1> [[TMP10]], <4 x i64> [[VEC_IND5]], <4 x i64> [[VEC_PHI7]] 1700f6d93f8SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT9]] = add nuw i64 [[INDEX4]], 4 1710f6d93f8SFlorian Hahn; CHECK-NEXT: [[VEC_IND_NEXT6]] = add <4 x i64> [[VEC_IND5]], splat (i64 4) 1720f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT9]], [[N_VEC3]] 1730f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[TMP12]], label %[[VEC_EPILOG_MIDDLE_BLOCK:.*]], label %[[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]] 1740f6d93f8SFlorian Hahn; CHECK: [[VEC_EPILOG_MIDDLE_BLOCK]]: 1750f6d93f8SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = call i64 @llvm.vector.reduce.smax.v4i64(<4 x i64> [[TMP11]]) 1760f6d93f8SFlorian Hahn; CHECK-NEXT: [[RDX_SELECT_CMP10:%.*]] = icmp ne i64 [[TMP13]], -9223372036854775808 1770f6d93f8SFlorian Hahn; CHECK-NEXT: [[RDX_SELECT11:%.*]] = select i1 [[RDX_SELECT_CMP10]], i64 [[TMP13]], i64 2 1780f6d93f8SFlorian Hahn; CHECK-NEXT: [[CMP_N12:%.*]] = icmp eq i64 [[N]], [[N_VEC3]] 1790f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[CMP_N12]], label %[[EXIT]], label %[[VEC_EPILOG_SCALAR_PH]] 1800f6d93f8SFlorian Hahn; CHECK: [[VEC_EPILOG_SCALAR_PH]]: 1814ad0fdd1SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL15:%.*]] = phi i64 [ [[N_VEC3]], %[[VEC_EPILOG_MIDDLE_BLOCK]] ], [ 0, %[[ITER_CHECK]] ], [ [[N_VEC]], %[[VEC_EPILOG_ITER_CHECK]] ] 1824ad0fdd1SFlorian Hahn; CHECK-NEXT: [[BC_MERGE_RDX16:%.*]] = phi i64 [ [[RDX_SELECT11]], %[[VEC_EPILOG_MIDDLE_BLOCK]] ], [ 2, %[[ITER_CHECK]] ], [ [[RDX_SELECT]], %[[VEC_EPILOG_ITER_CHECK]] ] 1830f6d93f8SFlorian Hahn; CHECK-NEXT: br label %[[LOOP:.*]] 1840f6d93f8SFlorian Hahn; CHECK: [[LOOP]]: 1850e528ac4SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL15]], %[[VEC_EPILOG_SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ] 1860e528ac4SFlorian Hahn; CHECK-NEXT: [[RDX:%.*]] = phi i64 [ [[BC_MERGE_RDX16]], %[[VEC_EPILOG_SCALAR_PH]] ], [ [[SEL:%.*]], %[[LOOP]] ] 1870f6d93f8SFlorian Hahn; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]] 1880f6d93f8SFlorian Hahn; CHECK-NEXT: [[L:%.*]] = load float, ptr [[GEP]], align 4 1890f6d93f8SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = fcmp fast ueq float [[L]], 3.000000e+00 1900f6d93f8SFlorian Hahn; CHECK-NEXT: [[SEL]] = select i1 [[C]], i64 [[IV]], i64 [[RDX]] 1910f6d93f8SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1 1920f6d93f8SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]] 1930f6d93f8SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP7:![0-9]+]] 1940f6d93f8SFlorian Hahn; CHECK: [[EXIT]]: 1950f6d93f8SFlorian Hahn; CHECK-NEXT: [[SEL_LCSSA:%.*]] = phi i64 [ [[SEL]], %[[LOOP]] ], [ [[RDX_SELECT]], %[[MIDDLE_BLOCK]] ], [ [[RDX_SELECT11]], %[[VEC_EPILOG_MIDDLE_BLOCK]] ] 1960f6d93f8SFlorian Hahn; CHECK-NEXT: ret i64 [[SEL_LCSSA]] 1970f6d93f8SFlorian Hahn; 1980f6d93f8SFlorian Hahnentry: 1990f6d93f8SFlorian Hahn br label %loop 2000f6d93f8SFlorian Hahn 2010f6d93f8SFlorian Hahnloop: 2020f6d93f8SFlorian Hahn %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 2030f6d93f8SFlorian Hahn %rdx = phi i64 [ 2, %entry ], [ %sel, %loop ] 2040f6d93f8SFlorian Hahn %gep = getelementptr inbounds float, ptr %a, i64 %iv 2050f6d93f8SFlorian Hahn %l = load float, ptr %gep, align 4 2060f6d93f8SFlorian Hahn %c = fcmp fast ueq float %l, 3.0 2070f6d93f8SFlorian Hahn %sel = select i1 %c, i64 %iv, i64 %rdx 2080f6d93f8SFlorian Hahn %iv.next = add nuw nsw i64 %iv, 1 2090f6d93f8SFlorian Hahn %ec = icmp eq i64 %iv.next, %n 2100f6d93f8SFlorian Hahn br i1 %ec, label %exit, label %loop 2110f6d93f8SFlorian Hahn 2120f6d93f8SFlorian Hahnexit: 2130f6d93f8SFlorian Hahn ret i64 %sel 2140f6d93f8SFlorian Hahn} 2150f6d93f8SFlorian Hahn;. 2160f6d93f8SFlorian Hahn; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]} 2170f6d93f8SFlorian Hahn; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1} 2180f6d93f8SFlorian Hahn; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"} 2190f6d93f8SFlorian Hahn; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META1]], [[META2]]} 2200f6d93f8SFlorian Hahn; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META2]], [[META1]]} 2210f6d93f8SFlorian Hahn; CHECK: [[LOOP5]] = distinct !{[[LOOP5]], [[META1]], [[META2]]} 2220f6d93f8SFlorian Hahn; CHECK: [[LOOP6]] = distinct !{[[LOOP6]], [[META1]], [[META2]]} 2230f6d93f8SFlorian Hahn; CHECK: [[LOOP7]] = distinct !{[[LOOP7]], [[META2]], [[META1]]} 2240f6d93f8SFlorian Hahn;. 225