172aca94bSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 272aca94bSFlorian Hahn; RUN: opt -passes=loop-vectorize -force-vector-width=1 -force-vector-interleave=2 -S %s | FileCheck %s 372aca94bSFlorian Hahn 472aca94bSFlorian Hahndefine void @test1_select_invariant(ptr %src.1, ptr %src.2, ptr %dst, i1 %c, i8 %n) { 572aca94bSFlorian Hahn; CHECK-LABEL: @test1_select_invariant( 672aca94bSFlorian Hahn; CHECK-NEXT: entry: 772aca94bSFlorian Hahn; CHECK-NEXT: [[PTR_SEL:%.*]] = select i1 [[C:%.*]], ptr [[SRC_1:%.*]], ptr [[SRC_2:%.*]] 872aca94bSFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[N:%.*]], -1 972aca94bSFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32 1072aca94bSFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = add nuw nsw i32 [[TMP1]], 1 1172aca94bSFlorian Hahn; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[TMP2]], 2 12*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]] 1372aca94bSFlorian Hahn; CHECK: vector.memcheck: 1472aca94bSFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = add i8 [[N]], -1 1572aca94bSFlorian Hahn; CHECK-NEXT: [[TMP4:%.*]] = zext i8 [[TMP3]] to i64 1672aca94bSFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = add nuw nsw i64 [[TMP4]], 1 1772aca94bSFlorian Hahn; CHECK-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[DST:%.*]], i64 [[TMP5]] 1872aca94bSFlorian Hahn; CHECK-NEXT: [[UGLYGEP1:%.*]] = getelementptr i8, ptr [[PTR_SEL]], i64 1 1972aca94bSFlorian Hahn; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[DST]], [[UGLYGEP1]] 2072aca94bSFlorian Hahn; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[PTR_SEL]], [[UGLYGEP]] 2172aca94bSFlorian Hahn; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]] 22*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[FOUND_CONFLICT]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]] 23*e9cced27SFlorian Hahn; CHECK: vector.ph: 24*e9cced27SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[TMP2]], 2 25*e9cced27SFlorian Hahn; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[TMP2]], [[N_MOD_VF]] 26*e9cced27SFlorian Hahn; CHECK-NEXT: [[IND_END:%.*]] = trunc i32 [[N_VEC]] to i8 27*e9cced27SFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 28*e9cced27SFlorian Hahn; CHECK: vector.body: 29*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 30*e9cced27SFlorian Hahn; CHECK-NEXT: [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i8 31*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDUCTION:%.*]] = add i8 [[OFFSET_IDX]], 0 32*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDUCTION2:%.*]] = add i8 [[OFFSET_IDX]], 1 33*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[PTR_SEL]], align 8, !alias.scope !0 34*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP7:%.*]] = load i8, ptr [[PTR_SEL]], align 8, !alias.scope !0 35*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[DST]], i8 [[INDUCTION]] 36*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[DST]], i8 [[INDUCTION2]] 37*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[TMP6]], ptr [[TMP8]], align 2, !alias.scope !3, !noalias !0 38*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[TMP7]], ptr [[TMP9]], align 2, !alias.scope !3, !noalias !0 39*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2 40*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]] 41*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[TMP10]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]] 42*e9cced27SFlorian Hahn; CHECK: middle.block: 43*e9cced27SFlorian Hahn; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[TMP2]], [[N_VEC]] 44*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]] 45*e9cced27SFlorian Hahn; CHECK: scalar.ph: 46*e9cced27SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_MEMCHECK]] ] 47*e9cced27SFlorian Hahn; CHECK-NEXT: br label [[LOOP:%.*]] 48*e9cced27SFlorian Hahn; CHECK: loop: 49*e9cced27SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 50*e9cced27SFlorian Hahn; CHECK-NEXT: [[L_1:%.*]] = load i8, ptr [[PTR_SEL]], align 8 51*e9cced27SFlorian Hahn; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr i8, ptr [[DST]], i8 [[IV]] 52*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[L_1]], ptr [[GEP_DST]], align 2 53*e9cced27SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1 54*e9cced27SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp eq i8 [[IV_NEXT]], [[N]] 55*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP7:![0-9]+]] 56*e9cced27SFlorian Hahn; CHECK: exit: 57*e9cced27SFlorian Hahn; CHECK-NEXT: ret void 5872aca94bSFlorian Hahn; 5972aca94bSFlorian Hahnentry: 6072aca94bSFlorian Hahn %ptr.sel = select i1 %c, ptr %src.1, ptr %src.2 6172aca94bSFlorian Hahn br label %loop 6272aca94bSFlorian Hahn 6372aca94bSFlorian Hahnloop: 6472aca94bSFlorian Hahn %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop ] 6572aca94bSFlorian Hahn %l.1 = load i8, ptr %ptr.sel, align 8 6672aca94bSFlorian Hahn %gep.dst = getelementptr i8, ptr %dst, i8 %iv 6772aca94bSFlorian Hahn store i8 %l.1, ptr %gep.dst, align 2 6872aca94bSFlorian Hahn %iv.next = add nsw nuw i8 %iv, 1 6972aca94bSFlorian Hahn %ec = icmp eq i8 %iv.next, %n 7072aca94bSFlorian Hahn br i1 %ec, label %exit, label %loop 7172aca94bSFlorian Hahn 7272aca94bSFlorian Hahnexit: 7372aca94bSFlorian Hahn ret void 7472aca94bSFlorian Hahn} 7572aca94bSFlorian Hahn 7672aca94bSFlorian Hahndefine void @test_loop_dependent_select1(ptr %src.1, ptr %src.2, ptr %dst, i1 %c, i8 %n) { 7772aca94bSFlorian Hahn; CHECK-LABEL: @test_loop_dependent_select1( 7872aca94bSFlorian Hahn; CHECK-NEXT: entry: 79*e9cced27SFlorian Hahn; CHECK-NEXT: [[SRC_23:%.*]] = ptrtoint ptr [[SRC_2:%.*]] to i64 80*e9cced27SFlorian Hahn; CHECK-NEXT: [[SRC_12:%.*]] = ptrtoint ptr [[SRC_1:%.*]] to i64 81*e9cced27SFlorian Hahn; CHECK-NEXT: [[DST1:%.*]] = ptrtoint ptr [[DST:%.*]] to i64 82*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[N:%.*]], -1 83*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32 84*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = add nuw nsw i32 [[TMP1]], 1 85*e9cced27SFlorian Hahn; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[TMP2]], 2 86*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]] 87*e9cced27SFlorian Hahn; CHECK: vector.memcheck: 88*e9cced27SFlorian Hahn; CHECK-NEXT: [[DST1_FR:%.*]] = freeze i64 [[DST1]] 89*e9cced27SFlorian Hahn; CHECK-NEXT: [[SRC_12_FR:%.*]] = freeze i64 [[SRC_12]] 90*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = sub i64 [[DST1_FR]], [[SRC_12_FR]] 91*e9cced27SFlorian Hahn; CHECK-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP3]], 2 92*e9cced27SFlorian Hahn; CHECK-NEXT: [[DST1_FR4:%.*]] = freeze i64 [[DST1]] 93*e9cced27SFlorian Hahn; CHECK-NEXT: [[SRC_23_FR:%.*]] = freeze i64 [[SRC_23]] 94*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP4:%.*]] = sub i64 [[DST1_FR4]], [[SRC_23_FR]] 95*e9cced27SFlorian Hahn; CHECK-NEXT: [[DIFF_CHECK5:%.*]] = icmp ult i64 [[TMP4]], 2 96*e9cced27SFlorian Hahn; CHECK-NEXT: [[CONFLICT_RDX:%.*]] = or i1 [[DIFF_CHECK]], [[DIFF_CHECK5]] 97*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[CONFLICT_RDX]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]] 98*e9cced27SFlorian Hahn; CHECK: vector.ph: 99*e9cced27SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[TMP2]], 2 100*e9cced27SFlorian Hahn; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[TMP2]], [[N_MOD_VF]] 101*e9cced27SFlorian Hahn; CHECK-NEXT: [[IND_END:%.*]] = trunc i32 [[N_VEC]] to i8 102*e9cced27SFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 103*e9cced27SFlorian Hahn; CHECK: vector.body: 104*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 105*e9cced27SFlorian Hahn; CHECK-NEXT: [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i8 106*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDUCTION:%.*]] = add i8 [[OFFSET_IDX]], 0 107*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDUCTION6:%.*]] = add i8 [[OFFSET_IDX]], 1 108*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[SRC_1]], i8 [[INDUCTION]] 109*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[SRC_1]], i8 [[INDUCTION6]] 110*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[SRC_2]], i8 [[INDUCTION]] 111*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[SRC_2]], i8 [[INDUCTION6]] 112*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = select i1 [[C:%.*]], ptr [[TMP5]], ptr [[TMP7]] 113*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP10:%.*]] = select i1 [[C]], ptr [[TMP6]], ptr [[TMP8]] 114*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP9]], align 8 115*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = load i8, ptr [[TMP10]], align 8 116*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[DST]], i8 [[INDUCTION]] 117*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[DST]], i8 [[INDUCTION6]] 118*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[TMP11]], ptr [[TMP13]], align 2 119*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[TMP12]], ptr [[TMP14]], align 2 120*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2 121*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP15:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]] 122*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[TMP15]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]] 123*e9cced27SFlorian Hahn; CHECK: middle.block: 124*e9cced27SFlorian Hahn; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[TMP2]], [[N_VEC]] 125*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]] 126*e9cced27SFlorian Hahn; CHECK: scalar.ph: 127*e9cced27SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_MEMCHECK]] ] 128*e9cced27SFlorian Hahn; CHECK-NEXT: br label [[LOOP:%.*]] 129*e9cced27SFlorian Hahn; CHECK: loop: 130*e9cced27SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 131*e9cced27SFlorian Hahn; CHECK-NEXT: [[GEP_SRC_1:%.*]] = getelementptr i8, ptr [[SRC_1]], i8 [[IV]] 132*e9cced27SFlorian Hahn; CHECK-NEXT: [[GEP_SRC_2:%.*]] = getelementptr i8, ptr [[SRC_2]], i8 [[IV]] 133*e9cced27SFlorian Hahn; CHECK-NEXT: [[PTR_SEL:%.*]] = select i1 [[C]], ptr [[GEP_SRC_1]], ptr [[GEP_SRC_2]] 134*e9cced27SFlorian Hahn; CHECK-NEXT: [[L_1:%.*]] = load i8, ptr [[PTR_SEL]], align 8 135*e9cced27SFlorian Hahn; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr i8, ptr [[DST]], i8 [[IV]] 136*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[L_1]], ptr [[GEP_DST]], align 2 137*e9cced27SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1 138*e9cced27SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp eq i8 [[IV_NEXT]], [[N]] 139*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP9:![0-9]+]] 140*e9cced27SFlorian Hahn; CHECK: exit: 141*e9cced27SFlorian Hahn; CHECK-NEXT: ret void 14272aca94bSFlorian Hahn; 14372aca94bSFlorian Hahnentry: 14472aca94bSFlorian Hahn br label %loop 14572aca94bSFlorian Hahn 14672aca94bSFlorian Hahnloop: 14772aca94bSFlorian Hahn %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop ] 14872aca94bSFlorian Hahn %gep.src.1 = getelementptr i8, ptr %src.1, i8 %iv 14972aca94bSFlorian Hahn %gep.src.2 = getelementptr i8, ptr %src.2, i8 %iv 15072aca94bSFlorian Hahn %ptr.sel = select i1 %c, ptr %gep.src.1, ptr %gep.src.2 15172aca94bSFlorian Hahn %l.1 = load i8, ptr %ptr.sel, align 8 15272aca94bSFlorian Hahn %gep.dst = getelementptr i8, ptr %dst, i8 %iv 15372aca94bSFlorian Hahn store i8 %l.1, ptr %gep.dst, align 2 15472aca94bSFlorian Hahn %iv.next = add nsw nuw i8 %iv, 1 15572aca94bSFlorian Hahn %ec = icmp eq i8 %iv.next, %n 15672aca94bSFlorian Hahn br i1 %ec, label %exit, label %loop 15772aca94bSFlorian Hahn 15872aca94bSFlorian Hahnexit: 15972aca94bSFlorian Hahn ret void 16072aca94bSFlorian Hahn} 16172aca94bSFlorian Hahn 16272aca94bSFlorian Hahn 16372aca94bSFlorian Hahndefine void @test_loop_dependent_select2(ptr %src.1, ptr %src.2, ptr %dst, i8 %n, i8 %x) { 16472aca94bSFlorian Hahn; CHECK-LABEL: @test_loop_dependent_select2( 16572aca94bSFlorian Hahn; CHECK-NEXT: entry: 166*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[N:%.*]], -1 167*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32 168*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = add nuw nsw i32 [[TMP1]], 1 169*e9cced27SFlorian Hahn; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[TMP2]], 2 170*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]] 171*e9cced27SFlorian Hahn; CHECK: vector.memcheck: 172*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = add i8 [[N]], -1 173*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP4:%.*]] = zext i8 [[TMP3]] to i64 174*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = add nuw nsw i64 [[TMP4]], 1 175*e9cced27SFlorian Hahn; CHECK-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[DST:%.*]], i64 [[TMP5]] 176*e9cced27SFlorian Hahn; CHECK-NEXT: [[UGLYGEP1:%.*]] = getelementptr i8, ptr [[SRC_1:%.*]], i64 1 177*e9cced27SFlorian Hahn; CHECK-NEXT: [[SRC_1_FR:%.*]] = freeze ptr [[SRC_1]] 178*e9cced27SFlorian Hahn; CHECK-NEXT: [[UGLYGEP1_FR:%.*]] = freeze ptr [[UGLYGEP1]] 179*e9cced27SFlorian Hahn; CHECK-NEXT: [[UGLYGEP2:%.*]] = getelementptr i8, ptr [[SRC_2:%.*]], i64 1 180*e9cced27SFlorian Hahn; CHECK-NEXT: [[SRC_2_FR:%.*]] = freeze ptr [[SRC_2]] 181*e9cced27SFlorian Hahn; CHECK-NEXT: [[UGLYGEP2_FR:%.*]] = freeze ptr [[UGLYGEP2]] 182*e9cced27SFlorian Hahn; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[DST]], [[UGLYGEP1_FR]] 183*e9cced27SFlorian Hahn; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[SRC_1_FR]], [[UGLYGEP]] 184*e9cced27SFlorian Hahn; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]] 185*e9cced27SFlorian Hahn; CHECK-NEXT: [[BOUND03:%.*]] = icmp ult ptr [[DST]], [[UGLYGEP2_FR]] 186*e9cced27SFlorian Hahn; CHECK-NEXT: [[BOUND14:%.*]] = icmp ult ptr [[SRC_2_FR]], [[UGLYGEP]] 187*e9cced27SFlorian Hahn; CHECK-NEXT: [[FOUND_CONFLICT5:%.*]] = and i1 [[BOUND03]], [[BOUND14]] 188*e9cced27SFlorian Hahn; CHECK-NEXT: [[CONFLICT_RDX:%.*]] = or i1 [[FOUND_CONFLICT]], [[FOUND_CONFLICT5]] 189*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[CONFLICT_RDX]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]] 190*e9cced27SFlorian Hahn; CHECK: vector.ph: 191*e9cced27SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[TMP2]], 2 192*e9cced27SFlorian Hahn; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[TMP2]], [[N_MOD_VF]] 193*e9cced27SFlorian Hahn; CHECK-NEXT: [[IND_END:%.*]] = trunc i32 [[N_VEC]] to i8 194*e9cced27SFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 195*e9cced27SFlorian Hahn; CHECK: vector.body: 196*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 197*e9cced27SFlorian Hahn; CHECK-NEXT: [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i8 198*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDUCTION:%.*]] = add i8 [[OFFSET_IDX]], 0 199*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDUCTION6:%.*]] = add i8 [[OFFSET_IDX]], 1 200*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP6:%.*]] = icmp ult i8 [[INDUCTION]], [[X:%.*]] 201*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP7:%.*]] = icmp ult i8 [[INDUCTION6]], [[X]] 202*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = select i1 [[TMP6]], ptr [[SRC_1]], ptr [[SRC_2]] 203*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = select i1 [[TMP7]], ptr [[SRC_1]], ptr [[SRC_2]] 204*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP8]], align 8, !alias.scope !10 205*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP9]], align 8, !alias.scope !10 206*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[DST]], i8 [[INDUCTION]] 207*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[DST]], i8 [[INDUCTION6]] 208*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[TMP10]], ptr [[TMP12]], align 2, !alias.scope !13, !noalias !15 209*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[TMP11]], ptr [[TMP13]], align 2, !alias.scope !13, !noalias !15 210*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2 211*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]] 212*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]] 213*e9cced27SFlorian Hahn; CHECK: middle.block: 214*e9cced27SFlorian Hahn; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[TMP2]], [[N_VEC]] 215*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]] 216*e9cced27SFlorian Hahn; CHECK: scalar.ph: 217*e9cced27SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_MEMCHECK]] ] 218*e9cced27SFlorian Hahn; CHECK-NEXT: br label [[LOOP:%.*]] 219*e9cced27SFlorian Hahn; CHECK: loop: 220*e9cced27SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 221*e9cced27SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[IV]], [[X]] 222*e9cced27SFlorian Hahn; CHECK-NEXT: [[PTR_SEL:%.*]] = select i1 [[C]], ptr [[SRC_1]], ptr [[SRC_2]] 223*e9cced27SFlorian Hahn; CHECK-NEXT: [[L_1:%.*]] = load i8, ptr [[PTR_SEL]], align 8 224*e9cced27SFlorian Hahn; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr i8, ptr [[DST]], i8 [[IV]] 225*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[L_1]], ptr [[GEP_DST]], align 2 226*e9cced27SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1 227*e9cced27SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp eq i8 [[IV_NEXT]], [[N]] 228*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP18:![0-9]+]] 229*e9cced27SFlorian Hahn; CHECK: exit: 230*e9cced27SFlorian Hahn; CHECK-NEXT: ret void 23172aca94bSFlorian Hahn; 23272aca94bSFlorian Hahnentry: 23372aca94bSFlorian Hahn br label %loop 23472aca94bSFlorian Hahn 23572aca94bSFlorian Hahnloop: 23672aca94bSFlorian Hahn %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop ] 23772aca94bSFlorian Hahn %c = icmp ult i8 %iv, %x 23872aca94bSFlorian Hahn %ptr.sel = select i1 %c, ptr %src.1, ptr %src.2 23972aca94bSFlorian Hahn %l.1 = load i8, ptr %ptr.sel, align 8 24072aca94bSFlorian Hahn %gep.dst = getelementptr i8, ptr %dst, i8 %iv 24172aca94bSFlorian Hahn store i8 %l.1, ptr %gep.dst, align 2 24272aca94bSFlorian Hahn %iv.next = add nsw nuw i8 %iv, 1 24372aca94bSFlorian Hahn %ec = icmp eq i8 %iv.next, %n 24472aca94bSFlorian Hahn br i1 %ec, label %exit, label %loop 24572aca94bSFlorian Hahn 24672aca94bSFlorian Hahnexit: 24772aca94bSFlorian Hahn ret void 24872aca94bSFlorian Hahn} 24972aca94bSFlorian Hahn 25072aca94bSFlorian Hahndefine void @test_loop_dependent_select_first_ptr_noundef(ptr noundef %src.1, ptr %src.2, ptr %dst, i8 %n, i8 %x) { 25172aca94bSFlorian Hahn; CHECK-LABEL: @test_loop_dependent_select_first_ptr_noundef( 25272aca94bSFlorian Hahn; CHECK-NEXT: entry: 253*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[N:%.*]], -1 254*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32 255*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = add nuw nsw i32 [[TMP1]], 1 256*e9cced27SFlorian Hahn; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[TMP2]], 2 257*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]] 258*e9cced27SFlorian Hahn; CHECK: vector.memcheck: 259*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = add i8 [[N]], -1 260*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP4:%.*]] = zext i8 [[TMP3]] to i64 261*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = add nuw nsw i64 [[TMP4]], 1 262*e9cced27SFlorian Hahn; CHECK-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[DST:%.*]], i64 [[TMP5]] 263*e9cced27SFlorian Hahn; CHECK-NEXT: [[UGLYGEP1:%.*]] = getelementptr i8, ptr [[SRC_1:%.*]], i64 1 264*e9cced27SFlorian Hahn; CHECK-NEXT: [[UGLYGEP2:%.*]] = getelementptr i8, ptr [[SRC_2:%.*]], i64 1 265*e9cced27SFlorian Hahn; CHECK-NEXT: [[SRC_2_FR:%.*]] = freeze ptr [[SRC_2]] 266*e9cced27SFlorian Hahn; CHECK-NEXT: [[UGLYGEP2_FR:%.*]] = freeze ptr [[UGLYGEP2]] 267*e9cced27SFlorian Hahn; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[DST]], [[UGLYGEP1]] 268*e9cced27SFlorian Hahn; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[SRC_1]], [[UGLYGEP]] 269*e9cced27SFlorian Hahn; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]] 270*e9cced27SFlorian Hahn; CHECK-NEXT: [[BOUND03:%.*]] = icmp ult ptr [[DST]], [[UGLYGEP2_FR]] 271*e9cced27SFlorian Hahn; CHECK-NEXT: [[BOUND14:%.*]] = icmp ult ptr [[SRC_2_FR]], [[UGLYGEP]] 272*e9cced27SFlorian Hahn; CHECK-NEXT: [[FOUND_CONFLICT5:%.*]] = and i1 [[BOUND03]], [[BOUND14]] 273*e9cced27SFlorian Hahn; CHECK-NEXT: [[CONFLICT_RDX:%.*]] = or i1 [[FOUND_CONFLICT]], [[FOUND_CONFLICT5]] 274*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[CONFLICT_RDX]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]] 275*e9cced27SFlorian Hahn; CHECK: vector.ph: 276*e9cced27SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[TMP2]], 2 277*e9cced27SFlorian Hahn; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[TMP2]], [[N_MOD_VF]] 278*e9cced27SFlorian Hahn; CHECK-NEXT: [[IND_END:%.*]] = trunc i32 [[N_VEC]] to i8 279*e9cced27SFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 280*e9cced27SFlorian Hahn; CHECK: vector.body: 281*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 282*e9cced27SFlorian Hahn; CHECK-NEXT: [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i8 283*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDUCTION:%.*]] = add i8 [[OFFSET_IDX]], 0 284*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDUCTION6:%.*]] = add i8 [[OFFSET_IDX]], 1 285*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP6:%.*]] = icmp ult i8 [[INDUCTION]], [[X:%.*]] 286*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP7:%.*]] = icmp ult i8 [[INDUCTION6]], [[X]] 287*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = select i1 [[TMP6]], ptr [[SRC_1]], ptr [[SRC_2]] 288*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = select i1 [[TMP7]], ptr [[SRC_1]], ptr [[SRC_2]] 289*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP8]], align 8, !alias.scope !19 290*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP9]], align 8, !alias.scope !19 291*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[DST]], i8 [[INDUCTION]] 292*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[DST]], i8 [[INDUCTION6]] 293*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[TMP10]], ptr [[TMP12]], align 2, !alias.scope !22, !noalias !24 294*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[TMP11]], ptr [[TMP13]], align 2, !alias.scope !22, !noalias !24 295*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2 296*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]] 297*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP26:![0-9]+]] 298*e9cced27SFlorian Hahn; CHECK: middle.block: 299*e9cced27SFlorian Hahn; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[TMP2]], [[N_VEC]] 300*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]] 301*e9cced27SFlorian Hahn; CHECK: scalar.ph: 302*e9cced27SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_MEMCHECK]] ] 303*e9cced27SFlorian Hahn; CHECK-NEXT: br label [[LOOP:%.*]] 304*e9cced27SFlorian Hahn; CHECK: loop: 305*e9cced27SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 306*e9cced27SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[IV]], [[X]] 307*e9cced27SFlorian Hahn; CHECK-NEXT: [[PTR_SEL:%.*]] = select i1 [[C]], ptr [[SRC_1]], ptr [[SRC_2]] 308*e9cced27SFlorian Hahn; CHECK-NEXT: [[L_1:%.*]] = load i8, ptr [[PTR_SEL]], align 8 309*e9cced27SFlorian Hahn; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr i8, ptr [[DST]], i8 [[IV]] 310*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[L_1]], ptr [[GEP_DST]], align 2 311*e9cced27SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1 312*e9cced27SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp eq i8 [[IV_NEXT]], [[N]] 313*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP27:![0-9]+]] 314*e9cced27SFlorian Hahn; CHECK: exit: 315*e9cced27SFlorian Hahn; CHECK-NEXT: ret void 31672aca94bSFlorian Hahn; 31772aca94bSFlorian Hahnentry: 31872aca94bSFlorian Hahn br label %loop 31972aca94bSFlorian Hahn 32072aca94bSFlorian Hahnloop: 32172aca94bSFlorian Hahn %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop ] 32272aca94bSFlorian Hahn %c = icmp ult i8 %iv, %x 32372aca94bSFlorian Hahn %ptr.sel = select i1 %c, ptr %src.1, ptr %src.2 32472aca94bSFlorian Hahn %l.1 = load i8, ptr %ptr.sel, align 8 32572aca94bSFlorian Hahn %gep.dst = getelementptr i8, ptr %dst, i8 %iv 32672aca94bSFlorian Hahn store i8 %l.1, ptr %gep.dst, align 2 32772aca94bSFlorian Hahn %iv.next = add nsw nuw i8 %iv, 1 32872aca94bSFlorian Hahn %ec = icmp eq i8 %iv.next, %n 32972aca94bSFlorian Hahn br i1 %ec, label %exit, label %loop 33072aca94bSFlorian Hahn 33172aca94bSFlorian Hahnexit: 33272aca94bSFlorian Hahn ret void 33372aca94bSFlorian Hahn} 33472aca94bSFlorian Hahn 33572aca94bSFlorian Hahndefine void @test_loop_dependent_select_second_ptr_noundef(ptr %src.1, ptr noundef %src.2, ptr %dst, i8 %n, i8 %x) { 33672aca94bSFlorian Hahn; CHECK-LABEL: @test_loop_dependent_select_second_ptr_noundef( 33772aca94bSFlorian Hahn; CHECK-NEXT: entry: 338*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[N:%.*]], -1 339*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32 340*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = add nuw nsw i32 [[TMP1]], 1 341*e9cced27SFlorian Hahn; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[TMP2]], 2 342*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]] 343*e9cced27SFlorian Hahn; CHECK: vector.memcheck: 344*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = add i8 [[N]], -1 345*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP4:%.*]] = zext i8 [[TMP3]] to i64 346*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = add nuw nsw i64 [[TMP4]], 1 347*e9cced27SFlorian Hahn; CHECK-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[DST:%.*]], i64 [[TMP5]] 348*e9cced27SFlorian Hahn; CHECK-NEXT: [[UGLYGEP1:%.*]] = getelementptr i8, ptr [[SRC_1:%.*]], i64 1 349*e9cced27SFlorian Hahn; CHECK-NEXT: [[SRC_1_FR:%.*]] = freeze ptr [[SRC_1]] 350*e9cced27SFlorian Hahn; CHECK-NEXT: [[UGLYGEP1_FR:%.*]] = freeze ptr [[UGLYGEP1]] 351*e9cced27SFlorian Hahn; CHECK-NEXT: [[UGLYGEP2:%.*]] = getelementptr i8, ptr [[SRC_2:%.*]], i64 1 352*e9cced27SFlorian Hahn; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[DST]], [[UGLYGEP1_FR]] 353*e9cced27SFlorian Hahn; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[SRC_1_FR]], [[UGLYGEP]] 354*e9cced27SFlorian Hahn; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]] 355*e9cced27SFlorian Hahn; CHECK-NEXT: [[BOUND03:%.*]] = icmp ult ptr [[DST]], [[UGLYGEP2]] 356*e9cced27SFlorian Hahn; CHECK-NEXT: [[BOUND14:%.*]] = icmp ult ptr [[SRC_2]], [[UGLYGEP]] 357*e9cced27SFlorian Hahn; CHECK-NEXT: [[FOUND_CONFLICT5:%.*]] = and i1 [[BOUND03]], [[BOUND14]] 358*e9cced27SFlorian Hahn; CHECK-NEXT: [[CONFLICT_RDX:%.*]] = or i1 [[FOUND_CONFLICT]], [[FOUND_CONFLICT5]] 359*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[CONFLICT_RDX]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]] 360*e9cced27SFlorian Hahn; CHECK: vector.ph: 361*e9cced27SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[TMP2]], 2 362*e9cced27SFlorian Hahn; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[TMP2]], [[N_MOD_VF]] 363*e9cced27SFlorian Hahn; CHECK-NEXT: [[IND_END:%.*]] = trunc i32 [[N_VEC]] to i8 364*e9cced27SFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 365*e9cced27SFlorian Hahn; CHECK: vector.body: 366*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 367*e9cced27SFlorian Hahn; CHECK-NEXT: [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i8 368*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDUCTION:%.*]] = add i8 [[OFFSET_IDX]], 0 369*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDUCTION6:%.*]] = add i8 [[OFFSET_IDX]], 1 370*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP6:%.*]] = icmp ult i8 [[INDUCTION]], [[X:%.*]] 371*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP7:%.*]] = icmp ult i8 [[INDUCTION6]], [[X]] 372*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = select i1 [[TMP6]], ptr [[SRC_1]], ptr [[SRC_2]] 373*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = select i1 [[TMP7]], ptr [[SRC_1]], ptr [[SRC_2]] 374*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP8]], align 8, !alias.scope !28 375*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP9]], align 8, !alias.scope !28 376*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[DST]], i8 [[INDUCTION]] 377*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[DST]], i8 [[INDUCTION6]] 378*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[TMP10]], ptr [[TMP12]], align 2, !alias.scope !31, !noalias !33 379*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[TMP11]], ptr [[TMP13]], align 2, !alias.scope !31, !noalias !33 380*e9cced27SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2 381*e9cced27SFlorian Hahn; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]] 382*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP35:![0-9]+]] 383*e9cced27SFlorian Hahn; CHECK: middle.block: 384*e9cced27SFlorian Hahn; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[TMP2]], [[N_VEC]] 385*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]] 386*e9cced27SFlorian Hahn; CHECK: scalar.ph: 387*e9cced27SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_MEMCHECK]] ] 388*e9cced27SFlorian Hahn; CHECK-NEXT: br label [[LOOP:%.*]] 389*e9cced27SFlorian Hahn; CHECK: loop: 390*e9cced27SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 391*e9cced27SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[IV]], [[X]] 392*e9cced27SFlorian Hahn; CHECK-NEXT: [[PTR_SEL:%.*]] = select i1 [[C]], ptr [[SRC_1]], ptr [[SRC_2]] 393*e9cced27SFlorian Hahn; CHECK-NEXT: [[L_1:%.*]] = load i8, ptr [[PTR_SEL]], align 8 394*e9cced27SFlorian Hahn; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr i8, ptr [[DST]], i8 [[IV]] 395*e9cced27SFlorian Hahn; CHECK-NEXT: store i8 [[L_1]], ptr [[GEP_DST]], align 2 396*e9cced27SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1 397*e9cced27SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp eq i8 [[IV_NEXT]], [[N]] 398*e9cced27SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP36:![0-9]+]] 399*e9cced27SFlorian Hahn; CHECK: exit: 400*e9cced27SFlorian Hahn; CHECK-NEXT: ret void 40172aca94bSFlorian Hahn; 40272aca94bSFlorian Hahnentry: 40372aca94bSFlorian Hahn br label %loop 40472aca94bSFlorian Hahn 40572aca94bSFlorian Hahnloop: 40672aca94bSFlorian Hahn %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop ] 40772aca94bSFlorian Hahn %c = icmp ult i8 %iv, %x 40872aca94bSFlorian Hahn %ptr.sel = select i1 %c, ptr %src.1, ptr %src.2 40972aca94bSFlorian Hahn %l.1 = load i8, ptr %ptr.sel, align 8 41072aca94bSFlorian Hahn %gep.dst = getelementptr i8, ptr %dst, i8 %iv 41172aca94bSFlorian Hahn store i8 %l.1, ptr %gep.dst, align 2 41272aca94bSFlorian Hahn %iv.next = add nsw nuw i8 %iv, 1 41372aca94bSFlorian Hahn %ec = icmp eq i8 %iv.next, %n 41472aca94bSFlorian Hahn br i1 %ec, label %exit, label %loop 41572aca94bSFlorian Hahn 41672aca94bSFlorian Hahnexit: 41772aca94bSFlorian Hahn ret void 41872aca94bSFlorian Hahn} 419