@@ -403,11 +403,76 @@ for.end:
403
403
ret void
404
404
}
405
405
406
+ ; In this case we cannot peel the inner loop, because the condition involves
407
+ ; the outer induction variable.
408
+ define void @test5 (i32 %k ) {
409
+ ; CHECK-LABEL: @test5(
410
+ ; CHECK-NEXT: for.body.lr.ph:
411
+ ; CHECK-NEXT: br label [[OUTER_HEADER:%.*]]
412
+ ; CHECK: outer.header:
413
+ ; CHECK-NEXT: [[J:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH:%.*]] ], [ [[J_INC:%.*]], [[OUTER_INC:%.*]] ]
414
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
415
+ ; CHECK: for.body:
416
+ ; CHECK-NEXT: [[I_05:%.*]] = phi i32 [ 0, [[OUTER_HEADER]] ], [ [[INC:%.*]], [[FOR_INC:%.*]] ]
417
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i32 [[J]], 2
418
+ ; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
419
+ ; CHECK: if.then:
420
+ ; CHECK-NEXT: call void @f1()
421
+ ; CHECK-NEXT: br label [[FOR_INC]]
422
+ ; CHECK: if.else:
423
+ ; CHECK-NEXT: call void @f2()
424
+ ; CHECK-NEXT: br label [[FOR_INC]]
425
+ ; CHECK: for.inc:
426
+ ; CHECK-NEXT: [[INC]] = add nsw i32 [[I_05]], 1
427
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[INC]], [[K:%.*]]
428
+ ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[OUTER_INC]]
429
+ ; CHECK: outer.inc:
430
+ ; CHECK-NEXT: [[J_INC]] = add nsw i32 [[J]], 1
431
+ ; CHECK-NEXT: [[OUTER_CMP:%.*]] = icmp slt i32 [[J_INC]], [[K]]
432
+ ; CHECK-NEXT: br i1 [[OUTER_CMP]], label [[OUTER_HEADER]], label [[FOR_END:%.*]]
433
+ ; CHECK: for.end:
434
+ ; CHECK-NEXT: ret void
435
+ ;
436
+ for.body.lr.ph:
437
+ br label %outer.header
438
+
439
+ outer.header:
440
+ %j = phi i32 [ 0 , %for.body.lr.ph ], [ %j.inc , %outer.inc ]
441
+ br label %for.body
442
+
443
+ for.body:
444
+ %i.05 = phi i32 [ 0 , %outer.header ], [ %inc , %for.inc ]
445
+ %cmp1 = icmp ult i32 %j , 2
446
+ br i1 %cmp1 , label %if.then , label %if.else
447
+
448
+ if.then:
449
+ call void @f1 ()
450
+ br label %for.inc
451
+
452
+ if.else:
453
+ call void @f2 ()
454
+ br label %for.inc
455
+
456
+ for.inc:
457
+ %inc = add nsw i32 %i.05 , 1
458
+ %cmp = icmp slt i32 %inc , %k
459
+ br i1 %cmp , label %for.body , label %outer.inc
460
+
461
+ outer.inc:
462
+ %j.inc = add nsw i32 %j , 1
463
+ %outer.cmp = icmp slt i32 %j.inc , %k
464
+ br i1 %outer.cmp , label %outer.header , label %for.end
465
+
466
+
467
+ for.end:
468
+ ret void
469
+ }
470
+
406
471
; In this test, the condition involves 2 AddRecs. Without evaluating both
407
472
; AddRecs, we cannot prove that the condition becomes known in the loop body
408
473
; after peeling.
409
- define void @test5 (i32 %k ) {
410
- ; CHECK-LABEL: @test5 (
474
+ define void @test6 (i32 %k ) {
475
+ ; CHECK-LABEL: @test6 (
411
476
; CHECK-NEXT: entry:
412
477
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
413
478
; CHECK: for.body:
@@ -456,8 +521,8 @@ for.end:
456
521
ret void
457
522
}
458
523
459
- define void @test6 (i32 %k ) {
460
- ; CHECK-LABEL: @test6 (
524
+ define void @test7 (i32 %k ) {
525
+ ; CHECK-LABEL: @test7 (
461
526
; CHECK-NEXT: for.body.lr.ph:
462
527
; CHECK-NEXT: br label [[FOR_BODY_PEEL_BEGIN:%.*]]
463
528
; CHECK: for.body.peel.begin:
@@ -550,8 +615,8 @@ for.end:
550
615
ret void
551
616
}
552
617
553
- define void @test7 (i32 %k ) {
554
- ; CHECK-LABEL: @test7 (
618
+ define void @test8 (i32 %k ) {
619
+ ; CHECK-LABEL: @test8 (
555
620
; CHECK-NEXT: for.body.lr.ph:
556
621
; CHECK-NEXT: br label [[FOR_BODY_PEEL_BEGIN:%.*]]
557
622
; CHECK: for.body.peel.begin:
@@ -646,8 +711,8 @@ for.end:
646
711
647
712
; Comparison with non-monotonic predicate due to possible wrapping, loop
648
713
; body cannot be simplified.
649
- define void @test8 (i32 %k ) {
650
- ; CHECK-LABEL: @test8 (
714
+ define void @test9 (i32 %k ) {
715
+ ; CHECK-LABEL: @test9 (
651
716
; CHECK-NEXT: for.body.lr.ph:
652
717
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
653
718
; CHECK: for.body:
@@ -686,8 +751,8 @@ for.end:
686
751
}
687
752
; CHECK-NOT: llvm.loop.unroll.disable
688
753
689
- define void @test_9__peel_first_iter_via_slt_pred (i32 %len ) {
690
- ; CHECK-LABEL: @test_9__peel_first_iter_via_slt_pred (
754
+ define void @test_10__peel_first_iter_via_slt_pred (i32 %len ) {
755
+ ; CHECK-LABEL: @test_10__peel_first_iter_via_slt_pred (
691
756
; CHECK-NEXT: entry:
692
757
; CHECK-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[LEN:%.*]], 0
693
758
; CHECK-NEXT: br i1 [[CMP5]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]
@@ -753,8 +818,8 @@ if.end: ; preds = %if.then, %for.body
753
818
br i1 %exitcond , label %for.cond.cleanup , label %for.body
754
819
}
755
820
756
- define void @test_10__peel_first_iter_via_sgt_pred (i32 %len ) {
757
- ; CHECK-LABEL: @test_10__peel_first_iter_via_sgt_pred (
821
+ define void @test_11__peel_first_iter_via_sgt_pred (i32 %len ) {
822
+ ; CHECK-LABEL: @test_11__peel_first_iter_via_sgt_pred (
758
823
; CHECK-NEXT: entry:
759
824
; CHECK-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[LEN:%.*]], 0
760
825
; CHECK-NEXT: br i1 [[CMP5]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]
@@ -822,8 +887,8 @@ if.end: ; preds = %if.then, %for.body
822
887
823
888
; NOTE: here we should only peel the first iteration,
824
889
; i.e. all calls to sink() must stay in loop.
825
- define void @test11__peel_first_iter_via_eq_pred (i32 %len ) {
826
- ; CHECK-LABEL: @test11__peel_first_iter_via_eq_pred (
890
+ define void @test12__peel_first_iter_via_eq_pred (i32 %len ) {
891
+ ; CHECK-LABEL: @test12__peel_first_iter_via_eq_pred (
827
892
; CHECK-NEXT: entry:
828
893
; CHECK-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[LEN:%.*]], 0
829
894
; CHECK-NEXT: br i1 [[CMP5]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]
@@ -891,8 +956,8 @@ if.end: ; preds = %if.then, %for.body
891
956
892
957
; NOTE: here we should only peel the first iteration,
893
958
; i.e. all calls to sink() must stay in loop.
894
- define void @test12__peel_first_iter_via_ne_pred (i32 %len ) {
895
- ; CHECK-LABEL: @test12__peel_first_iter_via_ne_pred (
959
+ define void @test13__peel_first_iter_via_ne_pred (i32 %len ) {
960
+ ; CHECK-LABEL: @test13__peel_first_iter_via_ne_pred (
896
961
; CHECK-NEXT: entry:
897
962
; CHECK-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[LEN:%.*]], 0
898
963
; CHECK-NEXT: br i1 [[CMP5]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]
@@ -959,8 +1024,8 @@ if.end: ; preds = %if.then, %for.body
959
1024
}
960
1025
961
1026
; No peeling is profitable here.
962
- define void @test13__ivar_mod2_is_1 (i32 %len ) {
963
- ; CHECK-LABEL: @test13__ivar_mod2_is_1 (
1027
+ define void @test14__ivar_mod2_is_1 (i32 %len ) {
1028
+ ; CHECK-LABEL: @test14__ivar_mod2_is_1 (
964
1029
; CHECK-NEXT: entry:
965
1030
; CHECK-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[LEN:%.*]], 0
966
1031
; CHECK-NEXT: br i1 [[CMP5]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]
@@ -1009,8 +1074,8 @@ if.end: ; preds = %if.then, %for.body
1009
1074
}
1010
1075
1011
1076
; No peeling is profitable here.
1012
- define void @test14__ivar_mod2_is_0 (i32 %len ) {
1013
- ; CHECK-LABEL: @test14__ivar_mod2_is_0 (
1077
+ define void @test15__ivar_mod2_is_0 (i32 %len ) {
1078
+ ; CHECK-LABEL: @test15__ivar_mod2_is_0 (
1014
1079
; CHECK-NEXT: entry:
1015
1080
; CHECK-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[LEN:%.*]], 0
1016
1081
; CHECK-NEXT: br i1 [[CMP5]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]
@@ -1058,10 +1123,10 @@ if.end: ; preds = %if.then, %for.body
1058
1123
br i1 %exitcond , label %for.cond.cleanup , label %for.body
1059
1124
}
1060
1125
1061
- ; Similar to @test6 , we need to peel one extra iteration, and we can't do that
1126
+ ; Similar to @test7 , we need to peel one extra iteration, and we can't do that
1062
1127
; as per the -unroll-peel-max-count=4, so this shouldn't be peeled at all.
1063
- define void @test15 (i32 %k ) {
1064
- ; CHECK-LABEL: @test15 (
1128
+ define void @test16 (i32 %k ) {
1129
+ ; CHECK-LABEL: @test16 (
1065
1130
; CHECK-NEXT: for.body.lr.ph:
1066
1131
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
1067
1132
; CHECK: for.body:
@@ -1099,10 +1164,10 @@ for.end:
1099
1164
ret void
1100
1165
}
1101
1166
1102
- ; Similar to @test7 , we need to peel one extra iteration, and we can't do that
1167
+ ; Similar to @test8 , we need to peel one extra iteration, and we can't do that
1103
1168
; as per the -unroll-peel-max-count=4, so this shouldn't be peeled at all.
1104
- define void @test16 (i32 %k ) {
1105
- ; CHECK-LABEL: @test16 (
1169
+ define void @test17 (i32 %k ) {
1170
+ ; CHECK-LABEL: @test17 (
1106
1171
; CHECK-NEXT: for.body.lr.ph:
1107
1172
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
1108
1173
; CHECK: for.body:
0 commit comments