1- ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
1+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
22; RUN: opt -passes='loop-mssa(simple-loop-unswitch<nontrivial>),verify<loops>' -S < %s | FileCheck %s
33
44declare void @clobber ()
55
6- define i32 @partial_unswitch_true_successor (ptr %ptr , i32 %N ) {
6+ define i32 @partial_unswitch_true_successor (ptr %ptr , i32 %N ) !prof !0 {
77; CHECK-LABEL: @partial_unswitch_true_successor(
88; CHECK-NEXT: entry:
99; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[PTR:%.*]], align 4
1010; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 100
11- ; CHECK-NEXT: br i1 [[TMP1]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]
11+ ; CHECK-NEXT: br i1 [[TMP1]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]], !prof [[PROF1:![0-9]+]]
1212; CHECK: entry.split.us:
1313; CHECK-NEXT: br label [[LOOP_HEADER_US:%.*]]
1414; CHECK: loop.header.us:
@@ -19,7 +19,7 @@ define i32 @partial_unswitch_true_successor(ptr %ptr, i32 %N) {
1919; CHECK: loop.latch.us:
2020; CHECK-NEXT: [[C_US:%.*]] = icmp ult i32 [[IV_US]], [[N:%.*]]
2121; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV_US]], 1
22- ; CHECK-NEXT: br i1 [[C_US]], label [[LOOP_HEADER_US]], label [[EXIT_SPLIT_US:%.*]]
22+ ; CHECK-NEXT: br i1 [[C_US]], label [[LOOP_HEADER_US]], label [[EXIT_SPLIT_US:%.*]], !prof [[PROF2:![0-9]+]]
2323; CHECK: exit.split.us:
2424; CHECK-NEXT: br label [[EXIT:%.*]]
2525; CHECK: entry.split:
@@ -28,7 +28,7 @@ define i32 @partial_unswitch_true_successor(ptr %ptr, i32 %N) {
2828; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
2929; CHECK-NEXT: [[LV:%.*]] = load i32, ptr [[PTR]], align 4
3030; CHECK-NEXT: [[SC:%.*]] = icmp eq i32 [[LV]], 100
31- ; CHECK-NEXT: br i1 [[SC]], label [[NOCLOBBER:%.*]], label [[CLOBBER:%.*]]
31+ ; CHECK-NEXT: br i1 [[SC]], label [[NOCLOBBER:%.*]], label [[CLOBBER:%.*]], !prof [[PROF1]]
3232; CHECK: noclobber:
3333; CHECK-NEXT: br label [[LOOP_LATCH]]
3434; CHECK: clobber:
@@ -37,7 +37,7 @@ define i32 @partial_unswitch_true_successor(ptr %ptr, i32 %N) {
3737; CHECK: loop.latch:
3838; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]]
3939; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
40- ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP0 :![0-9]+]]
40+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !prof [[PROF2]], ! llvm.loop [[LOOP3 :![0-9]+]]
4141; CHECK: exit.split:
4242; CHECK-NEXT: br label [[EXIT]]
4343; CHECK: exit:
@@ -50,7 +50,7 @@ loop.header:
5050 %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop.latch ]
5151 %lv = load i32 , ptr %ptr
5252 %sc = icmp eq i32 %lv , 100
53- br i1 %sc , label %noclobber , label %clobber
53+ br i1 %sc , label %noclobber , label %clobber , !prof !1
5454
5555noclobber:
5656 br label %loop.latch
@@ -62,7 +62,7 @@ clobber:
6262loop.latch:
6363 %c = icmp ult i32 %iv , %N
6464 %iv.next = add i32 %iv , 1
65- br i1 %c , label %loop.header , label %exit
65+ br i1 %c , label %loop.header , label %exit , !prof !2
6666
6767exit:
6868 ret i32 10
@@ -102,7 +102,7 @@ define i32 @partial_unswitch_false_successor(ptr %ptr, i32 %N) {
102102; CHECK: loop.latch:
103103; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]]
104104; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
105- ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP2 :![0-9]+]]
105+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP5 :![0-9]+]]
106106; CHECK: exit.split:
107107; CHECK-NEXT: br label [[EXIT]]
108108; CHECK: exit:
@@ -171,7 +171,7 @@ define i32 @partial_unswtich_gep_load_icmp(ptr %ptr, i32 %N) {
171171; CHECK: loop.latch:
172172; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]]
173173; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
174- ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP3 :![0-9]+]]
174+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP6 :![0-9]+]]
175175; CHECK: exit.split:
176176; CHECK-NEXT: br label [[EXIT]]
177177; CHECK: exit:
@@ -246,7 +246,7 @@ define i32 @partial_unswitch_reduction_phi(ptr %ptr, i32 %N) {
246246; CHECK-NEXT: [[RED_NEXT]] = phi i32 [ [[ADD_5]], [[CLOBBER]] ], [ [[ADD_10]], [[NOCLOBBER]] ]
247247; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]]
248248; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
249- ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP4 :![0-9]+]]
249+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP7 :![0-9]+]]
250250; CHECK: exit.split:
251251; CHECK-NEXT: [[RED_NEXT_LCSSA:%.*]] = phi i32 [ [[RED_NEXT]], [[LOOP_LATCH]] ]
252252; CHECK-NEXT: br label [[EXIT]]
@@ -325,7 +325,7 @@ define i32 @partial_unswitch_true_successor_noclobber(ptr noalias %ptr.1, ptr no
325325; CHECK: loop.latch:
326326; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]]
327327; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
328- ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP5 :![0-9]+]]
328+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP8 :![0-9]+]]
329329; CHECK: exit.split:
330330; CHECK-NEXT: br label [[EXIT]]
331331; CHECK: exit:
@@ -637,7 +637,7 @@ define i32 @partial_unswitch_true_successor_preheader_insertion(ptr %ptr, i32 %N
637637; CHECK: loop.latch:
638638; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]]
639639; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
640- ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_LOOPEXIT_SPLIT:%.*]], !llvm.loop [[LOOP6 :![0-9]+]]
640+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_LOOPEXIT_SPLIT:%.*]], !llvm.loop [[LOOP9 :![0-9]+]]
641641; CHECK: exit.loopexit.split:
642642; CHECK-NEXT: br label [[EXIT_LOOPEXIT]]
643643; CHECK: exit.loopexit:
@@ -713,7 +713,7 @@ define i32 @partial_unswitch_true_successor_insert_point(ptr %ptr, i32 %N) {
713713; CHECK: loop.latch:
714714; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]]
715715; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
716- ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP7 :![0-9]+]]
716+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP10 :![0-9]+]]
717717; CHECK: exit.split:
718718; CHECK-NEXT: br label [[EXIT]]
719719; CHECK: exit:
@@ -784,7 +784,7 @@ define i32 @partial_unswitch_true_successor_hoist_invariant(ptr %ptr, i32 %N) {
784784; CHECK: loop.latch:
785785; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]]
786786; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
787- ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP8 :![0-9]+]]
787+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP11 :![0-9]+]]
788788; CHECK: exit.split:
789789; CHECK-NEXT: br label [[EXIT]]
790790; CHECK: exit:
@@ -1073,7 +1073,7 @@ define i32 @partial_unswitch_true_to_latch(ptr %ptr, i32 %N) {
10731073; CHECK: loop.latch:
10741074; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]]
10751075; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
1076- ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP9 :![0-9]+]]
1076+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP12 :![0-9]+]]
10771077; CHECK: exit.split:
10781078; CHECK-NEXT: br label [[EXIT]]
10791079; CHECK: exit:
@@ -1138,7 +1138,7 @@ define i32 @partial_unswitch_exiting_block_with_multiple_unswitch_candidates(i32
11381138; CHECK-NEXT: store i32 [[TMP1:%.*]], ptr [[PTR]], align 16
11391139; CHECK-NEXT: br label [[EXITING]]
11401140; CHECK: exiting:
1141- ; CHECK-NEXT: br i1 [[EXIT_COND]], label [[LOOP]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP10 :![0-9]+]]
1141+ ; CHECK-NEXT: br i1 [[EXIT_COND]], label [[LOOP]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP13 :![0-9]+]]
11421142; CHECK: exit.split:
11431143; CHECK-NEXT: [[RET_VAL:%.*]] = phi i32 [ 1, [[EXITING]] ]
11441144; CHECK-NEXT: br label [[EXIT]]
@@ -1249,7 +1249,7 @@ define i32 @partial_unswitch_true_successor_for_cost_calculation(ptr %ptr, i32 %
12491249; CHECK: loop.latch:
12501250; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]]
12511251; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
1252- ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP11 :![0-9]+]]
1252+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP14 :![0-9]+]]
12531253; CHECK: exit.split:
12541254; CHECK-NEXT: br label [[EXIT]]
12551255; CHECK: exit:
@@ -1360,7 +1360,7 @@ define i32 @partial_unswitch_true_successor_trunc(ptr %ptr, i32 %N) {
13601360; CHECK: loop.latch:
13611361; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]]
13621362; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
1363- ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP12 :![0-9]+]]
1363+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP15 :![0-9]+]]
13641364; CHECK: exit.split:
13651365; CHECK-NEXT: br label [[EXIT]]
13661366; CHECK: exit:
@@ -1425,7 +1425,7 @@ define i32 @partial_unswitch_false_successor_trunc(ptr %ptr, i32 %N) {
14251425; CHECK: loop.latch:
14261426; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]]
14271427; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
1428- ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP13 :![0-9]+]]
1428+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP16 :![0-9]+]]
14291429; CHECK: exit.split:
14301430; CHECK-NEXT: br label [[EXIT]]
14311431; CHECK: exit:
@@ -1456,15 +1456,26 @@ exit:
14561456 ret i32 10
14571457}
14581458
1459- ; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[UNSWITCH_PARTIAL_DISABLE:![0-9]+]]}
1460- ; CHECK: [[UNSWITCH_PARTIAL_DISABLE]] = !{!"llvm.loop.unswitch.partial.disable"}
1461- ; CHECK: [[LOOP2]] = distinct !{[[LOOP2]], [[UNSWITCH_PARTIAL_DISABLE]]}
1462- ; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[UNSWITCH_PARTIAL_DISABLE]]}
1463- ; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[UNSWITCH_PARTIAL_DISABLE]]}
1464- ; CHECK: [[LOOP5]] = distinct !{[[LOOP5]], [[UNSWITCH_PARTIAL_DISABLE]]}
1465- ; CHECK: [[LOOP6]] = distinct !{[[LOOP6]], [[UNSWITCH_PARTIAL_DISABLE]]}
1466- ; CHECK: [[LOOP7]] = distinct !{[[LOOP7]], [[UNSWITCH_PARTIAL_DISABLE]]}
1467- ; CHECK: [[LOOP8]] = distinct !{[[LOOP8]], [[UNSWITCH_PARTIAL_DISABLE]]}
1468- ; CHECK: [[LOOP9]] = distinct !{[[LOOP9]], [[UNSWITCH_PARTIAL_DISABLE]]}
1469- ; CHECK: [[LOOP10]] = distinct !{[[LOOP10]], [[UNSWITCH_PARTIAL_DISABLE]]}
1470- ; CHECK: [[LOOP11]] = distinct !{[[LOOP11]], [[UNSWITCH_PARTIAL_DISABLE]]}
1459+ !0 = !{!"function_entry_count" , i32 10 }
1460+ !1 = !{!"branch_weights" , i32 1000 , i32 1 }
1461+ !2 = !{!"branch_weights" , i32 100 , i32 3 }
1462+
1463+ ;.
1464+ ; CHECK: [[META0:![0-9]+]] = !{!"function_entry_count", i32 10}
1465+ ; CHECK: [[PROF1]] = !{!"branch_weights", i32 1000, i32 1}
1466+ ; CHECK: [[PROF2]] = !{!"branch_weights", i32 100, i32 3}
1467+ ; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META4:![0-9]+]]}
1468+ ; CHECK: [[META4]] = !{!"llvm.loop.unswitch.partial.disable"}
1469+ ; CHECK: [[LOOP5]] = distinct !{[[LOOP5]], [[META4]]}
1470+ ; CHECK: [[LOOP6]] = distinct !{[[LOOP6]], [[META4]]}
1471+ ; CHECK: [[LOOP7]] = distinct !{[[LOOP7]], [[META4]]}
1472+ ; CHECK: [[LOOP8]] = distinct !{[[LOOP8]], [[META4]]}
1473+ ; CHECK: [[LOOP9]] = distinct !{[[LOOP9]], [[META4]]}
1474+ ; CHECK: [[LOOP10]] = distinct !{[[LOOP10]], [[META4]]}
1475+ ; CHECK: [[LOOP11]] = distinct !{[[LOOP11]], [[META4]]}
1476+ ; CHECK: [[LOOP12]] = distinct !{[[LOOP12]], [[META4]]}
1477+ ; CHECK: [[LOOP13]] = distinct !{[[LOOP13]], [[META4]]}
1478+ ; CHECK: [[LOOP14]] = distinct !{[[LOOP14]], [[META4]]}
1479+ ; CHECK: [[LOOP15]] = distinct !{[[LOOP15]], [[META4]]}
1480+ ; CHECK: [[LOOP16]] = distinct !{[[LOOP16]], [[META4]]}
1481+ ;.
0 commit comments