@@ -460,12 +460,18 @@ define void @latch_branch_cost(ptr %dst) {
460460; PRED-NEXT: [[TMP25:%.*]] = icmp eq i64 [[INDEX_NEXT]], 104
461461; PRED-NEXT: br i1 [[TMP25]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
462462; PRED: [[MIDDLE_BLOCK]]:
463- ; PRED-NEXT: br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH ]]
463+ ; PRED-NEXT: br label %[[EXIT:.*]]
464464; PRED: [[SCALAR_PH]]:
465- ; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 104, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
465+ ; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ]
466466; PRED-NEXT: br label %[[LOOP:.*]]
467467; PRED: [[LOOP]]:
468- ; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], %[[LOOP]] ]
468+ ; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
469+ ; PRED-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[DST]], i64 [[IV]]
470+ ; PRED-NEXT: store i8 0, ptr [[GEP]], align 1
471+ ; PRED-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
472+ ; PRED-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 100
473+ ; PRED-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP3:![0-9]+]]
474+ ; PRED: [[EXIT]]:
469475; PRED-NEXT: ret void
470476;
471477entry:
@@ -606,6 +612,10 @@ define i32 @header_mask_and_invariant_compare(ptr %A, ptr %B, ptr %C, ptr %D, pt
606612;
607613; PRED-LABEL: define i32 @header_mask_and_invariant_compare(
608614; PRED-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], ptr [[D:%.*]], ptr [[E:%.*]], i64 [[N:%.*]]) #[[ATTR1:[0-9]+]] {
615+ ; PRED-NEXT: [[ENTRY:.*]]:
616+ ; PRED-NEXT: br label %[[LOOP_HEADER:.*]]
617+ ; PRED: [[LOOP_HEADER]]:
618+ ; PRED-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
609619; PRED-NEXT: [[L_A:%.*]] = load i32, ptr [[A]], align 4
610620; PRED-NEXT: [[L_B:%.*]] = load i32, ptr [[B]], align 4
611621; PRED-NEXT: [[OR:%.*]] = or i32 [[L_B]], [[L_A]]
@@ -732,6 +742,16 @@ define void @multiple_exit_conditions(ptr %src, ptr noalias %dst) #1 {
732742; PRED-NEXT: [[ACTIVE_LANE_MASK_NEXT]] = call <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i64(i64 [[INDEX]], i64 [[TMP10]])
733743; PRED-NEXT: [[TMP16:%.*]] = xor <vscale x 2 x i1> [[ACTIVE_LANE_MASK_NEXT]], splat (i1 true)
734744; PRED-NEXT: [[TMP17:%.*]] = extractelement <vscale x 2 x i1> [[TMP16]], i32 0
745+ ; PRED-NEXT: br i1 [[TMP17]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
746+ ; PRED: [[MIDDLE_BLOCK]]:
747+ ; PRED-NEXT: br label %[[EXIT:.*]]
748+ ; PRED: [[SCALAR_PH]]:
749+ ; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ]
750+ ; PRED-NEXT: [[BC_RESUME_VAL1:%.*]] = phi i64 [ 0, %[[ENTRY]] ]
751+ ; PRED-NEXT: br label %[[LOOP:.*]]
752+ ; PRED: [[LOOP]]:
753+ ; PRED-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[PTR_IV_NEXT:%.*]], %[[LOOP]] ]
754+ ; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
735755; PRED-NEXT: [[L:%.*]] = load i16, ptr [[SRC]], align 2
736756; PRED-NEXT: [[O:%.*]] = or i16 [[L]], 1
737757; PRED-NEXT: [[CONV:%.*]] = uitofp i16 [[O]] to double
@@ -850,6 +870,14 @@ define void @low_trip_count_fold_tail_scalarized_store(ptr %dst) {
850870; DEFAULT: [[PRED_STORE_CONTINUE14]]:
851871; DEFAULT-NEXT: [[VEC_IND_NEXT]] = add <8 x i64> [[VEC_IND]], splat (i64 8)
852872; DEFAULT-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
873+ ; DEFAULT-NEXT: br i1 true, label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]]
874+ ; DEFAULT: [[MIDDLE_BLOCK]]:
875+ ; DEFAULT-NEXT: br label %[[EXIT:.*]]
876+ ; DEFAULT: [[SCALAR_PH]]:
877+ ; DEFAULT-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ]
878+ ; DEFAULT-NEXT: br label %[[LOOP:.*]]
879+ ; DEFAULT: [[LOOP]]:
880+ ; DEFAULT-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
853881; DEFAULT-NEXT: [[IV_TRUNC:%.*]] = trunc i64 [[IV]] to i8
854882; DEFAULT-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[DST]], i64 [[IV]]
855883; DEFAULT-NEXT: store i8 [[IV_TRUNC]], ptr [[GEP]], align 1
@@ -944,6 +972,14 @@ define void @low_trip_count_fold_tail_scalarized_store(ptr %dst) {
944972; PRED: [[PRED_STORE_CONTINUE14]]:
945973; PRED-NEXT: [[VEC_IND_NEXT]] = add <8 x i64> [[VEC_IND]], splat (i64 8)
946974; PRED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
975+ ; PRED-NEXT: br i1 true, label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
976+ ; PRED: [[MIDDLE_BLOCK]]:
977+ ; PRED-NEXT: br label %[[EXIT:.*]]
978+ ; PRED: [[SCALAR_PH]]:
979+ ; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ]
980+ ; PRED-NEXT: br label %[[LOOP:.*]]
981+ ; PRED: [[LOOP]]:
982+ ; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
947983; PRED-NEXT: [[IV_TRUNC:%.*]] = trunc i64 [[IV]] to i8
948984; PRED-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[DST]], i64 [[IV]]
949985; PRED-NEXT: store i8 [[IV_TRUNC]], ptr [[GEP]], align 1
@@ -1373,6 +1409,14 @@ define void @test_conditional_interleave_group (ptr noalias %src.1, ptr noalias
13731409; PRED-NEXT: [[TMP84:%.*]] = xor <8 x i1> [[ACTIVE_LANE_MASK_NEXT]], splat (i1 true)
13741410; PRED-NEXT: [[VEC_IND_NEXT]] = add <8 x i64> [[VEC_IND]], splat (i64 8)
13751411; PRED-NEXT: [[TMP85:%.*]] = extractelement <8 x i1> [[TMP84]], i32 0
1412+ ; PRED-NEXT: br i1 [[TMP85]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
1413+ ; PRED: [[MIDDLE_BLOCK]]:
1414+ ; PRED-NEXT: br label %[[EXIT:.*]]
1415+ ; PRED: [[SCALAR_PH]]:
1416+ ; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ 0, %[[VECTOR_SCEVCHECK]] ]
1417+ ; PRED-NEXT: br label %[[LOOP_HEADER:.*]]
1418+ ; PRED: [[LOOP_HEADER]]:
1419+ ; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
13761420; PRED-NEXT: [[TMP86:%.*]] = load float, ptr [[SRC_1]], align 4
13771421; PRED-NEXT: [[TMP87:%.*]] = load float, ptr [[SRC_2]], align 4
13781422; PRED-NEXT: [[MUL8_I_US:%.*]] = fmul float [[TMP87]], 0.000000e+00
@@ -1478,6 +1522,18 @@ define void @redundant_branch_and_tail_folding(ptr %dst, i1 %c) optsize {
14781522; DEFAULT-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
14791523; DEFAULT-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], splat (i64 4)
14801524; DEFAULT-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], 24
1525+ ; DEFAULT-NEXT: br i1 [[TMP11]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]
1526+ ; DEFAULT: [[MIDDLE_BLOCK]]:
1527+ ; DEFAULT-NEXT: br label %[[EXIT:.*]]
1528+ ; DEFAULT: [[SCALAR_PH]]:
1529+ ; DEFAULT-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ]
1530+ ; DEFAULT-NEXT: br label %[[LOOP_HEADER:.*]]
1531+ ; DEFAULT: [[LOOP_HEADER]]:
1532+ ; DEFAULT-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
1533+ ; DEFAULT-NEXT: br i1 [[C]], label %[[LOOP_LATCH]], label %[[THEN:.*]]
1534+ ; DEFAULT: [[THEN]]:
1535+ ; DEFAULT-NEXT: br label %[[LOOP_LATCH]]
1536+ ; DEFAULT: [[LOOP_LATCH]]:
14811537; DEFAULT-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
14821538; DEFAULT-NEXT: [[T:%.*]] = trunc nuw nsw i64 [[IV_NEXT]] to i32
14831539; DEFAULT-NEXT: store i32 [[T]], ptr [[DST]], align 4
@@ -1529,6 +1585,18 @@ define void @redundant_branch_and_tail_folding(ptr %dst, i1 %c) optsize {
15291585; PRED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
15301586; PRED-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], splat (i64 4)
15311587; PRED-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], 24
1588+ ; PRED-NEXT: br i1 [[TMP11]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
1589+ ; PRED: [[MIDDLE_BLOCK]]:
1590+ ; PRED-NEXT: br label %[[EXIT:.*]]
1591+ ; PRED: [[SCALAR_PH]]:
1592+ ; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ]
1593+ ; PRED-NEXT: br label %[[LOOP_HEADER:.*]]
1594+ ; PRED: [[LOOP_HEADER]]:
1595+ ; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
1596+ ; PRED-NEXT: br i1 [[C]], label %[[LOOP_LATCH]], label %[[THEN:.*]]
1597+ ; PRED: [[THEN]]:
1598+ ; PRED-NEXT: br label %[[LOOP_LATCH]]
1599+ ; PRED: [[LOOP_LATCH]]:
15321600; PRED-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
15331601; PRED-NEXT: [[T:%.*]] = trunc nuw nsw i64 [[IV_NEXT]] to i32
15341602; PRED-NEXT: store i32 [[T]], ptr [[DST]], align 4
0 commit comments