xref: /llvm-project/llvm/test/Analysis/DDG/basic-loopnest.ll (revision 7cf5581712b24d4aea5dffa2e23f0ed42af1954d)
1db800c26SBardia Mahjour; RUN: opt < %s -disable-output "-passes=print<ddg>" 2>&1 | FileCheck %s
2db800c26SBardia Mahjour
3db800c26SBardia Mahjour
4db800c26SBardia Mahjour; CHECK-LABEL: 'DDG' for loop 'test1.for.cond1.preheader':
52dd82a1cSBardia Mahjour
686acaa94SBardia Mahjour; CHECK: Node Address:[[N1:0x[0-9a-f]*]]:pi-block
72dd82a1cSBardia Mahjour; CHECK-NEXT:--- start of nodes in pi-block ---
886acaa94SBardia Mahjour; CHECK: Node Address:[[N2:0x[0-9a-f]*]]:single-instruction
92dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
102dd82a1cSBardia Mahjour; CHECK-NEXT:    %j.02 = phi i64 [ %inc, %for.body4 ], [ 1, %for.body4.preheader ]
112dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:
1286acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N3:0x[0-9a-f]*]]
1386acaa94SBardia Mahjour
1486acaa94SBardia Mahjour; CHECK: Node Address:[[N3]]:single-instruction
1586acaa94SBardia Mahjour; CHECK-NEXT: Instructions:
1686acaa94SBardia Mahjour; CHECK-NEXT:    %inc = add i64 %j.02, 1
1786acaa94SBardia Mahjour; CHECK-NEXT: Edges:
1886acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N2]]
192dd82a1cSBardia Mahjour; CHECK-NEXT:--- end of nodes in pi-block ---
202dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:
2186acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N4:0x[0-9a-f]*]]
2286acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N5:0x[0-9a-f]*]]
2386acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N6:0x[0-9a-f]*]]
242dd82a1cSBardia Mahjour; CHECK-NEXT:  [def-use] to [[N7:0x[0-9a-f]*]]
25db800c26SBardia Mahjour
2686acaa94SBardia Mahjour; CHECK: Node Address:[[N5]]:single-instruction
27db800c26SBardia Mahjour; CHECK-NEXT: Instructions:
282dd82a1cSBardia Mahjour; CHECK-NEXT:    %sub7 = add i64 %j.02, -1
29db800c26SBardia Mahjour; CHECK-NEXT: Edges:
3086acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N8:0x[0-9a-f]*]]
31db800c26SBardia Mahjour
3286acaa94SBardia Mahjour; CHECK: Node Address:[[N9:0x[0-9a-f]*]]:pi-block
332dd82a1cSBardia Mahjour; CHECK-NEXT:--- start of nodes in pi-block ---
3486acaa94SBardia Mahjour; CHECK: Node Address:[[N10:0x[0-9a-f]*]]:single-instruction
352dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
362dd82a1cSBardia Mahjour; CHECK-NEXT:    %i.04 = phi i64 [ %inc13, %for.inc12 ], [ 0, %test1.for.cond1.preheader.preheader ]
372dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:
3886acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N11:0x[0-9a-f]*]]
3986acaa94SBardia Mahjour
4086acaa94SBardia Mahjour; CHECK: Node Address:[[N11]]:single-instruction
4186acaa94SBardia Mahjour; CHECK-NEXT: Instructions:
4286acaa94SBardia Mahjour; CHECK-NEXT:    %inc13 = add i64 %i.04, 1
4386acaa94SBardia Mahjour; CHECK-NEXT: Edges:
4486acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N10]]
452dd82a1cSBardia Mahjour; CHECK-NEXT:--- end of nodes in pi-block ---
462dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:
4786acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N12:0x[0-9a-f]*]]
4886acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N13:0x[0-9a-f]*]]
492dd82a1cSBardia Mahjour; CHECK-NEXT:  [def-use] to [[N14:0x[0-9a-f]*]]
5086acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N15:0x[0-9a-f]*]]
512dd82a1cSBardia Mahjour
520a2626d0SBardia Mahjour; CHECK: Node Address:[[N15]]:multi-instruction
532dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
542dd82a1cSBardia Mahjour; CHECK-NEXT:    %exitcond = icmp ne i64 %inc13, %n
552dd82a1cSBardia Mahjour; CHECK-NEXT:    br i1 %exitcond, label %test1.for.cond1.preheader, label %for.end14.loopexit
56db800c26SBardia Mahjour; CHECK-NEXT: Edges:none!
57db800c26SBardia Mahjour
580a2626d0SBardia Mahjour; CHECK: Node Address:[[N14]]:multi-instruction
592dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
602dd82a1cSBardia Mahjour; CHECK-NEXT:    %4 = mul nsw i64 %i.04, %n
61*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx10 = getelementptr inbounds float, ptr %a, i64 %4
622dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:
6386acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N6]]
64db800c26SBardia Mahjour
65f0af11d8Sbmahjour; CHECK: Node Address:[[N6]]:single-instruction
66db800c26SBardia Mahjour; CHECK-NEXT: Instructions:
67*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx11 = getelementptr inbounds float, ptr %arrayidx10, i64 %j.02
68db800c26SBardia Mahjour; CHECK-NEXT: Edges:
6986acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N18:0x[0-9a-f]*]]
70db800c26SBardia Mahjour
710a2626d0SBardia Mahjour; CHECK: Node Address:[[N13]]:multi-instruction
72db800c26SBardia Mahjour; CHECK-NEXT: Instructions:
7386acaa94SBardia Mahjour; CHECK-NEXT:    %2 = mul nsw i64 %i.04, %n
74*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx6 = getelementptr inbounds float, ptr %a, i64 %2
7586acaa94SBardia Mahjour; CHECK-NEXT: Edges:
7686acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N8]]
77db800c26SBardia Mahjour
78f0af11d8Sbmahjour; CHECK: Node Address:[[N8]]:single-instruction
79db800c26SBardia Mahjour; CHECK-NEXT: Instructions:
80*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx8 = getelementptr inbounds float, ptr %arrayidx6, i64 %sub7
8186acaa94SBardia Mahjour; CHECK-NEXT: Edges:
8286acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N18]]
8386acaa94SBardia Mahjour
840a2626d0SBardia Mahjour; CHECK: Node Address:[[N12]]:multi-instruction
8586acaa94SBardia Mahjour; CHECK-NEXT: Instructions:
8686acaa94SBardia Mahjour; CHECK-NEXT:    %0 = mul nsw i64 %i.04, %n
87*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx = getelementptr inbounds float, ptr %b, i64 %0
8886acaa94SBardia Mahjour; CHECK-NEXT: Edges:
8986acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N4]]
9086acaa94SBardia Mahjour
910a2626d0SBardia Mahjour; CHECK: Node Address:[[N4]]:multi-instruction
9286acaa94SBardia Mahjour; CHECK-NEXT: Instructions:
93*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx5 = getelementptr inbounds float, ptr %arrayidx, i64 %j.02
94*7cf55817SMatt Arsenault; CHECK-NEXT:    %1 = load float, ptr %arrayidx5, align 4
95db800c26SBardia Mahjour; CHECK-NEXT: Edges:
9686acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N18]]
97f0af11d8Sbmahjour
9886acaa94SBardia Mahjour; CHECK: Node Address:[[N18]]:pi-block
99f0af11d8Sbmahjour; CHECK-NEXT:--- start of nodes in pi-block ---
100f0af11d8Sbmahjour; CHECK: Node Address:[[N22:0x[0-9a-f]*]]:single-instruction
101f0af11d8Sbmahjour; CHECK-NEXT: Instructions:
102*7cf55817SMatt Arsenault; CHECK-NEXT:    %3 = load float, ptr %arrayidx8, align 4
103f0af11d8Sbmahjour; CHECK-NEXT: Edges:
104f0af11d8Sbmahjour; CHECK-NEXT:  [def-use] to [[N23:0x[0-9a-f]*]]
105f0af11d8Sbmahjour
106f0af11d8Sbmahjour; CHECK: Node Address:[[N23]]:single-instruction
107f0af11d8Sbmahjour; CHECK-NEXT: Instructions:
10886acaa94SBardia Mahjour; CHECK-NEXT:    %add = fadd float %1, %3
10986acaa94SBardia Mahjour; CHECK-NEXT: Edges:
11086acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N24:0x[0-9a-f]*]]
11186acaa94SBardia Mahjour
11286acaa94SBardia Mahjour; CHECK: Node Address:[[N24]]:single-instruction
11386acaa94SBardia Mahjour; CHECK-NEXT: Instructions:
114*7cf55817SMatt Arsenault; CHECK-NEXT:    store float %add, ptr %arrayidx11, align 4
115f0af11d8Sbmahjour; CHECK-NEXT: Edges:
11686acaa94SBardia Mahjour; CHECK-NEXT:  [memory] to [[N22]]
117f0af11d8Sbmahjour; CHECK-NEXT:--- end of nodes in pi-block ---
118f0af11d8Sbmahjour; CHECK-NEXT: Edges:none!
119f0af11d8Sbmahjour
12086acaa94SBardia Mahjour; CHECK: Node Address:[[N25:0x[0-9a-f]*]]:single-instruction
121f0af11d8Sbmahjour; CHECK-NEXT: Instructions:
1222dd82a1cSBardia Mahjour; CHECK-NEXT:    br label %for.inc12
1232dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:none!
12467f0685bSBardia Mahjour
12586acaa94SBardia Mahjour; CHECK: Node Address:[[N26:0x[0-9a-f]*]]:single-instruction
12667f0685bSBardia Mahjour; CHECK-NEXT: Instructions:
1272dd82a1cSBardia Mahjour; CHECK-NEXT:    br label %for.body4
1282dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:none!
12967f0685bSBardia Mahjour
13086acaa94SBardia Mahjour; CHECK: Node Address:[[N27:0x[0-9a-f]*]]:single-instruction
13167f0685bSBardia Mahjour; CHECK-NEXT: Instructions:
1322dd82a1cSBardia Mahjour; CHECK-NEXT:    %sub = add i64 %n, -1
13367f0685bSBardia Mahjour; CHECK-NEXT: Edges:
13486acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N7]]
13586acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N28:0x[0-9a-f]*]]
136f0af11d8Sbmahjour
1370a2626d0SBardia Mahjour; CHECK: Node Address:[[N28]]:multi-instruction
1382dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
1392dd82a1cSBardia Mahjour; CHECK-NEXT:    %cmp21 = icmp ult i64 1, %sub
1402dd82a1cSBardia Mahjour; CHECK-NEXT:    br i1 %cmp21, label %for.body4.preheader, label %for.inc12
1412dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:none!
1422dd82a1cSBardia Mahjour
1430a2626d0SBardia Mahjour; CHECK: Node Address:[[N7]]:multi-instruction
1442dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
1452dd82a1cSBardia Mahjour; CHECK-NEXT:    %cmp2 = icmp ult i64 %inc, %sub
1462dd82a1cSBardia Mahjour; CHECK-NEXT:    br i1 %cmp2, label %for.body4, label %for.inc12.loopexit
1472dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:none!
148db800c26SBardia Mahjour
149db800c26SBardia Mahjour
150db800c26SBardia Mahjour;; This test has a cycle.
151db800c26SBardia Mahjour;; void test1(unsigned long n, float a[][n], float b[][n]) {
152db800c26SBardia Mahjour;;  for (unsigned long i = 0; i < n; i++)
153db800c26SBardia Mahjour;;    for (unsigned long j = 1; j < n-1; j++)
154db800c26SBardia Mahjour;;      a[i][j] = b[i][j] + a[i][j-1];
155db800c26SBardia Mahjour;; }
156db800c26SBardia Mahjour
157*7cf55817SMatt Arsenaultdefine void @test1(i64 %n, ptr noalias %a, ptr noalias %b) {
158db800c26SBardia Mahjourentry:
159db800c26SBardia Mahjour  %exitcond3 = icmp ne i64 0, %n
160db800c26SBardia Mahjour  br i1 %exitcond3, label %test1.for.cond1.preheader, label %for.end14
161db800c26SBardia Mahjour
162db800c26SBardia Mahjourtest1.for.cond1.preheader:                              ; preds = %entry, %for.inc12
163db800c26SBardia Mahjour  %i.04 = phi i64 [ %inc13, %for.inc12 ], [ 0, %entry ]
164db800c26SBardia Mahjour  %sub = add i64 %n, -1
165db800c26SBardia Mahjour  %cmp21 = icmp ult i64 1, %sub
166db800c26SBardia Mahjour  br i1 %cmp21, label %for.body4, label %for.inc12
167db800c26SBardia Mahjour
168db800c26SBardia Mahjourfor.body4:                                        ; preds = %test1.for.cond1.preheader, %for.body4
169db800c26SBardia Mahjour  %j.02 = phi i64 [ %inc, %for.body4 ], [ 1, %test1.for.cond1.preheader ]
170db800c26SBardia Mahjour  %0 = mul nsw i64 %i.04, %n
171*7cf55817SMatt Arsenault  %arrayidx = getelementptr inbounds float, ptr %b, i64 %0
172*7cf55817SMatt Arsenault  %arrayidx5 = getelementptr inbounds float, ptr %arrayidx, i64 %j.02
173*7cf55817SMatt Arsenault  %1 = load float, ptr %arrayidx5, align 4
174db800c26SBardia Mahjour  %2 = mul nsw i64 %i.04, %n
175*7cf55817SMatt Arsenault  %arrayidx6 = getelementptr inbounds float, ptr %a, i64 %2
176db800c26SBardia Mahjour  %sub7 = add i64 %j.02, -1
177*7cf55817SMatt Arsenault  %arrayidx8 = getelementptr inbounds float, ptr %arrayidx6, i64 %sub7
178*7cf55817SMatt Arsenault  %3 = load float, ptr %arrayidx8, align 4
179db800c26SBardia Mahjour  %add = fadd float %1, %3
180db800c26SBardia Mahjour  %4 = mul nsw i64 %i.04, %n
181*7cf55817SMatt Arsenault  %arrayidx10 = getelementptr inbounds float, ptr %a, i64 %4
182*7cf55817SMatt Arsenault  %arrayidx11 = getelementptr inbounds float, ptr %arrayidx10, i64 %j.02
183*7cf55817SMatt Arsenault  store float %add, ptr %arrayidx11, align 4
184db800c26SBardia Mahjour  %inc = add i64 %j.02, 1
185db800c26SBardia Mahjour  %cmp2 = icmp ult i64 %inc, %sub
186db800c26SBardia Mahjour  br i1 %cmp2, label %for.body4, label %for.inc12
187db800c26SBardia Mahjour
188db800c26SBardia Mahjourfor.inc12:                                        ; preds = %for.body4, %test1.for.cond1.preheader
189db800c26SBardia Mahjour  %inc13 = add i64 %i.04, 1
190db800c26SBardia Mahjour  %exitcond = icmp ne i64 %inc13, %n
191db800c26SBardia Mahjour  br i1 %exitcond, label %test1.for.cond1.preheader, label %for.end14
192db800c26SBardia Mahjour
193db800c26SBardia Mahjourfor.end14:                                        ; preds = %for.inc12, %entry
194db800c26SBardia Mahjour  ret void
195db800c26SBardia Mahjour}
196db800c26SBardia Mahjour
197db800c26SBardia Mahjour
198db800c26SBardia Mahjour
199db800c26SBardia Mahjour; CHECK-LABEL: 'DDG' for loop 'test2.for.cond1.preheader':
2002dd82a1cSBardia Mahjour
2012dd82a1cSBardia Mahjour; CHECK: Node Address:[[PI1:0x[0-9a-f]*]]:pi-block
2022dd82a1cSBardia Mahjour; CHECK-NEXT:--- start of nodes in pi-block ---
20386acaa94SBardia Mahjour; CHECK: Node Address:[[N1:0x[0-9a-f]*]]:single-instruction
204db800c26SBardia Mahjour; CHECK-NEXT: Instructions:
2052dd82a1cSBardia Mahjour; CHECK-NEXT:    %j.02 = phi i64 [ %inc, %for.body4 ], [ 1, %for.body4.preheader ]
206db800c26SBardia Mahjour; CHECK-NEXT: Edges:
2072dd82a1cSBardia Mahjour; CHECK-NEXT:  [def-use] to [[N2:0x[0-9a-f]*]]
208db800c26SBardia Mahjour
20986acaa94SBardia Mahjour; CHECK: Node Address:[[N2]]:single-instruction
21086acaa94SBardia Mahjour; CHECK-NEXT: Instructions:
21186acaa94SBardia Mahjour; CHECK-NEXT:    %inc = add i64 %j.02, 1
21286acaa94SBardia Mahjour; CHECK-NEXT: Edges:
21386acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N1]]
21486acaa94SBardia Mahjour; CHECK-NEXT:--- end of nodes in pi-block ---
21586acaa94SBardia Mahjour; CHECK-NEXT: Edges:
21686acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N3:0x[0-9a-f]*]]
21786acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N4:0x[0-9a-f]*]]
21886acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N5:0x[0-9a-f]*]]
21986acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N6:0x[0-9a-f]*]]
22086acaa94SBardia Mahjour
22186acaa94SBardia Mahjour; CHECK: Node Address:[[N4]]:single-instruction
222db800c26SBardia Mahjour; CHECK-NEXT: Instructions:
223db800c26SBardia Mahjour; CHECK-NEXT:    %add7 = add i64 %j.02, 1
224db800c26SBardia Mahjour; CHECK-NEXT: Edges:
22586acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N7:0x[0-9a-f]*]]
226db800c26SBardia Mahjour
22786acaa94SBardia Mahjour; CHECK: Node Address:[[N8:0x[0-9a-f]*]]:pi-block
228f0af11d8Sbmahjour; CHECK-NEXT:--- start of nodes in pi-block ---
22986acaa94SBardia Mahjour; CHECK: Node Address:[[N9:0x[0-9a-f]*]]:single-instruction
230f0af11d8Sbmahjour; CHECK-NEXT: Instructions:
231f0af11d8Sbmahjour; CHECK-NEXT:    %i.04 = phi i64 [ %inc13, %for.inc12 ], [ 0, %test2.for.cond1.preheader.preheader ]
232f0af11d8Sbmahjour; CHECK-NEXT: Edges:
2332dd82a1cSBardia Mahjour; CHECK-NEXT:  [def-use] to [[N10:0x[0-9a-f]*]]
2342dd82a1cSBardia Mahjour
2352dd82a1cSBardia Mahjour; CHECK: Node Address:[[N10]]:single-instruction
2362dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
23786acaa94SBardia Mahjour; CHECK-NEXT:    %inc13 = add i64 %i.04, 1
23886acaa94SBardia Mahjour; CHECK-NEXT: Edges:
23986acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N9]]
24086acaa94SBardia Mahjour; CHECK-NEXT:--- end of nodes in pi-block ---
2412dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:
2422dd82a1cSBardia Mahjour; CHECK-NEXT:  [def-use] to [[N11:0x[0-9a-f]*]]
24386acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N12:0x[0-9a-f]*]]
24486acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N13:0x[0-9a-f]*]]
2452dd82a1cSBardia Mahjour; CHECK-NEXT:  [def-use] to [[N14:0x[0-9a-f]*]]
2462dd82a1cSBardia Mahjour
2470a2626d0SBardia Mahjour; CHECK: Node Address:[[N14]]:multi-instruction
2482dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
24986acaa94SBardia Mahjour; CHECK-NEXT:    %exitcond = icmp ne i64 %inc13, %n
25086acaa94SBardia Mahjour; CHECK-NEXT:    br i1 %exitcond, label %test2.for.cond1.preheader, label %for.end14.loopexit
25186acaa94SBardia Mahjour; CHECK-NEXT: Edges:none!
25286acaa94SBardia Mahjour
2530a2626d0SBardia Mahjour; CHECK: Node Address:[[N13]]:multi-instruction
25486acaa94SBardia Mahjour; CHECK-NEXT: Instructions:
25586acaa94SBardia Mahjour; CHECK-NEXT:    %4 = mul nsw i64 %i.04, %n
256*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx10 = getelementptr inbounds float, ptr %a, i64 %4
25786acaa94SBardia Mahjour; CHECK-NEXT: Edges:
25886acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N5]]
2592dd82a1cSBardia Mahjour
2602dd82a1cSBardia Mahjour; CHECK: Node Address:[[N5]]:single-instruction
2612dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
262*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx11 = getelementptr inbounds float, ptr %arrayidx10, i64 %j.02
2632dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:
26486acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N17:0x[0-9a-f]*]]
2652dd82a1cSBardia Mahjour
2660a2626d0SBardia Mahjour; CHECK: Node Address:[[N12]]:multi-instruction
2672dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
26886acaa94SBardia Mahjour; CHECK-NEXT:    %2 = mul nsw i64 %i.04, %n
269*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx6 = getelementptr inbounds float, ptr %a, i64 %2
270f0af11d8Sbmahjour; CHECK-NEXT: Edges:
271f0af11d8Sbmahjour; CHECK-NEXT:  [def-use] to [[N7]]
2722dd82a1cSBardia Mahjour
2730a2626d0SBardia Mahjour; CHECK: Node Address:[[N7]]:multi-instruction
2742dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
275*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx8 = getelementptr inbounds float, ptr %arrayidx6, i64 %add7
276*7cf55817SMatt Arsenault; CHECK-NEXT:    %3 = load float, ptr %arrayidx8, align 4
27786acaa94SBardia Mahjour; CHECK-NEXT: Edges:
27886acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N20:0x[0-9a-f]*]]
27986acaa94SBardia Mahjour; CHECK-NEXT:  [memory] to [[N17]]
28086acaa94SBardia Mahjour
2810a2626d0SBardia Mahjour; CHECK: Node Address:[[N11]]:multi-instruction
28286acaa94SBardia Mahjour; CHECK-NEXT: Instructions:
28386acaa94SBardia Mahjour; CHECK-NEXT:    %0 = mul nsw i64 %i.04, %n
284*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx = getelementptr inbounds float, ptr %b, i64 %0
28586acaa94SBardia Mahjour; CHECK-NEXT: Edges:
28686acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N3]]
28786acaa94SBardia Mahjour
2880a2626d0SBardia Mahjour; CHECK: Node Address:[[N3]]:multi-instruction
28986acaa94SBardia Mahjour; CHECK-NEXT: Instructions:
290*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx5 = getelementptr inbounds float, ptr %arrayidx, i64 %j.02
291*7cf55817SMatt Arsenault; CHECK-NEXT:    %1 = load float, ptr %arrayidx5, align 4
2922dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:
29386acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N20]]
2942dd82a1cSBardia Mahjour
29586acaa94SBardia Mahjour; CHECK: Node Address:[[N20]]:single-instruction
2962dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
2972dd82a1cSBardia Mahjour; CHECK-NEXT:    %add = fadd float %1, %3
2982dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:
29986acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N17]]
3002dd82a1cSBardia Mahjour
30186acaa94SBardia Mahjour; CHECK: Node Address:[[N17]]:single-instruction
3022dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
303*7cf55817SMatt Arsenault; CHECK-NEXT:    store float %add, ptr %arrayidx11, align 4
3042dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:none!
3052dd82a1cSBardia Mahjour
3062dd82a1cSBardia Mahjour; CHECK: Node Address:[[N23:0x[0-9a-f]*]]:single-instruction
3072dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
3082dd82a1cSBardia Mahjour; CHECK-NEXT:    br label %for.inc12
3092dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:none!
3102dd82a1cSBardia Mahjour
31186acaa94SBardia Mahjour; CHECK: Node Address:[[N24:0x[0-9a-f]*]]:single-instruction
3122dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
3132dd82a1cSBardia Mahjour; CHECK-NEXT:    br label %for.body4
3142dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:none!
3152dd82a1cSBardia Mahjour
31686acaa94SBardia Mahjour; CHECK: Node Address:[[N25:0x[0-9a-f]*]]:single-instruction
3172dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
3182dd82a1cSBardia Mahjour; CHECK-NEXT:    %sub = add i64 %n, -1
3192dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:
32086acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N6]]
32186acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N26:0x[0-9a-f]*]]
3222dd82a1cSBardia Mahjour
3230a2626d0SBardia Mahjour; CHECK: Node Address:[[N26]]:multi-instruction
3242dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
3252dd82a1cSBardia Mahjour; CHECK-NEXT:    %cmp21 = icmp ult i64 1, %sub
3262dd82a1cSBardia Mahjour; CHECK-NEXT:    br i1 %cmp21, label %for.body4.preheader, label %for.inc12
3272dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:none!
3282dd82a1cSBardia Mahjour
3290a2626d0SBardia Mahjour; CHECK: Node Address:[[N6]]:multi-instruction
3302dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
3312dd82a1cSBardia Mahjour; CHECK-NEXT:    %cmp2 = icmp ult i64 %inc, %sub
3322dd82a1cSBardia Mahjour; CHECK-NEXT:    br i1 %cmp2, label %for.body4, label %for.inc12.loopexit
3332dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:none!
334f0af11d8Sbmahjour
335f0af11d8Sbmahjour
336db800c26SBardia Mahjour;; This test has no cycles.
337db800c26SBardia Mahjour;; void test2(unsigned long n, float a[][n], float b[][n]) {
338db800c26SBardia Mahjour;;  for (unsigned long i = 0; i < n; i++)
339db800c26SBardia Mahjour;;    for (unsigned long j = 1; j < n-1; j++)
340db800c26SBardia Mahjour;;      a[i][j] = b[i][j] + a[i][j+1];
341db800c26SBardia Mahjour;; }
342db800c26SBardia Mahjour
343*7cf55817SMatt Arsenaultdefine void @test2(i64 %n, ptr noalias %a, ptr noalias %b) {
344db800c26SBardia Mahjourentry:
345db800c26SBardia Mahjour  %exitcond3 = icmp ne i64 0, %n
346db800c26SBardia Mahjour  br i1 %exitcond3, label %test2.for.cond1.preheader, label %for.end14
347db800c26SBardia Mahjour
348db800c26SBardia Mahjourtest2.for.cond1.preheader:                              ; preds = %entry, %for.inc12
349db800c26SBardia Mahjour  %i.04 = phi i64 [ %inc13, %for.inc12 ], [ 0, %entry ]
350db800c26SBardia Mahjour  %sub = add i64 %n, -1
351db800c26SBardia Mahjour  %cmp21 = icmp ult i64 1, %sub
352db800c26SBardia Mahjour  br i1 %cmp21, label %for.body4, label %for.inc12
353db800c26SBardia Mahjour
354db800c26SBardia Mahjourfor.body4:                                        ; preds = %test2.for.cond1.preheader, %for.body4
355db800c26SBardia Mahjour  %j.02 = phi i64 [ %inc, %for.body4 ], [ 1, %test2.for.cond1.preheader ]
356db800c26SBardia Mahjour  %0 = mul nsw i64 %i.04, %n
357*7cf55817SMatt Arsenault  %arrayidx = getelementptr inbounds float, ptr %b, i64 %0
358*7cf55817SMatt Arsenault  %arrayidx5 = getelementptr inbounds float, ptr %arrayidx, i64 %j.02
359*7cf55817SMatt Arsenault  %1 = load float, ptr %arrayidx5, align 4
360db800c26SBardia Mahjour  %2 = mul nsw i64 %i.04, %n
361*7cf55817SMatt Arsenault  %arrayidx6 = getelementptr inbounds float, ptr %a, i64 %2
362db800c26SBardia Mahjour  %add7 = add i64 %j.02, 1
363*7cf55817SMatt Arsenault  %arrayidx8 = getelementptr inbounds float, ptr %arrayidx6, i64 %add7
364*7cf55817SMatt Arsenault  %3 = load float, ptr %arrayidx8, align 4
365db800c26SBardia Mahjour  %add = fadd float %1, %3
366db800c26SBardia Mahjour  %4 = mul nsw i64 %i.04, %n
367*7cf55817SMatt Arsenault  %arrayidx10 = getelementptr inbounds float, ptr %a, i64 %4
368*7cf55817SMatt Arsenault  %arrayidx11 = getelementptr inbounds float, ptr %arrayidx10, i64 %j.02
369*7cf55817SMatt Arsenault  store float %add, ptr %arrayidx11, align 4
370db800c26SBardia Mahjour  %inc = add i64 %j.02, 1
371db800c26SBardia Mahjour  %cmp2 = icmp ult i64 %inc, %sub
372db800c26SBardia Mahjour  br i1 %cmp2, label %for.body4, label %for.inc12
373db800c26SBardia Mahjour
374db800c26SBardia Mahjourfor.inc12:                                        ; preds = %for.body4, %test2.for.cond1.preheader
375db800c26SBardia Mahjour  %inc13 = add i64 %i.04, 1
376db800c26SBardia Mahjour  %exitcond = icmp ne i64 %inc13, %n
377db800c26SBardia Mahjour  br i1 %exitcond, label %test2.for.cond1.preheader, label %for.end14
378db800c26SBardia Mahjour
379db800c26SBardia Mahjourfor.end14:                                        ; preds = %for.inc12, %entry
380db800c26SBardia Mahjour  ret void
381db800c26SBardia Mahjour}