Jlm
Loading...
Searching...
No Matches
AgnosticModRefSummarizerTests.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2022 Nico Reißmann <nico.reissmann@gmail.com>
3 * See COPYING for terms of redistribution.
4 */
5
6#include <gtest/gtest.h>
7
11#include <jlm/rvsdg/view.hpp>
13
14static std::unique_ptr<jlm::llvm::aa::PointsToGraph>
16{
17 using namespace jlm::llvm;
18
19 aa::Andersen andersen;
21 return andersen.Analyze(module, statisticsCollector);
22}
23
24TEST(AgnosticModRefSummarizerTests, TestStore1)
25{
26 /*
27 * Arrange
28 */
29 auto ValidateProvider = [](const jlm::llvm::StoreTest1 & test,
30 const jlm::llvm::aa::ModRefSummary & modRefSummary,
31 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
32 {
33 auto numLambdaEntryNodes =
34 modRefSummary.GetLambdaEntryModRef(*test.lambda).getModRefNodes().size();
35 auto numLambdaExitNodes =
36 modRefSummary.GetLambdaExitModRef(*test.lambda).getModRefNodes().size();
37
38 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
39 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
40 };
41
43 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
44
45 auto pointsToGraph = RunAndersen(test.module());
46 // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
47
48 /*
49 * Act
50 */
51 auto modRefSummary =
53
54 /*
55 * Assert
56 */
57 ValidateProvider(test, *modRefSummary, *pointsToGraph);
58}
59
60TEST(AgnosticModRefSummarizerTests, TestStore2)
61{
62 /*
63 * Arrange
64 */
65 auto ValidateProvider = [](const jlm::llvm::StoreTest2 & test,
66 const jlm::llvm::aa::ModRefSummary & modRefSummary,
67 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
68 {
69 auto numLambdaEntryNodes =
70 modRefSummary.GetLambdaEntryModRef(*test.lambda).getModRefNodes().size();
71 auto numLambdaExitNodes =
72 modRefSummary.GetLambdaExitModRef(*test.lambda).getModRefNodes().size();
73
74 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
75 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
76 };
77
79 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
80
81 auto pointsToGraph = RunAndersen(test.module());
82 // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
83
84 /*
85 * Act
86 */
87 auto modRefSummary =
89
90 /*
91 * Assert
92 */
93 ValidateProvider(test, *modRefSummary, *pointsToGraph);
94}
95
96TEST(AgnosticModRefSummarizerTests, TestLoad1)
97{
98 /*
99 * Arrange
100 */
101 auto ValidateProvider = [](const jlm::llvm::LoadTest1 & test,
102 const jlm::llvm::aa::ModRefSummary & modRefSummary,
103 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
104 {
105 auto numLambdaEntryNodes =
106 modRefSummary.GetLambdaEntryModRef(*test.lambda).getModRefNodes().size();
107 auto numLambdaExitNodes =
108 modRefSummary.GetLambdaExitModRef(*test.lambda).getModRefNodes().size();
109
110 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
111 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
112 };
113
115 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
116
117 auto pointsToGraph = RunAndersen(test.module());
118 // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
119
120 /*
121 * Act
122 */
123 auto modRefSummary =
125
126 /*
127 * Assert
128 */
129 ValidateProvider(test, *modRefSummary, *pointsToGraph);
130}
131
132TEST(AgnosticModRefSummarizerTests, TestLoad2)
133{
134 /*
135 * Arrange
136 */
137 auto ValidateProvider = [](const jlm::llvm::LoadTest2 & test,
138 const jlm::llvm::aa::ModRefSummary & modRefSummary,
139 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
140 {
141 auto numLambdaEntryNodes =
142 modRefSummary.GetLambdaEntryModRef(*test.lambda).getModRefNodes().size();
143 auto numLambdaExitNodes =
144 modRefSummary.GetLambdaExitModRef(*test.lambda).getModRefNodes().size();
145
146 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
147 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
148 };
149
151 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
152
153 auto pointsToGraph = RunAndersen(test.module());
154
155 /*
156 * Act
157 */
158 auto modRefSummary =
160
161 /*
162 * Assert
163 */
164 ValidateProvider(test, *modRefSummary, *pointsToGraph);
165}
166
167TEST(AgnosticModRefSummarizerTests, TestLoadFromUndef)
168{
169 /*
170 * Arrange
171 */
172 auto ValidateProvider = [](const jlm::llvm::LoadFromUndefTest & test,
173 const jlm::llvm::aa::ModRefSummary & modRefSummary,
174 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
175 {
176 auto numLambdaEntryNodes =
177 modRefSummary.GetLambdaEntryModRef(test.Lambda()).getModRefNodes().size();
178 auto numLambdaExitNodes =
179 modRefSummary.GetLambdaExitModRef(test.Lambda()).getModRefNodes().size();
180
181 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
182 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
183 };
184
186 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
187
188 auto pointsToGraph = RunAndersen(test.module());
189 // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*pointsToGraph);
190
191 /*
192 * Act
193 */
194 auto modRefSummary =
196
197 /*
198 * Assert
199 */
200 ValidateProvider(test, *modRefSummary, *pointsToGraph);
201}
202
203TEST(AgnosticModRefSummarizerTests, TestCall1)
204{
205 /*
206 * Arrange
207 */
208 auto ValidateProvider = [](const jlm::llvm::CallTest1 & test,
209 const jlm::llvm::aa::ModRefSummary & modRefSummary,
210 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
211 {
212 /*
213 * Validate function f
214 */
215 {
216 auto numLambdaEntryNodes =
217 modRefSummary.GetLambdaEntryModRef(*test.lambda_f).getModRefNodes().size();
218 auto numLambdaExitNodes =
219 modRefSummary.GetLambdaExitModRef(*test.lambda_f).getModRefNodes().size();
220
221 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
222 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
223 }
224
225 /*
226 * Validate function g
227 */
228 {
229 auto numLambdaEntryNodes =
230 modRefSummary.GetLambdaEntryModRef(*test.lambda_g).getModRefNodes().size();
231 auto numLambdaExitNodes =
232 modRefSummary.GetLambdaExitModRef(*test.lambda_g).getModRefNodes().size();
233
234 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
235 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
236 }
237
238 /*
239 * Validate function h
240 */
241 {
242 auto numLambdaEntryNodes =
243 modRefSummary.GetLambdaEntryModRef(*test.lambda_h).getModRefNodes().size();
244 auto numLambdaExitNodes =
245 modRefSummary.GetLambdaExitModRef(*test.lambda_h).getModRefNodes().size();
246
247 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
248 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
249
250 auto numCallFNodes = modRefSummary.GetSimpleNodeModRef(test.CallF()).getModRefNodes().size();
251 EXPECT_EQ(numCallFNodes, pointsToGraph.numMemoryNodes());
252
253 auto numCallGNodes = modRefSummary.GetSimpleNodeModRef(test.CallG()).getModRefNodes().size();
254 EXPECT_EQ(numCallGNodes, pointsToGraph.numMemoryNodes());
255 }
256 };
257
259 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
260
261 auto pointsToGraph = RunAndersen(test.module());
262 // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
263
264 /*
265 * Act
266 */
267 auto modRefSummary =
269
270 /*
271 * Assert
272 */
273 ValidateProvider(test, *modRefSummary, *pointsToGraph);
274}
275
276TEST(AgnosticModRefSummarizerTests, TestCall2)
277{
278 /*
279 * Arrange
280 */
281 auto ValidateProvider = [](const jlm::llvm::CallTest2 & test,
282 const jlm::llvm::aa::ModRefSummary & modRefSummary,
283 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
284 {
285 /*
286 * Validate function create
287 */
288 {
289 auto numLambdaEntryNodes =
290 modRefSummary.GetLambdaEntryModRef(*test.lambda_create).getModRefNodes().size();
291 auto numLambdaExitNodes =
292 modRefSummary.GetLambdaExitModRef(*test.lambda_create).getModRefNodes().size();
293
294 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
295 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
296 }
297
298 /*
299 * Validate function destroy
300 */
301 {
302 auto numLambdaEntryNodes =
303 modRefSummary.GetLambdaEntryModRef(*test.lambda_destroy).getModRefNodes().size();
304 auto numLambdaExitNodes =
305 modRefSummary.GetLambdaExitModRef(*test.lambda_destroy).getModRefNodes().size();
306
307 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
308 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
309 }
310
311 /*
312 * Validate function test
313 */
314 {
315 auto numLambdaEntryNodes =
316 modRefSummary.GetLambdaEntryModRef(*test.lambda_test).getModRefNodes().size();
317 auto numLambdaExitNodes =
318 modRefSummary.GetLambdaExitModRef(*test.lambda_test).getModRefNodes().size();
319
320 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
321 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
322
323 auto numCallCreate1Nodes =
324 modRefSummary.GetSimpleNodeModRef(test.CallCreate1()).getModRefNodes().size();
325 EXPECT_EQ(numCallCreate1Nodes, pointsToGraph.numMemoryNodes());
326
327 auto numCallCreate2Nodes =
328 modRefSummary.GetSimpleNodeModRef(test.CallCreate2()).getModRefNodes().size();
329 EXPECT_EQ(numCallCreate2Nodes, pointsToGraph.numMemoryNodes());
330
331 auto numCallDestroy1Nodes =
332 modRefSummary.GetSimpleNodeModRef(test.CallDestroy1()).getModRefNodes().size();
333 EXPECT_EQ(numCallDestroy1Nodes, pointsToGraph.numMemoryNodes());
334
335 auto numCallDestroy2Nodes =
336 modRefSummary.GetSimpleNodeModRef(test.CallDestroy2()).getModRefNodes().size();
337 EXPECT_EQ(numCallDestroy2Nodes, pointsToGraph.numMemoryNodes());
338 }
339 };
340
342 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
343
344 auto pointsToGraph = RunAndersen(test.module());
345 // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
346
347 /*
348 * Act
349 */
350 auto modRefSummary =
352
353 /*
354 * Assert
355 */
356 ValidateProvider(test, *modRefSummary, *pointsToGraph);
357}
358
359TEST(AgnosticModRefSummarizerTests, TestIndirectCall)
360{
361 /*
362 * Arrange
363 */
364 auto ValidateProvider = [](const jlm::llvm::IndirectCallTest1 & test,
365 const jlm::llvm::aa::ModRefSummary & modRefSummary,
366 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
367 {
368 /*
369 * Validate function four
370 */
371 {
372 auto numLambdaEntryNodes =
373 modRefSummary.GetLambdaEntryModRef(test.GetLambdaFour()).getModRefNodes().size();
374 auto numLambdaExitNodes =
375 modRefSummary.GetLambdaExitModRef(test.GetLambdaFour()).getModRefNodes().size();
376
377 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
378 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
379 }
380
381 /*
382 * Validate function three
383 */
384 {
385 auto numLambdaEntryNodes =
386 modRefSummary.GetLambdaEntryModRef(test.GetLambdaThree()).getModRefNodes().size();
387 auto numLambdaExitNodes =
388 modRefSummary.GetLambdaExitModRef(test.GetLambdaThree()).getModRefNodes().size();
389
390 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
391 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
392 }
393
394 /*
395 * Validate function indcall
396 */
397 {
398 auto numLambdaEntryNodes =
399 modRefSummary.GetLambdaEntryModRef(test.GetLambdaIndcall()).getModRefNodes().size();
400 auto numLambdaExitNodes =
401 modRefSummary.GetLambdaExitModRef(test.GetLambdaIndcall()).getModRefNodes().size();
402
403 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
404 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
405
406 auto numCallIndcallNodes =
407 modRefSummary.GetSimpleNodeModRef(test.CallIndcall()).getModRefNodes().size();
408 EXPECT_EQ(numCallIndcallNodes, pointsToGraph.numMemoryNodes());
409 }
410
411 /*
412 * Validate function test
413 */
414 {
415 auto numLambdaEntryNodes =
416 modRefSummary.GetLambdaEntryModRef(test.GetLambdaTest()).getModRefNodes().size();
417 auto numLambdaExitNodes =
418 modRefSummary.GetLambdaExitModRef(test.GetLambdaTest()).getModRefNodes().size();
419
420 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
421 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
422
423 auto numCallThreeNodes =
424 modRefSummary.GetSimpleNodeModRef(test.CallThree()).getModRefNodes().size();
425 EXPECT_EQ(numCallThreeNodes, pointsToGraph.numMemoryNodes());
426
427 auto numCallFourNodes =
428 modRefSummary.GetSimpleNodeModRef(test.CallFour()).getModRefNodes().size();
429 EXPECT_EQ(numCallFourNodes, pointsToGraph.numMemoryNodes());
430 }
431 };
432
434 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
435
436 auto pointsToGraph = RunAndersen(test.module());
437 // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
438
439 /*
440 * Act
441 */
442 auto modRefSummary =
444
445 /*
446 * Assert
447 */
448 ValidateProvider(test, *modRefSummary, *pointsToGraph);
449}
450
451TEST(AgnosticModRefSummarizerTests, TestGamma)
452{
453 /*
454 * Arrange
455 */
456 auto ValidateProvider = [](const jlm::llvm::GammaTest & test,
457 const jlm::llvm::aa::ModRefSummary & modRefSummary,
458 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
459 {
460 auto numLambdaEntryNodes =
461 modRefSummary.GetLambdaEntryModRef(*test.lambda).getModRefNodes().size();
462 auto numLambdaExitNodes =
463 modRefSummary.GetLambdaExitModRef(*test.lambda).getModRefNodes().size();
464 auto numGammaEntryNodes =
465 modRefSummary.GetGammaEntryModRef(*test.gamma).getModRefNodes().size();
466 auto numGammaExitNodes = modRefSummary.GetGammaExitModRef(*test.gamma).getModRefNodes().size();
467
468 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
469 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
470 EXPECT_EQ(numGammaEntryNodes, pointsToGraph.numMemoryNodes());
471 EXPECT_EQ(numGammaExitNodes, pointsToGraph.numMemoryNodes());
472 };
473
475 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
476
477 auto pointsToGraph = RunAndersen(test.module());
478 // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
479
480 /*
481 * Act
482 */
483 auto modRefSummary =
485
486 /*
487 * Assert
488 */
489 ValidateProvider(test, *modRefSummary, *pointsToGraph);
490}
491
492TEST(AgnosticModRefSummarizerTests, TestTheta)
493{
494 /*
495 * Arrange
496 */
497 auto ValidateProvider = [](const jlm::llvm::ThetaTest & test,
498 const jlm::llvm::aa::ModRefSummary & modRefSummary,
499 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
500 {
501 auto numLambdaEntryNodes =
502 modRefSummary.GetLambdaEntryModRef(*test.lambda).getModRefNodes().size();
503 auto numLambdaExitNodes =
504 modRefSummary.GetLambdaExitModRef(*test.lambda).getModRefNodes().size();
505 auto numThetaNodes = modRefSummary.GetThetaModRef(*test.theta).getModRefNodes().size();
506
507 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
508 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
509 EXPECT_EQ(numThetaNodes, pointsToGraph.numMemoryNodes());
510 };
511
513 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
514
515 auto pointsToGraph = RunAndersen(test.module());
516 // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
517
518 /*
519 * Act
520 */
521 auto modRefSummary =
523
524 /*
525 * Assert
526 */
527 ValidateProvider(test, *modRefSummary, *pointsToGraph);
528}
529
530TEST(AgnosticModRefSummarizerTests, TestDelta1)
531{
532 /*
533 * Arrange
534 */
535 auto ValidateProvider = [](const jlm::llvm::DeltaTest1 & test,
536 const jlm::llvm::aa::ModRefSummary & modRefSummary,
537 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
538 {
539 /*
540 * Validate function g
541 */
542 {
543 auto numLambdaEntryNodes =
544 modRefSummary.GetLambdaEntryModRef(*test.lambda_g).getModRefNodes().size();
545 auto numLambdaExitNodes =
546 modRefSummary.GetLambdaExitModRef(*test.lambda_g).getModRefNodes().size();
547
548 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
549 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
550 }
551
552 /*
553 * Validate function h
554 */
555 {
556 auto numLambdaEntryNodes =
557 modRefSummary.GetLambdaEntryModRef(*test.lambda_h).getModRefNodes().size();
558 auto numLambdaExitNodes =
559 modRefSummary.GetLambdaExitModRef(*test.lambda_h).getModRefNodes().size();
560 auto numCallNodes = modRefSummary.GetSimpleNodeModRef(test.CallG()).getModRefNodes().size();
561
562 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
563 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
564 EXPECT_EQ(numCallNodes, pointsToGraph.numMemoryNodes());
565 }
566 };
567
569 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
570
571 auto pointsToGraph = RunAndersen(test.module());
572 // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
573
574 /*
575 * Act
576 */
577 auto modRefSummary =
579
580 /*
581 * Assert
582 */
583 ValidateProvider(test, *modRefSummary, *pointsToGraph);
584}
585
586TEST(AgnosticModRefSummarizerTests, TestDelta2)
587{
588 /*
589 * Arrange
590 */
591 auto ValidateProvider = [](const jlm::llvm::DeltaTest2 & test,
592 const jlm::llvm::aa::ModRefSummary & modRefSummary,
593 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
594 {
595 /*
596 * Validate function f1
597 */
598 {
599 auto numLambdaEntryNodes =
600 modRefSummary.GetLambdaEntryModRef(*test.lambda_f1).getModRefNodes().size();
601 auto numLambdaExitNodes =
602 modRefSummary.GetLambdaExitModRef(*test.lambda_f1).getModRefNodes().size();
603
604 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
605 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
606 }
607
608 /*
609 * Validate function f2
610 */
611 {
612 auto numLambdaEntryNodes =
613 modRefSummary.GetLambdaEntryModRef(*test.lambda_f2).getModRefNodes().size();
614 auto numLambdaExitNodes =
615 modRefSummary.GetLambdaExitModRef(*test.lambda_f2).getModRefNodes().size();
616 auto numCallNodes = modRefSummary.GetSimpleNodeModRef(test.CallF1()).getModRefNodes().size();
617
618 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
619 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
620 EXPECT_EQ(numCallNodes, pointsToGraph.numMemoryNodes());
621 }
622 };
623
625 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
626
627 auto pointsToGraph = RunAndersen(test.module());
628 // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
629
630 /*
631 * Act
632 */
633 auto modRefSummary =
635
636 /*
637 * Assert
638 */
639 ValidateProvider(test, *modRefSummary, *pointsToGraph);
640}
641
642TEST(AgnosticModRefSummarizerTests, TestImports)
643{
644 /*
645 * Arrange
646 */
647 auto ValidateProvider = [](const jlm::llvm::ImportTest & test,
648 const jlm::llvm::aa::ModRefSummary & modRefSummary,
649 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
650 {
651 /*
652 * Validate function f1
653 */
654 {
655 auto numLambdaEntryNodes =
656 modRefSummary.GetLambdaEntryModRef(*test.lambda_f1).getModRefNodes().size();
657 auto numLambdaExitNodes =
658 modRefSummary.GetLambdaExitModRef(*test.lambda_f1).getModRefNodes().size();
659
660 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
661 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
662 }
663
664 /*
665 * Validate function f2
666 */
667 {
668 auto numLambdaEntryNodes =
669 modRefSummary.GetLambdaEntryModRef(*test.lambda_f2).getModRefNodes().size();
670 auto numLambdaExitNodes =
671 modRefSummary.GetLambdaExitModRef(*test.lambda_f2).getModRefNodes().size();
672 auto numCallNodes = modRefSummary.GetSimpleNodeModRef(test.CallF1()).getModRefNodes().size();
673
674 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
675 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
676 EXPECT_EQ(numCallNodes, pointsToGraph.numMemoryNodes());
677 }
678 };
679
681 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
682
683 auto pointsToGraph = RunAndersen(test.module());
684 // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*ptg);
685
686 /*
687 * Act
688 */
689 auto modRefSummary =
691
692 /*
693 * Assert
694 */
695 ValidateProvider(test, *modRefSummary, *pointsToGraph);
696}
697
698TEST(AgnosticModRefSummarizerTests, TestPhi1)
699{
700 /*
701 * Arrange
702 */
703 auto ValidateProvider = [](const jlm::llvm::PhiTest1 & test,
704 const jlm::llvm::aa::ModRefSummary & modRefSummary,
705 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
706 {
707 /*
708 * Validate function fib
709 */
710 {
711 auto numLambdaEntryNodes =
712 modRefSummary.GetLambdaEntryModRef(*test.lambda_fib).getModRefNodes().size();
713 auto numLambdaExitNodes =
714 modRefSummary.GetLambdaExitModRef(*test.lambda_fib).getModRefNodes().size();
715 auto numGammaEntryNodes =
716 modRefSummary.GetGammaEntryModRef(*test.gamma).getModRefNodes().size();
717 auto numGammaExitNodes =
718 modRefSummary.GetGammaExitModRef(*test.gamma).getModRefNodes().size();
719 auto numCallFibm1Nodes =
720 modRefSummary.GetSimpleNodeModRef(test.CallFibm1()).getModRefNodes().size();
721 auto numCallFibm2Nodes =
722 modRefSummary.GetSimpleNodeModRef(test.CallFibm2()).getModRefNodes().size();
723
724 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
725 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
726 EXPECT_EQ(numGammaEntryNodes, pointsToGraph.numMemoryNodes());
727 EXPECT_EQ(numGammaExitNodes, pointsToGraph.numMemoryNodes());
728 EXPECT_EQ(numCallFibm1Nodes, pointsToGraph.numMemoryNodes());
729 EXPECT_EQ(numCallFibm2Nodes, pointsToGraph.numMemoryNodes());
730 }
731
732 /*
733 * Validate function test
734 */
735 {
736 auto numLambdaEntryNodes =
737 modRefSummary.GetLambdaEntryModRef(*test.lambda_test).getModRefNodes().size();
738 auto numLambdaExitNodes =
739 modRefSummary.GetLambdaExitModRef(*test.lambda_test).getModRefNodes().size();
740 auto numCallFibNodes =
741 modRefSummary.GetSimpleNodeModRef(test.CallFib()).getModRefNodes().size();
742
743 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
744 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
745 EXPECT_EQ(numCallFibNodes, pointsToGraph.numMemoryNodes());
746 }
747 };
748
750 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
751
752 auto pointsToGraph = RunAndersen(test.module());
753 // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
754
755 /*
756 * Act
757 */
758 auto modRefSummary =
760
761 /*
762 * Assert
763 */
764 ValidateProvider(test, *modRefSummary, *pointsToGraph);
765}
766
767TEST(AgnosticModRefSummarizerTests, TestMemcpy)
768{
769 /*
770 * Arrange
771 */
772 auto ValidateProvider = [](const jlm::llvm::MemcpyTest & test,
773 const jlm::llvm::aa::ModRefSummary & modRefSummary,
774 const jlm::llvm::aa::PointsToGraph & pointsToGraph)
775 {
776 /*
777 * Validate function f
778 */
779 {
780 auto numLambdaEntryNodes =
781 modRefSummary.GetLambdaEntryModRef(test.LambdaF()).getModRefNodes().size();
782 auto numLambdaExitNodes =
783 modRefSummary.GetLambdaExitModRef(test.LambdaF()).getModRefNodes().size();
784
785 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
786 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
787 }
788
789 /*
790 * Validate function g
791 */
792 {
793 auto numLambdaEntryNodes =
794 modRefSummary.GetLambdaEntryModRef(test.LambdaG()).getModRefNodes().size();
795 auto numLambdaExitNodes =
796 modRefSummary.GetLambdaExitModRef(test.LambdaG()).getModRefNodes().size();
797 auto numCallFNodes = modRefSummary.GetSimpleNodeModRef(test.CallF()).getModRefNodes().size();
798 auto numMemcpyNodes =
799 modRefSummary.GetSimpleNodeModRef(test.Memcpy()).getModRefNodes().size();
800
801 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
802 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
803 EXPECT_EQ(numCallFNodes, pointsToGraph.numMemoryNodes());
804 EXPECT_EQ(numMemcpyNodes, 2u);
805 }
806 };
807
809 // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
810
811 auto pointsToGraph = RunAndersen(test.module());
812 // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
813
814 /*
815 * Act
816 */
817 auto modRefSummary =
819
820 /*
821 * Assert
822 */
823 ValidateProvider(test, *modRefSummary, *pointsToGraph);
824}
825
826TEST(AgnosticModRefSummarizerTests, TestStatistics)
827{
828 // Arrange
830 auto pointsToGraph = RunAndersen(test.module());
831
832 jlm::util::StatisticsCollectorSettings statisticsCollectorSettings(
834 jlm::util::StatisticsCollector statisticsCollector(statisticsCollectorSettings);
835
836 // Act
838 test.module(),
839 *pointsToGraph,
841
842 // Assert
844
845 auto & statistics = dynamic_cast<const jlm::llvm::aa::AgnosticModRefSummarizer::Statistics &>(
847
848 EXPECT_EQ(statistics.GetSourceFile(), test.module().SourceFileName());
849 EXPECT_EQ(statistics.NumPointsToGraphMemoryNodes(), 2u);
850 EXPECT_NE(statistics.GetTime(), 0u);
851}
TEST(AgnosticModRefSummarizerTests, TestStore1)
static std::unique_ptr< jlm::llvm::aa::PointsToGraph > RunAndersen(const jlm::llvm::LlvmRvsdgModule &module)
static jlm::util::StatisticsCollector statisticsCollector
CallTest1 class.
const rvsdg::SimpleNode & CallG() const noexcept
jlm::rvsdg::LambdaNode * lambda_g
jlm::rvsdg::LambdaNode * lambda_f
const rvsdg::SimpleNode & CallF() const noexcept
jlm::rvsdg::LambdaNode * lambda_h
CallTest2 class.
const rvsdg::SimpleNode & CallDestroy1() const noexcept
jlm::rvsdg::LambdaNode * lambda_test
const rvsdg::SimpleNode & CallCreate2() const noexcept
jlm::rvsdg::LambdaNode * lambda_create
jlm::rvsdg::LambdaNode * lambda_destroy
const rvsdg::SimpleNode & CallDestroy2() const noexcept
const rvsdg::SimpleNode & CallCreate1() const noexcept
DeltaTest1 class.
jlm::rvsdg::LambdaNode * lambda_h
const rvsdg::SimpleNode & CallG() const noexcept
jlm::rvsdg::LambdaNode * lambda_g
DeltaTest2 class.
const rvsdg::SimpleNode & CallF1() const noexcept
jlm::rvsdg::LambdaNode * lambda_f2
jlm::rvsdg::LambdaNode * lambda_f1
GammaTest class.
rvsdg::GammaNode * gamma
jlm::rvsdg::LambdaNode * lambda
ImportTest class.
const rvsdg::SimpleNode & CallF1() const noexcept
jlm::rvsdg::LambdaNode * lambda_f1
jlm::rvsdg::LambdaNode * lambda_f2
IndirectCallTest1 class.
const rvsdg::SimpleNode & CallThree() const noexcept
const jlm::rvsdg::LambdaNode & GetLambdaFour() const noexcept
const jlm::rvsdg::LambdaNode & GetLambdaThree() const noexcept
const jlm::rvsdg::LambdaNode & GetLambdaTest() const noexcept
const rvsdg::SimpleNode & CallIndcall() const noexcept
const jlm::rvsdg::LambdaNode & GetLambdaIndcall() const noexcept
const rvsdg::SimpleNode & CallFour() const noexcept
const util::FilePath & SourceFileName() const noexcept
LoadFromUndefTest class.
const jlm::rvsdg::LambdaNode & Lambda() const noexcept
LoadTest1 class.
jlm::rvsdg::LambdaNode * lambda
LoadTest2 class.
jlm::rvsdg::LambdaNode * lambda
MemcpyTest class.
const jlm::rvsdg::LambdaNode & LambdaG() const noexcept
const rvsdg::SimpleNode & Memcpy() const noexcept
const jlm::rvsdg::LambdaNode & LambdaF() const noexcept
const rvsdg::SimpleNode & CallF() const noexcept
PhiTest1 class.
rvsdg::GammaNode * gamma
jlm::rvsdg::LambdaNode * lambda_test
jlm::rvsdg::LambdaNode * lambda_fib
const rvsdg::SimpleNode & CallFib() const noexcept
const rvsdg::SimpleNode & CallFibm2() const noexcept
const rvsdg::SimpleNode & CallFibm1() const noexcept
jlm::llvm::LlvmRvsdgModule & module()
StoreTest1 class.
jlm::rvsdg::LambdaNode * lambda
StoreTest2 class.
jlm::rvsdg::LambdaNode * lambda
ThetaTest class.
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::ThetaNode * theta
static std::unique_ptr< ModRefSummary > Create(const rvsdg::RvsdgModule &rvsdgModule, const PointsToGraph &pointsToGraph, util::StatisticsCollector &statisticsCollector)
std::unique_ptr< PointsToGraph > Analyze(const rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
StatisticsRange CollectedStatistics() const noexcept
size_t NumCollectedStatistics() const noexcept
Global memory state passed between functions.