6
6
//
7
7
// ===----------------------------------------------------------------------===//
8
8
9
+ #include " llvm/Analysis/AssumptionCache.h"
9
10
#include " llvm/Analysis/LoopInfo.h"
10
11
#include " llvm/Analysis/LoopUnrollAnalyzer.h"
12
+ #include " llvm/Analysis/ScalarEvolution.h"
13
+ #include " llvm/Analysis/TargetLibraryInfo.h"
11
14
#include " llvm/AsmParser/Parser.h"
12
15
#include " llvm/IR/Dominators.h"
13
- #include " llvm/IR/LegacyPassManager.h"
14
- #include " llvm/InitializePasses.h"
15
16
#include " llvm/Support/SourceMgr.h"
16
17
#include " gtest/gtest.h"
17
18
18
19
using namespace llvm ;
19
20
namespace llvm {
20
- void initializeUnrollAnalyzerTestPass (PassRegistry &);
21
21
22
22
static SmallVector<DenseMap<Value *, Value *>, 16 > SimplifiedValuesVector;
23
23
static unsigned TripCount = 0 ;
24
24
25
- namespace {
26
- struct UnrollAnalyzerTest : public FunctionPass {
27
- static char ID;
28
- bool runOnFunction (Function &F) override {
29
- LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo ();
30
- ScalarEvolution *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE ();
25
+ // / Build loop info and scalar evolution for the function and run the analysis.
26
+ static void runUnrollAnalyzer (Module &M, StringRef FuncName) {
27
+ auto *F = M.getFunction (FuncName);
28
+ ASSERT_NE (F, nullptr ) << " Could not find " << FuncName;
31
29
32
- Function::iterator FI = F.begin ();
33
- FI++; // First basic block is entry - skip it.
34
- BasicBlock *Header = &*FI++;
35
- Loop *L = LI->getLoopFor (Header);
36
- BasicBlock *Exiting = L->getExitingBlock ();
30
+ TargetLibraryInfoImpl TLII;
31
+ TargetLibraryInfo TLI (TLII);
32
+ AssumptionCache AC (*F);
33
+ DominatorTree DT (*F);
34
+ LoopInfo LI (DT);
35
+ ScalarEvolution SE (*F, TLI, AC, DT, LI);
37
36
38
- SimplifiedValuesVector.clear ();
39
- TripCount = SE->getSmallConstantTripCount (L, Exiting);
40
- for (unsigned Iteration = 0 ; Iteration < TripCount; Iteration++) {
41
- DenseMap<Value *, Value *> SimplifiedValues;
42
- UnrolledInstAnalyzer Analyzer (Iteration, SimplifiedValues, *SE, L);
43
- for (auto *BB : L->getBlocks ())
44
- for (Instruction &I : *BB)
45
- Analyzer.visit (I);
46
- SimplifiedValuesVector.push_back (SimplifiedValues);
47
- }
48
- return false ;
49
- }
50
- void getAnalysisUsage (AnalysisUsage &AU) const override {
51
- AU.addRequired <DominatorTreeWrapperPass>();
52
- AU.addRequired <LoopInfoWrapperPass>();
53
- AU.addRequired <ScalarEvolutionWrapperPass>();
54
- AU.setPreservesAll ();
55
- }
56
- UnrollAnalyzerTest () : FunctionPass(ID) {
57
- initializeUnrollAnalyzerTestPass (*PassRegistry::getPassRegistry ());
37
+ Function::iterator FI = F->begin ();
38
+ FI++; // First basic block is entry - skip it.
39
+ BasicBlock *Header = &*FI++;
40
+ Loop *L = LI.getLoopFor (Header);
41
+ BasicBlock *Exiting = L->getExitingBlock ();
42
+
43
+ SimplifiedValuesVector.clear ();
44
+ TripCount = SE.getSmallConstantTripCount (L, Exiting);
45
+ for (unsigned Iteration = 0 ; Iteration < TripCount; Iteration++) {
46
+ DenseMap<Value *, Value *> SimplifiedValues;
47
+ UnrolledInstAnalyzer Analyzer (Iteration, SimplifiedValues, SE, L);
48
+ for (auto *BB : L->getBlocks ())
49
+ for (Instruction &I : *BB)
50
+ Analyzer.visit (I);
51
+ SimplifiedValuesVector.push_back (SimplifiedValues);
58
52
}
59
- };
60
53
}
61
54
62
- char UnrollAnalyzerTest::ID = 0 ;
63
-
64
55
std::unique_ptr<Module> makeLLVMModule (LLVMContext &Context,
65
56
const char *ModuleStr) {
66
57
SMDiagnostic Err;
@@ -85,12 +76,9 @@ TEST(UnrollAnalyzerTest, BasicSimplifications) {
85
76
" %x.lcssa = phi i64 [ %x2, %loop ]\n "
86
77
" ret i64 %x.lcssa\n "
87
78
" }\n " ;
88
- UnrollAnalyzerTest *P = new UnrollAnalyzerTest ();
89
79
LLVMContext Context;
90
80
std::unique_ptr<Module> M = makeLLVMModule (Context, ModuleStr);
91
- legacy::PassManager Passes;
92
- Passes.add (P);
93
- Passes.run (*M);
81
+ runUnrollAnalyzer (*M, " propagate_loop_phis" );
94
82
95
83
// Perform checks
96
84
Module::iterator MI = M->begin ();
@@ -148,12 +136,9 @@ TEST(UnrollAnalyzerTest, OuterLoopSimplification) {
148
136
" ret void\n "
149
137
" }\n " ;
150
138
151
- UnrollAnalyzerTest *P = new UnrollAnalyzerTest ();
152
139
LLVMContext Context;
153
140
std::unique_ptr<Module> M = makeLLVMModule (Context, ModuleStr);
154
- legacy::PassManager Passes;
155
- Passes.add (P);
156
- Passes.run (*M);
141
+ runUnrollAnalyzer (*M, " foo" );
157
142
158
143
Module::iterator MI = M->begin ();
159
144
Function *F = &*MI++;
@@ -177,6 +162,7 @@ TEST(UnrollAnalyzerTest, OuterLoopSimplification) {
177
162
auto I2 = SimplifiedValuesVector[0 ].find (Y2);
178
163
EXPECT_TRUE (I2 == SimplifiedValuesVector[0 ].end ());
179
164
}
165
+
180
166
TEST (UnrollAnalyzerTest, CmpSimplifications) {
181
167
const char *ModuleStr =
182
168
" target datalayout = \" e-m:o-i64:64-f80:128-n8:16:32:64-S128\"\n "
@@ -193,12 +179,9 @@ TEST(UnrollAnalyzerTest, CmpSimplifications) {
193
179
" for.end:\n "
194
180
" ret void\n "
195
181
" }\n " ;
196
- UnrollAnalyzerTest *P = new UnrollAnalyzerTest ();
197
182
LLVMContext Context;
198
183
std::unique_ptr<Module> M = makeLLVMModule (Context, ModuleStr);
199
- legacy::PassManager Passes;
200
- Passes.add (P);
201
- Passes.run (*M);
184
+ runUnrollAnalyzer (*M, " branch_iv_trunc" );
202
185
203
186
// Perform checks
204
187
Module::iterator MI = M->begin ();
@@ -221,6 +204,7 @@ TEST(UnrollAnalyzerTest, CmpSimplifications) {
221
204
EXPECT_TRUE (I2 != SimplifiedValuesVector[5 ].end ());
222
205
EXPECT_EQ (cast<ConstantInt>((*I2).second )->getZExtValue (), 1U );
223
206
}
207
+
224
208
TEST (UnrollAnalyzerTest, PtrCmpSimplifications) {
225
209
const char *ModuleStr =
226
210
" target datalayout = \" e-m:o-i64:64-f80:128-n8:16:32:64-S128\"\n "
@@ -240,12 +224,9 @@ TEST(UnrollAnalyzerTest, PtrCmpSimplifications) {
240
224
" loop.exit:\n "
241
225
" ret void\n "
242
226
" }\n " ;
243
- UnrollAnalyzerTest *P = new UnrollAnalyzerTest ();
244
227
LLVMContext Context;
245
228
std::unique_ptr<Module> M = makeLLVMModule (Context, ModuleStr);
246
- legacy::PassManager Passes;
247
- Passes.add (P);
248
- Passes.run (*M);
229
+ runUnrollAnalyzer (*M, " ptr_cmp" );
249
230
250
231
// Perform checks
251
232
Module::iterator MI = M->begin ();
@@ -263,6 +244,7 @@ TEST(UnrollAnalyzerTest, PtrCmpSimplifications) {
263
244
EXPECT_TRUE (I1 != SimplifiedValuesVector[5 ].end ());
264
245
EXPECT_EQ (cast<ConstantInt>((*I1).second )->getZExtValue (), 0U );
265
246
}
247
+
266
248
TEST (UnrollAnalyzerTest, CastSimplifications) {
267
249
const char *ModuleStr =
268
250
" target datalayout = \" e-m:o-i64:64-f80:128-n8:16:32:64-S128\"\n "
@@ -286,12 +268,9 @@ TEST(UnrollAnalyzerTest, CastSimplifications) {
286
268
" ret void\n "
287
269
" }\n " ;
288
270
289
- UnrollAnalyzerTest *P = new UnrollAnalyzerTest ();
290
271
LLVMContext Context;
291
272
std::unique_ptr<Module> M = makeLLVMModule (Context, ModuleStr);
292
- legacy::PassManager Passes;
293
- Passes.add (P);
294
- Passes.run (*M);
273
+ runUnrollAnalyzer (*M, " const_load_cast" );
295
274
296
275
// Perform checks
297
276
Module::iterator MI = M->begin ();
@@ -321,11 +300,3 @@ TEST(UnrollAnalyzerTest, CastSimplifications) {
321
300
}
322
301
323
302
} // end namespace llvm
324
-
325
- INITIALIZE_PASS_BEGIN (UnrollAnalyzerTest, " unrollanalyzertestpass" ,
326
- " unrollanalyzertestpass" , false , false )
327
- INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
328
- INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
329
- INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)
330
- INITIALIZE_PASS_END(UnrollAnalyzerTest, " unrollanalyzertestpass" ,
331
- " unrollanalyzertestpass" , false , false )
0 commit comments