xref: /llvm-project/llvm/test/Analysis/DDG/basic-a.ll (revision 7cf5581712b24d4aea5dffa2e23f0ed42af1954d)
1db800c26SBardia Mahjour; RUN: opt < %s -disable-output "-passes=print<ddg>" 2>&1 | FileCheck %s
2db800c26SBardia Mahjour
3db800c26SBardia Mahjour; CHECK-LABEL: 'DDG' for loop 'test1.for.body':
42dd82a1cSBardia Mahjour
52dd82a1cSBardia Mahjour; CHECK: Node Address:[[PI:0x[0-9a-f]*]]:pi-block
62dd82a1cSBardia Mahjour; CHECK-NEXT: --- start of nodes in pi-block ---
786acaa94SBardia Mahjour; CHECK: Node Address:[[N1:0x[0-9a-f]*]]:single-instruction
82dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
92dd82a1cSBardia Mahjour; CHECK-NEXT:    %i.02 = phi i64 [ %inc, %test1.for.body ], [ 0, %test1.for.body.preheader ]
102dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:
11f0af11d8Sbmahjour; CHECK-NEXT:  [def-use] to [[N2:0x[0-9a-f]*]]
12db800c26SBardia Mahjour
13f0af11d8Sbmahjour; CHECK: Node Address:[[N2]]:single-instruction
14db800c26SBardia Mahjour; CHECK-NEXT: Instructions:
1586acaa94SBardia Mahjour; CHECK-NEXT:    %inc = add i64 %i.02, 1
1686acaa94SBardia Mahjour; CHECK-NEXT: Edges:
1786acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N1]]
1886acaa94SBardia Mahjour; CHECK-NEXT: --- end of nodes in pi-block ---
19db800c26SBardia Mahjour; CHECK-NEXT: Edges:
20f0af11d8Sbmahjour; CHECK-NEXT:  [def-use] to [[N3:0x[0-9a-f]*]]
2186acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N4:0x[0-9a-f]*]]
2286acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N5:0x[0-9a-f]*]]
23db800c26SBardia Mahjour
240a2626d0SBardia Mahjour; CHECK: Node Address:[[N5]]:multi-instruction
25db800c26SBardia Mahjour; CHECK-NEXT: Instructions:
2686acaa94SBardia Mahjour; CHECK-NEXT:    %exitcond = icmp ne i64 %inc, %n
2786acaa94SBardia Mahjour; CHECK-NEXT:    br i1 %exitcond, label %test1.for.body, label %for.end.loopexit
2886acaa94SBardia Mahjour; CHECK-NEXT: Edges:none!
2986acaa94SBardia Mahjour
3086acaa94SBardia Mahjour; CHECK: Node Address:[[N4]]:single-instruction
3186acaa94SBardia Mahjour; CHECK-NEXT: Instructions:
32*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx1 = getelementptr inbounds float, ptr %a, i64 %i.02
3386acaa94SBardia Mahjour; CHECK-NEXT: Edges:
340a2626d0SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N6:0x[0-9a-f]*]]
35db800c26SBardia Mahjour
360a2626d0SBardia Mahjour; CHECK: Node Address:[[N3]]:multi-instruction
37db800c26SBardia Mahjour; CHECK-NEXT: Instructions:
38*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx = getelementptr inbounds float, ptr %b, i64 %i.02
39*7cf55817SMatt Arsenault; CHECK-NEXT:    %0 = load float, ptr %arrayidx, align 4
4086acaa94SBardia Mahjour; CHECK-NEXT: Edges:
410a2626d0SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N7:0x[0-9a-f]*]]
4286acaa94SBardia Mahjour
430a2626d0SBardia Mahjour; CHECK: Node Address:[[N8:0x[0-9a-f]*]]:single-instruction
4486acaa94SBardia Mahjour; CHECK-NEXT: Instructions:
4586acaa94SBardia Mahjour; CHECK-NEXT:    %conv = uitofp i64 %n to float
4686acaa94SBardia Mahjour; CHECK-NEXT: Edges:
4786acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N7]]
48db800c26SBardia Mahjour
4986acaa94SBardia Mahjour; CHECK: Node Address:[[N7]]:single-instruction
50db800c26SBardia Mahjour; CHECK-NEXT: Instructions:
510a2626d0SBardia Mahjour; CHECK-NEXT:    %add = fadd float %0, %conv
520a2626d0SBardia Mahjour; CHECK-NEXT: Edges:
530a2626d0SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N6]]
540a2626d0SBardia Mahjour
550a2626d0SBardia Mahjour; CHECK: Node Address:[[N6]]:single-instruction
560a2626d0SBardia Mahjour; CHECK-NEXT: Instructions:
57*7cf55817SMatt Arsenault; CHECK-NEXT:    store float %add, ptr %arrayidx1, align 4
58db800c26SBardia Mahjour; CHECK-NEXT: Edges:none!
59db800c26SBardia Mahjour
60f0af11d8Sbmahjour
61db800c26SBardia Mahjour;; No memory dependencies.
62*7cf55817SMatt Arsenault;; void test1(unsigned long n, ptr restrict a, ptr restrict b) {
63db800c26SBardia Mahjour;;  for (unsigned long i = 0; i < n; i++)
64db800c26SBardia Mahjour;;    a[i] = b[i] + n;
65db800c26SBardia Mahjour;; }
66db800c26SBardia Mahjour
67*7cf55817SMatt Arsenaultdefine void @test1(i64 %n, ptr noalias %a, ptr noalias %b) {
68db800c26SBardia Mahjourentry:
69db800c26SBardia Mahjour  %exitcond1 = icmp ne i64 0, %n
70db800c26SBardia Mahjour  br i1 %exitcond1, label %test1.for.body, label %for.end
71db800c26SBardia Mahjour
72db800c26SBardia Mahjourtest1.for.body:                                         ; preds = %entry, %test1.for.body
73db800c26SBardia Mahjour  %i.02 = phi i64 [ %inc, %test1.for.body ], [ 0, %entry ]
74*7cf55817SMatt Arsenault  %arrayidx = getelementptr inbounds float, ptr %b, i64 %i.02
75*7cf55817SMatt Arsenault  %0 = load float, ptr %arrayidx, align 4
76db800c26SBardia Mahjour  %conv = uitofp i64 %n to float
77db800c26SBardia Mahjour  %add = fadd float %0, %conv
78*7cf55817SMatt Arsenault  %arrayidx1 = getelementptr inbounds float, ptr %a, i64 %i.02
79*7cf55817SMatt Arsenault  store float %add, ptr %arrayidx1, align 4
80db800c26SBardia Mahjour  %inc = add i64 %i.02, 1
81db800c26SBardia Mahjour  %exitcond = icmp ne i64 %inc, %n
82db800c26SBardia Mahjour  br i1 %exitcond, label %test1.for.body, label %for.end
83db800c26SBardia Mahjour
84db800c26SBardia Mahjourfor.end:                                          ; preds = %test1.for.body, %entry
85db800c26SBardia Mahjour  ret void
86db800c26SBardia Mahjour}
87db800c26SBardia Mahjour
88db800c26SBardia Mahjour
89db800c26SBardia Mahjour; CHECK-LABEL: 'DDG' for loop 'test2.for.body':
90f0af11d8Sbmahjour
912dd82a1cSBardia Mahjour; CHECK: Node Address:[[PI:0x[0-9a-f]*]]:pi-block
92f0af11d8Sbmahjour; CHECK-NEXT: --- start of nodes in pi-block ---
9386acaa94SBardia Mahjour; CHECK: Node Address:[[N1:0x[0-9a-f]*]]:single-instruction
94f0af11d8Sbmahjour; CHECK-NEXT: Instructions:
95f0af11d8Sbmahjour; CHECK-NEXT:    %i.02 = phi i64 [ %inc, %test2.for.body ], [ 0, %test2.for.body.preheader ]
96f0af11d8Sbmahjour; CHECK-NEXT: Edges:
972dd82a1cSBardia Mahjour; CHECK-NEXT:  [def-use] to [[N2:0x[0-9a-f]*]]
982dd82a1cSBardia Mahjour
992dd82a1cSBardia Mahjour; CHECK: Node Address:[[N2]]:single-instruction
1002dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
10186acaa94SBardia Mahjour; CHECK-NEXT:    %inc = add i64 %i.02, 1
1022dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:
10386acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N1]]
10486acaa94SBardia Mahjour; CHECK-NEXT: --- end of nodes in pi-block ---
10586acaa94SBardia Mahjour; CHECK-NEXT: Edges:
10686acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N3:0x[0-9a-f]*]]
10786acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N4:0x[0-9a-f]*]]
10886acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N5:0x[0-9a-f]*]]
10986acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N6:0x[0-9a-f]*]]
11086acaa94SBardia Mahjour
1110a2626d0SBardia Mahjour; CHECK: Node Address:[[N6]]:multi-instruction
11286acaa94SBardia Mahjour; CHECK-NEXT: Instructions:
11386acaa94SBardia Mahjour; CHECK-NEXT:    %exitcond = icmp ne i64 %inc, %n
11486acaa94SBardia Mahjour; CHECK-NEXT:    br i1 %exitcond, label %test2.for.body, label %for.end.loopexit
11586acaa94SBardia Mahjour; CHECK-NEXT: Edges:none!
11686acaa94SBardia Mahjour
11786acaa94SBardia Mahjour; CHECK: Node Address:[[N5]]:single-instruction
11886acaa94SBardia Mahjour; CHECK-NEXT: Instructions:
119*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx2 = getelementptr inbounds float, ptr %a, i64 %i.02
12086acaa94SBardia Mahjour; CHECK-NEXT: Edges:
1210a2626d0SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N7:0x[0-9a-f]*]]
12286acaa94SBardia Mahjour
1230a2626d0SBardia Mahjour; CHECK: Node Address:[[N4]]:multi-instruction
12486acaa94SBardia Mahjour; CHECK-NEXT: Instructions:
125*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx1 = getelementptr inbounds float, ptr %a, i64 %i.02
126*7cf55817SMatt Arsenault; CHECK-NEXT:    %1 = load float, ptr %arrayidx1, align 4
12786acaa94SBardia Mahjour; CHECK-NEXT: Edges:
1280a2626d0SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N8:0x[0-9a-f]*]]
1290a2626d0SBardia Mahjour; CHECK-NEXT:  [memory] to [[N7]]
1302dd82a1cSBardia Mahjour
1310a2626d0SBardia Mahjour; CHECK: Node Address:[[N3]]:multi-instruction
1322dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
133*7cf55817SMatt Arsenault; CHECK-NEXT:    %arrayidx = getelementptr inbounds float, ptr %b, i64 %i.02
134*7cf55817SMatt Arsenault; CHECK-NEXT:    %0 = load float, ptr %arrayidx, align 4
13586acaa94SBardia Mahjour; CHECK-NEXT: Edges:
13686acaa94SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N8]]
1372dd82a1cSBardia Mahjour
13886acaa94SBardia Mahjour; CHECK: Node Address:[[N8]]:single-instruction
1392dd82a1cSBardia Mahjour; CHECK-NEXT: Instructions:
1400a2626d0SBardia Mahjour; CHECK-NEXT:    %add = fadd float %0, %1
1410a2626d0SBardia Mahjour; CHECK-NEXT: Edges:
1420a2626d0SBardia Mahjour; CHECK-NEXT:  [def-use] to [[N7]]
1430a2626d0SBardia Mahjour
1440a2626d0SBardia Mahjour; CHECK: Node Address:[[N7]]:single-instruction
1450a2626d0SBardia Mahjour; CHECK-NEXT: Instructions:
146*7cf55817SMatt Arsenault; CHECK-NEXT:    store float %add, ptr %arrayidx2, align 4
1472dd82a1cSBardia Mahjour; CHECK-NEXT: Edges:none!
1482dd82a1cSBardia Mahjour
149f0af11d8Sbmahjour
150f0af11d8Sbmahjour
151db800c26SBardia Mahjour;; Loop-independent memory dependencies.
152*7cf55817SMatt Arsenault;; void test2(unsigned long n, ptr restrict a, ptr restrict b) {
153db800c26SBardia Mahjour;;  for (unsigned long i = 0; i < n; i++)
154db800c26SBardia Mahjour;;    a[i] = b[i] + a[i];
155db800c26SBardia Mahjour;; }
156db800c26SBardia Mahjour
157*7cf55817SMatt Arsenaultdefine void @test2(i64 %n, ptr noalias %a, ptr noalias %b) {
158db800c26SBardia Mahjourentry:
159db800c26SBardia Mahjour  %exitcond1 = icmp ne i64 0, %n
160db800c26SBardia Mahjour  br i1 %exitcond1, label %test2.for.body, label %for.end
161db800c26SBardia Mahjour
162db800c26SBardia Mahjourtest2.for.body:                                         ; preds = %entry, %test2.for.body
163db800c26SBardia Mahjour  %i.02 = phi i64 [ %inc, %test2.for.body ], [ 0, %entry ]
164*7cf55817SMatt Arsenault  %arrayidx = getelementptr inbounds float, ptr %b, i64 %i.02
165*7cf55817SMatt Arsenault  %0 = load float, ptr %arrayidx, align 4
166*7cf55817SMatt Arsenault  %arrayidx1 = getelementptr inbounds float, ptr %a, i64 %i.02
167*7cf55817SMatt Arsenault  %1 = load float, ptr %arrayidx1, align 4
168db800c26SBardia Mahjour  %add = fadd float %0, %1
169*7cf55817SMatt Arsenault  %arrayidx2 = getelementptr inbounds float, ptr %a, i64 %i.02
170*7cf55817SMatt Arsenault  store float %add, ptr %arrayidx2, align 4
171db800c26SBardia Mahjour  %inc = add i64 %i.02, 1
172db800c26SBardia Mahjour  %exitcond = icmp ne i64 %inc, %n
173db800c26SBardia Mahjour  br i1 %exitcond, label %test2.for.body, label %for.end
174db800c26SBardia Mahjour
175db800c26SBardia Mahjourfor.end:                                          ; preds = %test2.for.body, %entry
176db800c26SBardia Mahjour  ret void
177db800c26SBardia Mahjour}