blob: 6420396e9ff798ab584db02776112e79429935e2 [file] [log] [blame]
Chandler Carruthce40fa12017-01-25 02:49:01 +00001; This test checks that nested loops are revisited in various scenarios when
2; unrolling. Note that if we ever start doing outer loop peeling a test case
3; for that should be added here that will look essentially like a hybrid of the
4; current two cases.
5;
6; RUN: opt < %s -disable-output -debug-pass-manager 2>&1 \
Teresa Johnsonecd90132017-08-02 20:35:29 +00007; RUN: -passes='require<opt-remark-emit>,loop(unroll-full)' \
Chandler Carruthce40fa12017-01-25 02:49:01 +00008; RUN: | FileCheck %s
9;
10; Also run in a special mode that visits children.
11; RUN: opt < %s -disable-output -debug-pass-manager -unroll-revisit-child-loops 2>&1 \
Teresa Johnsonecd90132017-08-02 20:35:29 +000012; RUN: -passes='require<opt-remark-emit>,loop(unroll-full)' \
Chandler Carruthce40fa12017-01-25 02:49:01 +000013; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-CHILDREN
14
15; Basic test is fully unrolled and we revisit the post-unroll new sibling
16; loops, including the ones that used to be child loops.
17define void @full_unroll(i1* %ptr) {
18; CHECK-LABEL: FunctionToLoopPassAdaptor{{.*}} on full_unroll
Teresa Johnsonecd90132017-08-02 20:35:29 +000019; CHECK-NOT: LoopFullUnrollPass
Chandler Carruthce40fa12017-01-25 02:49:01 +000020
21entry:
22 br label %l0
23
24l0:
25 %cond.0 = load volatile i1, i1* %ptr
26 br i1 %cond.0, label %l0.0.ph, label %exit
27
28l0.0.ph:
29 br label %l0.0
30
31l0.0:
32 %iv = phi i32 [ %iv.next, %l0.0.latch ], [ 0, %l0.0.ph ]
33 %iv.next = add i32 %iv, 1
34 br label %l0.0.0.ph
35
36l0.0.0.ph:
37 br label %l0.0.0
38
39l0.0.0:
40 %cond.0.0.0 = load volatile i1, i1* %ptr
41 br i1 %cond.0.0.0, label %l0.0.0, label %l0.0.1.ph
Teresa Johnsonecd90132017-08-02 20:35:29 +000042; CHECK: LoopFullUnrollPass on Loop at depth 3 containing: %l0.0.0<header>
43; CHECK-NOT: LoopFullUnrollPass
Chandler Carruthce40fa12017-01-25 02:49:01 +000044
45l0.0.1.ph:
46 br label %l0.0.1
47
48l0.0.1:
49 %cond.0.0.1 = load volatile i1, i1* %ptr
50 br i1 %cond.0.0.1, label %l0.0.1, label %l0.0.latch
Teresa Johnsonecd90132017-08-02 20:35:29 +000051; CHECK: LoopFullUnrollPass on Loop at depth 3 containing: %l0.0.1<header>
52; CHECK-NOT: LoopFullUnrollPass
Chandler Carruthce40fa12017-01-25 02:49:01 +000053
54l0.0.latch:
55 %cmp = icmp slt i32 %iv.next, 2
56 br i1 %cmp, label %l0.0, label %l0.latch
Teresa Johnsonecd90132017-08-02 20:35:29 +000057; CHECK: LoopFullUnrollPass on Loop at depth 2 containing: %l0.0
58; CHECK-NOT: LoopFullUnrollPass
Chandler Carruthce40fa12017-01-25 02:49:01 +000059;
60; Unrolling occurs, so we visit what were the inner loops twice over. First we
61; visit their clones, and then we visit the original loops re-parented.
Teresa Johnsonecd90132017-08-02 20:35:29 +000062; CHECK: LoopFullUnrollPass on Loop at depth 2 containing: %l0.0.1.1<header>
63; CHECK-NOT: LoopFullUnrollPass
64; CHECK: LoopFullUnrollPass on Loop at depth 2 containing: %l0.0.0.1<header>
65; CHECK-NOT: LoopFullUnrollPass
66; CHECK: LoopFullUnrollPass on Loop at depth 2 containing: %l0.0.1<header>
67; CHECK-NOT: LoopFullUnrollPass
68; CHECK: LoopFullUnrollPass on Loop at depth 2 containing: %l0.0.0<header>
69; CHECK-NOT: LoopFullUnrollPass
Chandler Carruthce40fa12017-01-25 02:49:01 +000070
71l0.latch:
72 br label %l0
Teresa Johnsonecd90132017-08-02 20:35:29 +000073; CHECK: LoopFullUnrollPass on Loop at depth 1 containing: %l0<header>
74; CHECK-NOT: LoopFullUnrollPass
Chandler Carruthce40fa12017-01-25 02:49:01 +000075
76exit:
77 ret void
78}
79
80; Now we test forced runtime partial unrolling with metadata. Here we end up
81; duplicating child loops without changing their structure and so they aren't by
82; default visited, but will be visited with a special parameter.
83define void @partial_unroll(i32 %count, i1* %ptr) {
84; CHECK-LABEL: FunctionToLoopPassAdaptor{{.*}} on partial_unroll
Teresa Johnsonecd90132017-08-02 20:35:29 +000085; CHECK-NOT: LoopFullUnrollPass
Chandler Carruthce40fa12017-01-25 02:49:01 +000086
87entry:
88 br label %l0
89
90l0:
91 %cond.0 = load volatile i1, i1* %ptr
92 br i1 %cond.0, label %l0.0.ph, label %exit
93
94l0.0.ph:
95 br label %l0.0
96
97l0.0:
98 %iv = phi i32 [ %iv.next, %l0.0.latch ], [ 0, %l0.0.ph ]
99 %iv.next = add i32 %iv, 1
100 br label %l0.0.0.ph
101
102l0.0.0.ph:
103 br label %l0.0.0
104
105l0.0.0:
106 %cond.0.0.0 = load volatile i1, i1* %ptr
107 br i1 %cond.0.0.0, label %l0.0.0, label %l0.0.1.ph
Teresa Johnsonecd90132017-08-02 20:35:29 +0000108; CHECK: LoopFullUnrollPass on Loop at depth 3 containing: %l0.0.0<header>
109; CHECK-NOT: LoopFullUnrollPass
Chandler Carruthce40fa12017-01-25 02:49:01 +0000110
111l0.0.1.ph:
112 br label %l0.0.1
113
114l0.0.1:
115 %cond.0.0.1 = load volatile i1, i1* %ptr
116 br i1 %cond.0.0.1, label %l0.0.1, label %l0.0.latch
Teresa Johnsonecd90132017-08-02 20:35:29 +0000117; CHECK: LoopFullUnrollPass on Loop at depth 3 containing: %l0.0.1<header>
118; CHECK-NOT: LoopFullUnrollPass
Chandler Carruthce40fa12017-01-25 02:49:01 +0000119
120l0.0.latch:
121 %cmp = icmp slt i32 %iv.next, %count
122 br i1 %cmp, label %l0.0, label %l0.latch, !llvm.loop !1
Teresa Johnsonecd90132017-08-02 20:35:29 +0000123; CHECK: LoopFullUnrollPass on Loop at depth 2 containing: %l0.0
124; CHECK-NOT: LoopFullUnrollPass
Chandler Carruthce40fa12017-01-25 02:49:01 +0000125;
Michael Kuperstein5dd55e82017-01-26 01:04:11 +0000126; Partial unrolling occurs which introduces both new child loops and new sibling
Chandler Carruthce40fa12017-01-25 02:49:01 +0000127; loops. We only visit the child loops in a special mode, not by default.
Teresa Johnsonecd90132017-08-02 20:35:29 +0000128; CHECK-CHILDREN: LoopFullUnrollPass on Loop at depth 3 containing: %l0.0.0<header>
129; CHECK-CHILDREN-NOT: LoopFullUnrollPass
130; CHECK-CHILDREN: LoopFullUnrollPass on Loop at depth 3 containing: %l0.0.1<header>
131; CHECK-CHILDREN-NOT: LoopFullUnrollPass
132; CHECK-CHILDREN: LoopFullUnrollPass on Loop at depth 3 containing: %l0.0.0.1<header>
133; CHECK-CHILDREN-NOT: LoopFullUnrollPass
134; CHECK-CHILDREN: LoopFullUnrollPass on Loop at depth 3 containing: %l0.0.1.1<header>
135; CHECK-CHILDREN-NOT: LoopFullUnrollPass
Chandler Carruthce40fa12017-01-25 02:49:01 +0000136;
137; When we revisit children, we also revisit the current loop.
Teresa Johnsonecd90132017-08-02 20:35:29 +0000138; CHECK-CHILDREN: LoopFullUnrollPass on Loop at depth 2 containing: %l0.0<header>
139; CHECK-CHILDREN-NOT: LoopFullUnrollPass
Michael Kuperstein5dd55e82017-01-26 01:04:11 +0000140;
Evgeny Stupachenko21bef2c2017-03-02 17:38:46 +0000141; Revisit the children of the outer loop that are part of the epilogue.
Michael Kuperstein5dd55e82017-01-26 01:04:11 +0000142;
Teresa Johnsonecd90132017-08-02 20:35:29 +0000143; CHECK: LoopFullUnrollPass on Loop at depth 2 containing: %l0.0.0.epil<header>
144; CHECK-NOT: LoopFullUnrollPass
145; CHECK: LoopFullUnrollPass on Loop at depth 2 containing: %l0.0.1.epil<header>
146; CHECK-NOT: LoopFullUnrollPass
Chandler Carruthce40fa12017-01-25 02:49:01 +0000147l0.latch:
148 br label %l0
Teresa Johnsonecd90132017-08-02 20:35:29 +0000149; CHECK: LoopFullUnrollPass on Loop at depth 1 containing: %l0<header>
150; CHECK-NOT: LoopFullUnrollPass
Chandler Carruthce40fa12017-01-25 02:49:01 +0000151
152exit:
153 ret void
154}
155!1 = !{!1, !2}
156!2 = !{!"llvm.loop.unroll.count", i32 2}