6#include <gtest/gtest.h>
14static std::unique_ptr<jlm::llvm::aa::PointsToGraph>
24TEST(AgnosticModRefSummarizerTests, TestStore1)
33 auto numLambdaEntryNodes =
34 modRefSummary.GetLambdaEntryModRef(*test.
lambda).getModRefNodes().size();
35 auto numLambdaExitNodes =
36 modRefSummary.GetLambdaExitModRef(*test.
lambda).getModRefNodes().size();
38 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
39 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
57 ValidateProvider(test, *modRefSummary, *pointsToGraph);
60TEST(AgnosticModRefSummarizerTests, TestStore2)
69 auto numLambdaEntryNodes =
70 modRefSummary.GetLambdaEntryModRef(*test.
lambda).getModRefNodes().size();
71 auto numLambdaExitNodes =
72 modRefSummary.GetLambdaExitModRef(*test.
lambda).getModRefNodes().size();
74 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
75 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
93 ValidateProvider(test, *modRefSummary, *pointsToGraph);
96TEST(AgnosticModRefSummarizerTests, TestLoad1)
105 auto numLambdaEntryNodes =
106 modRefSummary.GetLambdaEntryModRef(*test.
lambda).getModRefNodes().size();
107 auto numLambdaExitNodes =
108 modRefSummary.GetLambdaExitModRef(*test.
lambda).getModRefNodes().size();
110 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
111 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
129 ValidateProvider(test, *modRefSummary, *pointsToGraph);
132TEST(AgnosticModRefSummarizerTests, TestLoad2)
141 auto numLambdaEntryNodes =
142 modRefSummary.GetLambdaEntryModRef(*test.
lambda).getModRefNodes().size();
143 auto numLambdaExitNodes =
144 modRefSummary.GetLambdaExitModRef(*test.
lambda).getModRefNodes().size();
146 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
147 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
164 ValidateProvider(test, *modRefSummary, *pointsToGraph);
167TEST(AgnosticModRefSummarizerTests, TestLoadFromUndef)
176 auto numLambdaEntryNodes =
177 modRefSummary.GetLambdaEntryModRef(test.
Lambda()).getModRefNodes().size();
178 auto numLambdaExitNodes =
179 modRefSummary.GetLambdaExitModRef(test.
Lambda()).getModRefNodes().size();
181 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
182 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
200 ValidateProvider(test, *modRefSummary, *pointsToGraph);
203TEST(AgnosticModRefSummarizerTests, TestCall1)
216 auto numLambdaEntryNodes =
217 modRefSummary.GetLambdaEntryModRef(*test.
lambda_f).getModRefNodes().size();
218 auto numLambdaExitNodes =
219 modRefSummary.GetLambdaExitModRef(*test.
lambda_f).getModRefNodes().size();
221 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
222 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
229 auto numLambdaEntryNodes =
230 modRefSummary.GetLambdaEntryModRef(*test.
lambda_g).getModRefNodes().size();
231 auto numLambdaExitNodes =
232 modRefSummary.GetLambdaExitModRef(*test.
lambda_g).getModRefNodes().size();
234 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
235 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
242 auto numLambdaEntryNodes =
243 modRefSummary.GetLambdaEntryModRef(*test.
lambda_h).getModRefNodes().size();
244 auto numLambdaExitNodes =
245 modRefSummary.GetLambdaExitModRef(*test.
lambda_h).getModRefNodes().size();
247 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
248 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
250 auto numCallFNodes = modRefSummary.GetSimpleNodeModRef(test.
CallF()).getModRefNodes().size();
251 EXPECT_EQ(numCallFNodes, pointsToGraph.numMemoryNodes());
253 auto numCallGNodes = modRefSummary.GetSimpleNodeModRef(test.
CallG()).getModRefNodes().size();
254 EXPECT_EQ(numCallGNodes, pointsToGraph.numMemoryNodes());
273 ValidateProvider(test, *modRefSummary, *pointsToGraph);
276TEST(AgnosticModRefSummarizerTests, TestCall2)
289 auto numLambdaEntryNodes =
290 modRefSummary.GetLambdaEntryModRef(*test.
lambda_create).getModRefNodes().size();
291 auto numLambdaExitNodes =
292 modRefSummary.GetLambdaExitModRef(*test.
lambda_create).getModRefNodes().size();
294 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
295 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
302 auto numLambdaEntryNodes =
303 modRefSummary.GetLambdaEntryModRef(*test.
lambda_destroy).getModRefNodes().size();
304 auto numLambdaExitNodes =
305 modRefSummary.GetLambdaExitModRef(*test.
lambda_destroy).getModRefNodes().size();
307 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
308 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
315 auto numLambdaEntryNodes =
316 modRefSummary.GetLambdaEntryModRef(*test.
lambda_test).getModRefNodes().size();
317 auto numLambdaExitNodes =
318 modRefSummary.GetLambdaExitModRef(*test.
lambda_test).getModRefNodes().size();
320 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
321 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
323 auto numCallCreate1Nodes =
324 modRefSummary.GetSimpleNodeModRef(test.
CallCreate1()).getModRefNodes().size();
325 EXPECT_EQ(numCallCreate1Nodes, pointsToGraph.numMemoryNodes());
327 auto numCallCreate2Nodes =
328 modRefSummary.GetSimpleNodeModRef(test.
CallCreate2()).getModRefNodes().size();
329 EXPECT_EQ(numCallCreate2Nodes, pointsToGraph.numMemoryNodes());
331 auto numCallDestroy1Nodes =
332 modRefSummary.GetSimpleNodeModRef(test.
CallDestroy1()).getModRefNodes().size();
333 EXPECT_EQ(numCallDestroy1Nodes, pointsToGraph.numMemoryNodes());
335 auto numCallDestroy2Nodes =
336 modRefSummary.GetSimpleNodeModRef(test.
CallDestroy2()).getModRefNodes().size();
337 EXPECT_EQ(numCallDestroy2Nodes, pointsToGraph.numMemoryNodes());
356 ValidateProvider(test, *modRefSummary, *pointsToGraph);
359TEST(AgnosticModRefSummarizerTests, TestIndirectCall)
372 auto numLambdaEntryNodes =
373 modRefSummary.GetLambdaEntryModRef(test.
GetLambdaFour()).getModRefNodes().size();
374 auto numLambdaExitNodes =
375 modRefSummary.GetLambdaExitModRef(test.
GetLambdaFour()).getModRefNodes().size();
377 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
378 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
385 auto numLambdaEntryNodes =
386 modRefSummary.GetLambdaEntryModRef(test.
GetLambdaThree()).getModRefNodes().size();
387 auto numLambdaExitNodes =
388 modRefSummary.GetLambdaExitModRef(test.
GetLambdaThree()).getModRefNodes().size();
390 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
391 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
398 auto numLambdaEntryNodes =
399 modRefSummary.GetLambdaEntryModRef(test.
GetLambdaIndcall()).getModRefNodes().size();
400 auto numLambdaExitNodes =
401 modRefSummary.GetLambdaExitModRef(test.
GetLambdaIndcall()).getModRefNodes().size();
403 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
404 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
406 auto numCallIndcallNodes =
407 modRefSummary.GetSimpleNodeModRef(test.
CallIndcall()).getModRefNodes().size();
408 EXPECT_EQ(numCallIndcallNodes, pointsToGraph.numMemoryNodes());
415 auto numLambdaEntryNodes =
416 modRefSummary.GetLambdaEntryModRef(test.
GetLambdaTest()).getModRefNodes().size();
417 auto numLambdaExitNodes =
418 modRefSummary.GetLambdaExitModRef(test.
GetLambdaTest()).getModRefNodes().size();
420 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
421 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
423 auto numCallThreeNodes =
424 modRefSummary.GetSimpleNodeModRef(test.
CallThree()).getModRefNodes().size();
425 EXPECT_EQ(numCallThreeNodes, pointsToGraph.numMemoryNodes());
427 auto numCallFourNodes =
428 modRefSummary.GetSimpleNodeModRef(test.
CallFour()).getModRefNodes().size();
429 EXPECT_EQ(numCallFourNodes, pointsToGraph.numMemoryNodes());
448 ValidateProvider(test, *modRefSummary, *pointsToGraph);
451TEST(AgnosticModRefSummarizerTests, TestGamma)
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();
468 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
469 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
470 EXPECT_EQ(numGammaEntryNodes, pointsToGraph.numMemoryNodes());
471 EXPECT_EQ(numGammaExitNodes, pointsToGraph.numMemoryNodes());
489 ValidateProvider(test, *modRefSummary, *pointsToGraph);
492TEST(AgnosticModRefSummarizerTests, TestTheta)
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();
507 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
508 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
509 EXPECT_EQ(numThetaNodes, pointsToGraph.numMemoryNodes());
527 ValidateProvider(test, *modRefSummary, *pointsToGraph);
530TEST(AgnosticModRefSummarizerTests, TestDelta1)
543 auto numLambdaEntryNodes =
544 modRefSummary.GetLambdaEntryModRef(*test.
lambda_g).getModRefNodes().size();
545 auto numLambdaExitNodes =
546 modRefSummary.GetLambdaExitModRef(*test.
lambda_g).getModRefNodes().size();
548 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
549 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
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();
562 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
563 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
564 EXPECT_EQ(numCallNodes, pointsToGraph.numMemoryNodes());
583 ValidateProvider(test, *modRefSummary, *pointsToGraph);
586TEST(AgnosticModRefSummarizerTests, TestDelta2)
599 auto numLambdaEntryNodes =
600 modRefSummary.GetLambdaEntryModRef(*test.
lambda_f1).getModRefNodes().size();
601 auto numLambdaExitNodes =
602 modRefSummary.GetLambdaExitModRef(*test.
lambda_f1).getModRefNodes().size();
604 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
605 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
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();
618 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
619 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
620 EXPECT_EQ(numCallNodes, pointsToGraph.numMemoryNodes());
639 ValidateProvider(test, *modRefSummary, *pointsToGraph);
642TEST(AgnosticModRefSummarizerTests, TestImports)
655 auto numLambdaEntryNodes =
656 modRefSummary.GetLambdaEntryModRef(*test.
lambda_f1).getModRefNodes().size();
657 auto numLambdaExitNodes =
658 modRefSummary.GetLambdaExitModRef(*test.
lambda_f1).getModRefNodes().size();
660 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
661 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
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();
674 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
675 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
676 EXPECT_EQ(numCallNodes, pointsToGraph.numMemoryNodes());
695 ValidateProvider(test, *modRefSummary, *pointsToGraph);
698TEST(AgnosticModRefSummarizerTests, TestPhi1)
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();
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());
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();
743 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
744 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
745 EXPECT_EQ(numCallFibNodes, pointsToGraph.numMemoryNodes());
764 ValidateProvider(test, *modRefSummary, *pointsToGraph);
767TEST(AgnosticModRefSummarizerTests, TestMemcpy)
780 auto numLambdaEntryNodes =
781 modRefSummary.GetLambdaEntryModRef(test.
LambdaF()).getModRefNodes().size();
782 auto numLambdaExitNodes =
783 modRefSummary.GetLambdaExitModRef(test.
LambdaF()).getModRefNodes().size();
785 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
786 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
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();
801 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
802 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
803 EXPECT_EQ(numCallFNodes, pointsToGraph.numMemoryNodes());
804 EXPECT_EQ(numMemcpyNodes, 2u);
823 ValidateProvider(test, *modRefSummary, *pointsToGraph);
826TEST(AgnosticModRefSummarizerTests, TestStatistics)
849 EXPECT_EQ(statistics.NumPointsToGraphMemoryNodes(), 2u);
850 EXPECT_NE(statistics.GetTime(), 0u);
TEST(AgnosticModRefSummarizerTests, TestStore1)
static std::unique_ptr< jlm::llvm::aa::PointsToGraph > RunAndersen(const jlm::llvm::LlvmRvsdgModule &module)
static jlm::util::StatisticsCollector statisticsCollector
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
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
jlm::rvsdg::LambdaNode * lambda_h
const rvsdg::SimpleNode & CallG() const noexcept
jlm::rvsdg::LambdaNode * lambda_g
const rvsdg::SimpleNode & CallF1() const noexcept
jlm::rvsdg::LambdaNode * lambda_f2
jlm::rvsdg::LambdaNode * lambda_f1
jlm::rvsdg::LambdaNode * lambda
const rvsdg::SimpleNode & CallF1() const noexcept
jlm::rvsdg::LambdaNode * lambda_f1
jlm::rvsdg::LambdaNode * lambda_f2
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
const jlm::rvsdg::LambdaNode & Lambda() const noexcept
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::LambdaNode * lambda
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
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()
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::ThetaNode * theta
Agnostic mod/ref summarizer statistics.
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
@ AgnosticModRefSummarizer
Global memory state passed between functions.