1 //===- LoopNestTest.cpp - LoopNestAnalysis unit tests ---------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/Analysis/AssumptionCache.h"
10 #include "llvm/Analysis/LoopNestAnalysis.h"
11 #include "llvm/Analysis/ScalarEvolution.h"
12 #include "llvm/Analysis/TargetLibraryInfo.h"
13 #include "llvm/AsmParser/Parser.h"
14 #include "llvm/IR/Dominators.h"
15 #include "llvm/IR/Module.h"
16 #include "llvm/Support/SourceMgr.h"
17 #include "gtest/gtest.h"
21 /// Build the loop nest analysis for a loop nest and run the given test \p Test.
23 Module
&M
, StringRef FuncName
,
24 function_ref
<void(Function
&F
, LoopInfo
&LI
, ScalarEvolution
&SE
)> Test
) {
25 auto *F
= M
.getFunction(FuncName
);
26 ASSERT_NE(F
, nullptr) << "Could not find " << FuncName
;
28 TargetLibraryInfoImpl TLII
;
29 TargetLibraryInfo
TLI(TLII
);
30 AssumptionCache
AC(*F
);
33 ScalarEvolution
SE(*F
, TLI
, AC
, DT
, LI
);
38 static std::unique_ptr
<Module
> makeLLVMModule(LLVMContext
&Context
,
39 const char *ModuleStr
) {
41 return parseAssemblyString(ModuleStr
, Err
, Context
);
44 static Instruction
*getInstructionByName(Function
&F
, StringRef Name
) {
45 for (BasicBlock
&BB
: F
)
46 for (Instruction
&I
: BB
)
47 if (I
.getName() == Name
)
49 llvm_unreachable("Expected to find instruction!");
52 TEST(LoopNestTest
, PerfectLoopNest
) {
53 const char *ModuleStr
=
54 "target datalayout = \"e-m:o-i64:64-f80:128-n8:16:32:64-S128\"\n"
55 "define void @foo(i64 signext %nx, i64 signext %ny) {\n"
57 " br label %for.outer\n"
59 " %i = phi i64 [ 0, %entry ], [ %inc13, %for.outer.latch ]\n"
60 " %cmp21 = icmp slt i64 0, %ny\n"
61 " br i1 %cmp21, label %for.inner.preheader, label %for.outer.latch\n"
62 "for.inner.preheader:\n"
63 " br label %for.inner\n"
65 " %j = phi i64 [ 0, %for.inner.preheader ], [ %inc, %for.inner.latch ]\n"
66 " br label %for.inner.latch\n"
68 " %inc = add nsw i64 %j, 1\n"
69 " %cmp2 = icmp slt i64 %inc, %ny\n"
70 " br i1 %cmp2, label %for.inner, label %for.inner.exit\n"
72 " br label %for.outer.latch\n"
74 " %inc13 = add nsw i64 %i, 1\n"
75 " %cmp = icmp slt i64 %inc13, %nx\n"
76 " br i1 %cmp, label %for.outer, label %for.outer.exit\n"
78 " br label %for.end\n"
84 std::unique_ptr
<Module
> M
= makeLLVMModule(Context
, ModuleStr
);
86 runTest(*M
, "foo", [&](Function
&F
, LoopInfo
&LI
, ScalarEvolution
&SE
) {
87 Function::iterator FI
= F
.begin();
88 // Skip the first basic block (entry), get to the outer loop header.
89 BasicBlock
*Header
= &*(++FI
);
90 assert(Header
->getName() == "for.outer");
91 Loop
*L
= LI
.getLoopFor(Header
);
92 EXPECT_NE(L
, nullptr);
95 EXPECT_TRUE(LN
.areAllLoopsSimplifyForm());
97 // Ensure that we can identify the outermost loop in the nest.
98 const Loop
&OL
= LN
.getOutermostLoop();
99 EXPECT_EQ(OL
.getName(), "for.outer");
101 // Ensure that we can identify the innermost loop in the nest.
102 const Loop
*IL
= LN
.getInnermostLoop();
103 EXPECT_NE(IL
, nullptr);
104 EXPECT_EQ(IL
->getName(), "for.inner");
106 // Ensure the loop nest is recognized as having 2 loops.
107 const ArrayRef
<Loop
*> Loops
= LN
.getLoops();
108 EXPECT_EQ(Loops
.size(), 2ull);
110 // Ensure that we can obtain loops by depth.
111 LoopVectorTy LoopsAtDepth1
= LN
.getLoopsAtDepth(1);
112 EXPECT_EQ(LoopsAtDepth1
.size(), 1u);
113 EXPECT_EQ(LoopsAtDepth1
[0], &OL
);
114 LoopVectorTy LoopsAtDepth2
= LN
.getLoopsAtDepth(2);
115 EXPECT_EQ(LoopsAtDepth2
.size(), 1u);
116 EXPECT_EQ(LoopsAtDepth2
[0], IL
);
118 // Ensure that we can obtain the loop index of a given loop, and get back
119 // the loop with that index.
120 EXPECT_EQ(LN
.getLoop(LN
.getLoopIndex(OL
)), &OL
);
121 EXPECT_EQ(LN
.getLoop(LN
.getLoopIndex(*IL
)), IL
);
123 // Ensure the loop nest is recognized as perfect in its entirety.
124 const SmallVector
<LoopVectorTy
, 4> &PLV
= LN
.getPerfectLoops(SE
);
125 EXPECT_EQ(PLV
.size(), 1ull);
126 EXPECT_EQ(PLV
.front().size(), 2ull);
128 // Ensure the nest depth and perfect nest depth are computed correctly.
129 EXPECT_EQ(LN
.getNestDepth(), 2u);
130 EXPECT_EQ(LN
.getMaxPerfectDepth(), 2u);
132 EXPECT_TRUE(LN
.getInterveningInstructions(OL
, *IL
, SE
).empty());
136 TEST(LoopNestTest
, ImperfectLoopNest
) {
137 const char *ModuleStr
=
138 "target datalayout = \"e-m:o-i64:64-f80:128-n8:16:32:64-S128\"\n"
139 "define void @foo(i32 signext %nx, i32 signext %ny, i32 signext %nk) {\n"
141 " br label %loop.i\n"
143 " %i = phi i32 [ 0, %entry ], [ %inci, %for.inci ]\n"
144 " %cmp21 = icmp slt i32 0, %ny\n"
145 " br i1 %cmp21, label %loop.j.preheader, label %for.inci\n"
146 "loop.j.preheader:\n"
147 " br label %loop.j\n"
149 " %j = phi i32 [ %incj, %for.incj ], [ 0, %loop.j.preheader ]\n"
150 " %cmp22 = icmp slt i32 0, %nk\n"
151 " br i1 %cmp22, label %loop.k.preheader, label %for.incj\n"
152 "loop.k.preheader:\n"
153 " call void @bar()\n"
154 " br label %loop.k\n"
156 " %k = phi i32 [ %inck, %for.inck ], [ 0, %loop.k.preheader ]\n"
157 " br label %for.inck\n"
159 " %inck = add nsw i32 %k, 1\n"
160 " %cmp5 = icmp slt i32 %inck, %nk\n"
161 " br i1 %cmp5, label %loop.k, label %for.incj.loopexit\n"
162 "for.incj.loopexit:\n"
163 " br label %for.incj\n"
165 " %incj = add nsw i32 %j, 1\n"
166 " %cmp2 = icmp slt i32 %incj, %ny\n"
167 " br i1 %cmp2, label %loop.j, label %for.inci.loopexit\n"
168 "for.inci.loopexit:\n"
169 " br label %for.inci\n"
171 " %inci = add nsw i32 %i, 1\n"
172 " %cmp = icmp slt i32 %inci, %nx\n"
173 " br i1 %cmp, label %loop.i, label %loop.i.end\n"
177 "declare void @bar()\n";
180 std::unique_ptr
<Module
> M
= makeLLVMModule(Context
, ModuleStr
);
182 runTest(*M
, "foo", [&](Function
&F
, LoopInfo
&LI
, ScalarEvolution
&SE
) {
183 Function::iterator FI
= F
.begin();
184 // Skip the first basic block (entry), get to the outermost loop header.
185 BasicBlock
*Header
= &*(++FI
);
186 assert(Header
->getName() == "loop.i");
187 Loop
*L
= LI
.getLoopFor(Header
);
188 EXPECT_NE(L
, nullptr);
191 EXPECT_TRUE(LN
.areAllLoopsSimplifyForm());
193 dbgs() << "LN: " << LN
<< "\n";
195 // Ensure that we can identify the outermost loop in the nest.
196 const Loop
&OL
= LN
.getOutermostLoop();
197 EXPECT_EQ(OL
.getName(), "loop.i");
199 // Ensure that we can identify the innermost loop in the nest.
200 const Loop
*IL
= LN
.getInnermostLoop();
201 EXPECT_NE(IL
, nullptr);
202 EXPECT_EQ(IL
->getName(), "loop.k");
204 // Ensure the loop nest is recognized as having 3 loops.
205 const ArrayRef
<Loop
*> Loops
= LN
.getLoops();
206 EXPECT_EQ(Loops
.size(), 3ull);
208 // Ensure the loop nest is recognized as having 2 separate perfect loops groups.
209 const SmallVector
<LoopVectorTy
, 4> &PLV
= LN
.getPerfectLoops(SE
);
210 EXPECT_EQ(PLV
.size(), 2ull);
211 EXPECT_EQ(PLV
.front().size(), 2ull);
212 EXPECT_EQ(PLV
.back().size(), 1ull);
214 // Ensure the nest depth and perfect nest depth are computed correctly.
215 EXPECT_EQ(LN
.getNestDepth(), 3u);
216 EXPECT_EQ(LN
.getMaxPerfectDepth(), 2u);
218 EXPECT_TRUE(LN
.getInterveningInstructions(OL
, *IL
, SE
).empty());
222 TEST(LoopNestTest
, InterveningInstrLoopNest
) {
223 const char *ModuleStr
=
224 "target datalayout = \"e-m:o-i64:64-f80:128-n8:16:32:64-S128\"\n"
225 "define void @foo(i64 signext %nx, i64 signext %ny, i32* noalias %A, i32 "
228 " br label %for.outer\n"
230 " %i = phi i64 [ 0, %entry ], [ %inc13, %for.outer.latch ]\n"
231 " %cmp21 = icmp slt i64 0, %ny\n"
232 " call void @outerheader()\n"
233 " br i1 %cmp21, label %for.inner.preheader, label %for.outer.latch\n"
234 "for.inner.preheader:\n"
235 " %varr = getelementptr inbounds i32, i32* %A, i64 5\n"
236 " store i32 5, i32* %varr, align 4\n"
237 " call void @innerpreheader()\n"
238 " br label %for.inner\n"
240 " %j = phi i64 [ 0, %for.inner.preheader ], [ %inc, %for.inner.latch ]\n"
241 " br label %for.inner.latch\n"
243 " %inc = add nsw i64 %j, 1\n"
244 " %cmp2 = icmp slt i64 %inc, %ny\n"
245 " br i1 %cmp2, label %for.inner, label %for.inner.exit\n"
247 " %varr1 = getelementptr inbounds i32, i32* %A, i64 5\n"
248 " call void @innerexit()\n"
249 " br label %for.outer.latch\n"
251 " %inc13 = add nsw i64 %i, 1\n"
252 " call void @outerlatch()\n"
253 " %cmp = icmp slt i64 %inc13, %nx\n"
254 " br i1 %cmp, label %for.outer, label %for.outer.exit\n"
256 " br label %for.end\n"
260 "declare void @innerpreheader()\n"
261 "declare void @outerheader()\n"
262 "declare void @outerlatch()\n"
263 "declare void @innerexit()\n";
266 std::unique_ptr
<Module
> M
= makeLLVMModule(Context
, ModuleStr
);
268 runTest(*M
, "foo", [&](Function
&F
, LoopInfo
&LI
, ScalarEvolution
&SE
) {
269 Function::iterator FI
= F
.begin();
270 // Skip the first basic block (entry), get to the outer loop header.
271 BasicBlock
*Header
= &*(++FI
);
272 assert(Header
->getName() == "for.outer");
273 Loop
*L
= LI
.getLoopFor(Header
);
274 EXPECT_NE(L
, nullptr);
277 EXPECT_TRUE(LN
.areAllLoopsSimplifyForm());
279 // Ensure that we can identify the outermost loop in the nest.
280 const Loop
&OL
= LN
.getOutermostLoop();
281 EXPECT_EQ(OL
.getName(), "for.outer");
283 // Ensure that we can identify the innermost loop in the nest.
284 const Loop
*IL
= LN
.getInnermostLoop();
285 EXPECT_NE(IL
, nullptr);
286 EXPECT_EQ(IL
->getName(), "for.inner");
288 // Ensure the loop nest is recognized as having 2 loops.
289 const ArrayRef
<Loop
*> Loops
= LN
.getLoops();
290 EXPECT_EQ(Loops
.size(), 2ull);
292 // Ensure the loop nest is not recognized as perfect in its entirety.
293 const SmallVector
<LoopVectorTy
, 4> &PLV
= LN
.getPerfectLoops(SE
);
294 EXPECT_EQ(PLV
.size(), 2ull);
295 EXPECT_EQ(PLV
.front().size(), 1ull);
296 EXPECT_EQ(PLV
.back().size(), 1ull);
298 // Ensure the nest depth and perfect nest depth are computed correctly.
299 EXPECT_EQ(LN
.getNestDepth(), 2u);
300 EXPECT_EQ(LN
.getMaxPerfectDepth(), 1u);
302 // Ensure enclosed instructions are recognized
303 const LoopNest::InstrVectorTy InstrV
=
304 LN
.getInterveningInstructions(OL
, *IL
, SE
);
305 EXPECT_EQ(InstrV
.size(), 5u);
307 Instruction
*SI
= getInstructionByName(F
, "varr")->getNextNode();
308 Instruction
*CI
= SI
->getNextNode();
310 getInstructionByName(F
, "i")->getNextNode()->getNextNode();
311 Instruction
*OLL
= getInstructionByName(F
, "inc13")->getNextNode();
312 Instruction
*IE
= getInstructionByName(F
, "varr1")->getNextNode();
314 EXPECT_EQ(InstrV
.front(), OLH
);
315 EXPECT_EQ(InstrV
[1], OLL
);
316 EXPECT_EQ(InstrV
[2], IE
);
317 EXPECT_EQ(InstrV
[3], SI
);
318 EXPECT_EQ(InstrV
.back(), CI
);