1 ; RUN: opt -S -passes='print<loopnest>' < %s 2>&1 > /dev/null | FileCheck %s
3 ; int f(int N, int M) {
5 ; for (int i = 0; i < N; ++i) {
6 ; for (int j = 0; j < M; ++j) res += i * j;
11 define i32 @f(i32 %N, i32 %M) #0 {
12 ; CHECK: IsPerfect=true, Depth=1, OutermostLoop: for.j, Loops: ( for.j )
13 ; CHECK: IsPerfect=true, Depth=2, OutermostLoop: for.i, Loops: ( for.i for.j )
15 %cmp4 = icmp slt i32 0, %N
16 br i1 %cmp4, label %for.i.ph, label %for.i.end
18 for.i.ph: ; preds = %entry
21 for.i: ; preds = %for.i.ph, %for.i.inc
22 %i.06 = phi i32 [ 0, %for.i.ph ], [ %inc5, %for.i.inc ]
23 %res.05 = phi i32 [ 0, %for.i.ph ], [ %res.1.lcssa, %for.i.inc ]
24 %cmp21 = icmp slt i32 0, %M
25 br i1 %cmp21, label %for.j.ph, label %for.j.end
27 for.j.ph: ; preds = %for.i
30 for.j: ; preds = %for.j.ph, %for.j.inc
31 %j.03 = phi i32 [ 0, %for.j.ph ], [ %inc, %for.j.inc ]
32 %res.12 = phi i32 [ %res.05, %for.j.ph ], [ %add, %for.j.inc ]
33 %mul = mul nsw i32 %i.06, %j.03
34 %add = add nsw i32 %res.12, %mul
37 for.j.inc: ; preds = %for.j
38 %inc = add nsw i32 %j.03, 1
39 %cmp2 = icmp slt i32 %inc, %M
40 br i1 %cmp2, label %for.j, label %for.j.end_crit_edge
42 for.j.end_crit_edge: ; preds = %for.j.inc
43 %split = phi i32 [ %add, %for.j.inc ]
46 for.j.end: ; preds = %for.j.end_crit_edge, %for.i
47 %res.1.lcssa = phi i32 [ %split, %for.j.end_crit_edge ], [ %res.05, %for.i ]
50 for.i.inc: ; preds = %for.j.end
51 %inc5 = add nsw i32 %i.06, 1
52 %cmp = icmp slt i32 %inc5, %N
53 br i1 %cmp, label %for.i, label %for.i.end_crit_edge
55 for.i.end_crit_edge: ; preds = %for.i.inc
56 %split7 = phi i32 [ %res.1.lcssa, %for.i.inc ]
59 for.i.end: ; preds = %for.i.end_crit_edge, %entry
60 %res.0.lcssa = phi i32 [ %split7, %for.i.end_crit_edge ], [ 0, %entry ]
64 ; int g(int N, int M, int K) {
65 ; int sum = 0, prod = 1;
66 ; for (int i = 0; i < N; ++i) {
67 ; for (int j = 0; j < M; ++j) {
68 ; for (int k = 0; k < K; ++k) {
76 define i32 @g(i32 %N, i32 %M, i32 %K) #0 {
77 ; CHECK: IsPerfect=true, Depth=1, OutermostLoop: for.k, Loops: ( for.k )
78 ; CHECK: IsPerfect=false, Depth=2, OutermostLoop: for.j, Loops: ( for.j for.k )
79 ; CHECK: IsPerfect=false, Depth=3, OutermostLoop: for.i, Loops: ( for.i for.j for.k )
81 %cmp10 = icmp slt i32 0, %N
82 br i1 %cmp10, label %for.i.ph, label %for.i.end
84 for.i.ph: ; preds = %entry
87 for.i: ; preds = %for.i.ph, %for.i.inc
88 %i.013 = phi i32 [ 0, %for.i.ph ], [ %inc14, %for.i.inc ]
89 %sum.012 = phi i32 [ 0, %for.i.ph ], [ %sum.1.lcssa, %for.i.inc ]
90 %prod.011 = phi i32 [ 1, %for.i.ph ], [ %prod.1.lcssa, %for.i.inc ]
91 %cmp24 = icmp slt i32 0, %M
92 br i1 %cmp24, label %for.j.ph, label %for.j.end
94 for.j.ph: ; preds = %for.i
97 for.j: ; preds = %for.j.ph, %for.j.inc
98 %j.07 = phi i32 [ 0, %for.j.ph ], [ %inc11, %for.j.inc ]
99 %sum.16 = phi i32 [ %sum.012, %for.j.ph ], [ %sum.2.lcssa, %for.j.inc ]
100 %prod.15 = phi i32 [ %prod.011, %for.j.ph ], [ %mul9, %for.j.inc ]
101 %cmp51 = icmp slt i32 0, %K
102 br i1 %cmp51, label %for.k.ph, label %for.k.end
104 for.k.ph: ; preds = %for.j
107 for.k: ; preds = %for.k.ph, %for.k.inc
108 %k.03 = phi i32 [ 0, %for.k.ph ], [ %inc, %for.k.inc ]
109 %sum.22 = phi i32 [ %sum.16, %for.k.ph ], [ %add, %for.k.inc ]
110 %mul = mul nsw i32 %i.013, %j.07
111 %mul7 = mul nsw i32 %mul, %k.03
112 %add = add nsw i32 %sum.22, %mul7
115 for.k.inc: ; preds = %for.k
116 %inc = add nsw i32 %k.03, 1
117 %cmp5 = icmp slt i32 %inc, %K
118 br i1 %cmp5, label %for.k, label %for.k.end_crit_edge
120 for.k.end_crit_edge: ; preds = %for.k.inc
121 %split = phi i32 [ %add, %for.k.inc ]
124 for.k.end: ; preds = %for.k.end_crit_edge, %for.j
125 %sum.2.lcssa = phi i32 [ %split, %for.k.end_crit_edge ], [ %sum.16, %for.j ]
126 %add8 = add nsw i32 %i.013, %j.07
127 %mul9 = mul nsw i32 %prod.15, %add8
130 for.j.inc: ; preds = %for.k.end
131 %inc11 = add nsw i32 %j.07, 1
132 %cmp2 = icmp slt i32 %inc11, %M
133 br i1 %cmp2, label %for.j, label %for.j.end_crit_edge
135 for.j.end_crit_edge: ; preds = %for.j.inc
136 %split8 = phi i32 [ %mul9, %for.j.inc ]
137 %split9 = phi i32 [ %sum.2.lcssa, %for.j.inc ]
140 for.j.end: ; preds = %for.j.end1crit_edge, %for.i
141 %prod.1.lcssa = phi i32 [ %split8, %for.j.end_crit_edge ], [ %prod.011, %for.i ]
142 %sum.1.lcssa = phi i32 [ %split9, %for.j.end_crit_edge ], [ %sum.012, %for.i ]
145 for.i.inc: ; preds = %for.j.end
146 %inc14 = add nsw i32 %i.013, 1
147 %cmp = icmp slt i32 %inc14, %N
148 br i1 %cmp, label %for.i, label %for.i.end_crit_edge
150 for.i.end_crit_edge: ; preds = %for.i.inc
151 %split14 = phi i32 [ %prod.1.lcssa, %for.i.inc ]
152 %split15 = phi i32 [ %sum.1.lcssa, %for.i.inc ]
155 for.i.end: ; preds = %for.i.end_crit_edge, %entry
156 %prod.0.lcssa = phi i32 [ %split14, %for.i.end_crit_edge ], [ 1, %entry ]
157 %sum.0.lcssa = phi i32 [ %split15, %for.i.end_crit_edge ], [ 0, %entry ]
158 %add16 = add nsw i32 %sum.0.lcssa, %prod.0.lcssa
162 ; int h(int N, int M, int K) {
164 ; for (int i = 0; i < N; ++i) {
165 ; for (int j = 0; j < M; ++j) {
166 ; for (int k = 0; k < K; ++k) {
173 define i32 @h(i32 %N, i32 %M, i32 %K) #0 {
174 ; CHECK: IsPerfect=true, Depth=1, OutermostLoop: for.k, Loops: ( for.k )
175 ; CHECK: IsPerfect=true, Depth=2, OutermostLoop: for.j, Loops: ( for.j for.k )
176 ; CHECK: IsPerfect=true, Depth=3, OutermostLoop: for.i, Loops: ( for.i for.j for.k )
178 %cmp8 = icmp slt i32 0, %N
179 br i1 %cmp8, label %for.i.ph, label %for.i.end
181 for.i.ph: ; preds = %entry
184 for.i: ; preds = %for.i.ph, %for.i.inc
185 %i.010 = phi i32 [ 0, %for.i.ph ], [ %inc12, %for.i.inc ]
186 %sum.09 = phi i32 [ 0, %for.i.ph ], [ %sum.1.lcssa, %for.i.inc ]
187 %cmp24 = icmp slt i32 0, %M
188 br i1 %cmp24, label %for.j.ph, label %for.j.end
190 for.j.ph: ; preds = %for.i
193 for.j: ; preds = %for.j.ph, %for.j.inc
194 %j.06 = phi i32 [ 0, %for.j.ph ], [ %inc9, %for.j.inc ]
195 %sum.15 = phi i32 [ %sum.09, %for.j.ph ], [ %sum.2.lcssa, %for.j.inc ]
196 %cmp51 = icmp slt i32 0, %K
197 br i1 %cmp51, label %for.k.ph, label %for.k.end
199 for.k.ph: ; preds = %for.j
202 for.k: ; preds = %for.k.ph, %for.k.inc
203 %k.03 = phi i32 [ 0, %for.k.ph ], [ %inc, %for.k.inc ]
204 %sum.22 = phi i32 [ %sum.15, %for.k.ph ], [ %add, %for.k.inc ]
205 %mul = mul nsw i32 %i.010, %j.06
206 %mul7 = mul nsw i32 %mul, %k.03
207 %add = add nsw i32 %sum.22, %mul7
210 for.k.inc: ; preds = %for.k
211 %inc = add nsw i32 %k.03, 1
212 %cmp5 = icmp slt i32 %inc, %K
213 br i1 %cmp5, label %for.k, label %for.k.end_crit_edge
215 for.k.end_crit_edge: ; preds = %for.k.inc
216 %split = phi i32 [ %add, %for.k.inc ]
219 for.k.end: ; preds = %for.k.end_crit_edge, %for.j
220 %sum.2.lcssa = phi i32 [ %split, %for.k.end_crit_edge ], [ %sum.15, %for.j ]
223 for.j.inc: ; preds = %for.k.end
224 %inc9 = add nsw i32 %j.06, 1
225 %cmp2 = icmp slt i32 %inc9, %M
226 br i1 %cmp2, label %for.j, label %for.j.end_crit_edge
228 for.j.end_crit_edge: ; preds = %for.j.inc
229 %split7 = phi i32 [ %sum.2.lcssa, %for.j.inc ]
232 for.j.end: ; preds = %for.j.end_crit_edge, %for.i
233 %sum.1.lcssa = phi i32 [ %split7, %for.j.end_crit_edge ], [ %sum.09, %for.i ]
236 for.i.inc: ; preds = %for.j.end
237 %inc12 = add nsw i32 %i.010, 1
238 %cmp = icmp slt i32 %inc12, %N
239 br i1 %cmp, label %for.i, label %for.i.end_crit_edge
241 for.i.end_crit_edge: ; preds = %for.i.inc
242 %split11 = phi i32 [ %sum.1.lcssa, %for.i.inc ]
245 for.i.end: ; preds = %for.i.end_crit_edge, %entry
246 %sum.0.lcssa = phi i32 [ %split11, %for.i.end_crit_edge ], [ 0, %entry ]