6 #include <gtest/gtest.h>
14 static std::unique_ptr<jlm::llvm::aa::PointsToGraph>
24 TEST(AgnosticModRefSummarizerTests, TestStore1)
33 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda).Size();
34 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda).Size();
36 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
37 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
55 ValidateProvider(test, *modRefSummary, *pointsToGraph);
58 TEST(AgnosticModRefSummarizerTests, TestStore2)
67 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda).Size();
68 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda).Size();
70 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
71 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
89 ValidateProvider(test, *modRefSummary, *pointsToGraph);
92 TEST(AgnosticModRefSummarizerTests, TestLoad1)
101 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda).Size();
102 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda).Size();
104 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
105 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
123 ValidateProvider(test, *modRefSummary, *pointsToGraph);
126 TEST(AgnosticModRefSummarizerTests, TestLoad2)
135 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda).Size();
136 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda).Size();
138 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
139 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
156 ValidateProvider(test, *modRefSummary, *pointsToGraph);
159 TEST(AgnosticModRefSummarizerTests, TestLoadFromUndef)
168 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
Lambda()).Size();
169 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
Lambda()).Size();
171 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
172 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
190 ValidateProvider(test, *modRefSummary, *pointsToGraph);
193 TEST(AgnosticModRefSummarizerTests, TestCall1)
206 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_f).Size();
207 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_f).Size();
209 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
210 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
217 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_g).Size();
218 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_g).Size();
220 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
221 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
228 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_h).Size();
229 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_h).Size();
231 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
232 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
234 auto numCallFNodes = modRefSummary.GetSimpleNodeModRef(test.
CallF()).Size();
235 EXPECT_EQ(numCallFNodes, pointsToGraph.numMemoryNodes());
237 auto numCallGNodes = modRefSummary.GetSimpleNodeModRef(test.
CallG()).Size();
238 EXPECT_EQ(numCallGNodes, pointsToGraph.numMemoryNodes());
257 ValidateProvider(test, *modRefSummary, *pointsToGraph);
260 TEST(AgnosticModRefSummarizerTests, TestCall2)
273 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_create).Size();
274 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_create).Size();
276 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
277 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
284 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_destroy).Size();
285 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_destroy).Size();
287 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
288 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
295 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_test).Size();
296 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_test).Size();
298 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
299 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
301 auto numCallCreate1Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallCreate1()).Size();
302 EXPECT_EQ(numCallCreate1Nodes, pointsToGraph.numMemoryNodes());
304 auto numCallCreate2Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallCreate2()).Size();
305 EXPECT_EQ(numCallCreate2Nodes, pointsToGraph.numMemoryNodes());
307 auto numCallDestroy1Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallDestroy1()).Size();
308 EXPECT_EQ(numCallDestroy1Nodes, pointsToGraph.numMemoryNodes());
310 auto numCallDestroy2Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallDestroy2()).Size();
311 EXPECT_EQ(numCallDestroy2Nodes, pointsToGraph.numMemoryNodes());
330 ValidateProvider(test, *modRefSummary, *pointsToGraph);
333 TEST(AgnosticModRefSummarizerTests, TestIndirectCall)
346 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaFour()).Size();
347 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaFour()).Size();
349 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
350 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
357 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaThree()).Size();
358 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaThree()).Size();
360 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
361 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
368 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaIndcall()).Size();
369 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaIndcall()).Size();
371 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
372 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
374 auto numCallIndcallNodes = modRefSummary.GetSimpleNodeModRef(test.
CallIndcall()).Size();
375 EXPECT_EQ(numCallIndcallNodes, pointsToGraph.numMemoryNodes());
382 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaTest()).Size();
383 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaTest()).Size();
385 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
386 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
388 auto numCallThreeNodes = modRefSummary.GetSimpleNodeModRef(test.
CallThree()).Size();
389 EXPECT_EQ(numCallThreeNodes, pointsToGraph.numMemoryNodes());
391 auto numCallFourNodes = modRefSummary.GetSimpleNodeModRef(test.
CallFour()).Size();
392 EXPECT_EQ(numCallFourNodes, pointsToGraph.numMemoryNodes());
411 ValidateProvider(test, *modRefSummary, *pointsToGraph);
414 TEST(AgnosticModRefSummarizerTests, TestGamma)
423 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda).Size();
424 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda).Size();
425 auto numGammaEntryNodes = modRefSummary.GetGammaEntryModRef(*test.
gamma).Size();
426 auto numGammaExitNodes = modRefSummary.GetGammaExitModRef(*test.
gamma).Size();
428 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
429 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
430 EXPECT_EQ(numGammaEntryNodes, pointsToGraph.numMemoryNodes());
431 EXPECT_EQ(numGammaExitNodes, pointsToGraph.numMemoryNodes());
449 ValidateProvider(test, *modRefSummary, *pointsToGraph);
452 TEST(AgnosticModRefSummarizerTests, TestTheta)
461 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda).Size();
462 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda).Size();
463 auto numThetaNodes = modRefSummary.GetThetaModRef(*test.
theta).Size();
465 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
466 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
467 EXPECT_EQ(numThetaNodes, pointsToGraph.numMemoryNodes());
485 ValidateProvider(test, *modRefSummary, *pointsToGraph);
488 TEST(AgnosticModRefSummarizerTests, TestDelta1)
501 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_g).Size();
502 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_g).Size();
504 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
505 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
512 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_h).Size();
513 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_h).Size();
514 auto numCallNodes = modRefSummary.GetSimpleNodeModRef(test.
CallG()).Size();
516 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
517 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
518 EXPECT_EQ(numCallNodes, pointsToGraph.numMemoryNodes());
537 ValidateProvider(test, *modRefSummary, *pointsToGraph);
540 TEST(AgnosticModRefSummarizerTests, TestDelta2)
553 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_f1).Size();
554 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_f1).Size();
556 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
557 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
564 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_f2).Size();
565 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_f2).Size();
566 auto numCallNodes = modRefSummary.GetSimpleNodeModRef(test.
CallF1()).Size();
568 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
569 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
570 EXPECT_EQ(numCallNodes, pointsToGraph.numMemoryNodes());
589 ValidateProvider(test, *modRefSummary, *pointsToGraph);
592 TEST(AgnosticModRefSummarizerTests, TestImports)
605 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_f1).Size();
606 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_f1).Size();
608 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
609 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
616 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_f2).Size();
617 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_f2).Size();
618 auto numCallNodes = modRefSummary.GetSimpleNodeModRef(test.
CallF1()).Size();
620 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
621 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
622 EXPECT_EQ(numCallNodes, pointsToGraph.numMemoryNodes());
641 ValidateProvider(test, *modRefSummary, *pointsToGraph);
644 TEST(AgnosticModRefSummarizerTests, TestPhi1)
657 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_fib).Size();
658 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_fib).Size();
659 auto numGammaEntryNodes = modRefSummary.GetGammaEntryModRef(*test.
gamma).Size();
660 auto numGammaExitNodes = modRefSummary.GetGammaExitModRef(*test.
gamma).Size();
661 auto numCallFibm1Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallFibm1()).Size();
662 auto numCallFibm2Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallFibm2()).Size();
664 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
665 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
666 EXPECT_EQ(numGammaEntryNodes, pointsToGraph.numMemoryNodes());
667 EXPECT_EQ(numGammaExitNodes, pointsToGraph.numMemoryNodes());
668 EXPECT_EQ(numCallFibm1Nodes, pointsToGraph.numMemoryNodes());
669 EXPECT_EQ(numCallFibm2Nodes, pointsToGraph.numMemoryNodes());
676 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_test).Size();
677 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_test).Size();
678 auto numCallFibNodes = modRefSummary.GetSimpleNodeModRef(test.
CallFib()).Size();
680 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
681 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
682 EXPECT_EQ(numCallFibNodes, pointsToGraph.numMemoryNodes());
701 ValidateProvider(test, *modRefSummary, *pointsToGraph);
704 TEST(AgnosticModRefSummarizerTests, TestMemcpy)
717 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
LambdaF()).Size();
718 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
LambdaF()).Size();
720 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
721 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
728 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
LambdaG()).Size();
729 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
LambdaG()).Size();
730 auto numCallFNodes = modRefSummary.GetSimpleNodeModRef(test.
CallF()).Size();
731 auto numMemcpyNodes = modRefSummary.GetSimpleNodeModRef(test.
Memcpy()).Size();
733 EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
734 EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
735 EXPECT_EQ(numCallFNodes, pointsToGraph.numMemoryNodes());
736 EXPECT_EQ(numMemcpyNodes, 2u);
755 ValidateProvider(test, *modRefSummary, *pointsToGraph);
758 TEST(AgnosticModRefSummarizerTests, TestStatistics)
781 EXPECT_EQ(statistics.NumPointsToGraphMemoryNodes(), 2u);
782 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
jlm::rvsdg::LambdaNode * lambda_test
const rvsdg::SimpleNode & CallCreate2() const noexcept
jlm::rvsdg::LambdaNode * lambda_create
const rvsdg::SimpleNode & CallDestroy2() const noexcept
jlm::rvsdg::LambdaNode * lambda_destroy
const rvsdg::SimpleNode & CallDestroy1() const noexcept
const rvsdg::SimpleNode & CallCreate1() const noexcept
jlm::rvsdg::LambdaNode * lambda_h
jlm::rvsdg::LambdaNode * lambda_g
const rvsdg::SimpleNode & CallG() const noexcept
jlm::rvsdg::LambdaNode * lambda_f2
jlm::rvsdg::LambdaNode * lambda_f1
const rvsdg::SimpleNode & CallF1() const noexcept
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::LambdaNode * lambda_f1
jlm::rvsdg::LambdaNode * lambda_f2
const rvsdg::SimpleNode & CallF1() const noexcept
const jlm::rvsdg::LambdaNode & GetLambdaTest() const noexcept
const jlm::rvsdg::LambdaNode & GetLambdaIndcall() const noexcept
const rvsdg::SimpleNode & CallThree() const noexcept
const jlm::rvsdg::LambdaNode & GetLambdaFour() const noexcept
const rvsdg::SimpleNode & CallIndcall() const noexcept
const jlm::rvsdg::LambdaNode & GetLambdaThree() 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 rvsdg::SimpleNode & CallF() const noexcept
const jlm::rvsdg::LambdaNode & LambdaF() const noexcept
const jlm::rvsdg::LambdaNode & LambdaG() const noexcept
const rvsdg::SimpleNode & Memcpy() const noexcept
jlm::rvsdg::LambdaNode * lambda_test
const rvsdg::SimpleNode & CallFibm2() const noexcept
jlm::rvsdg::LambdaNode * lambda_fib
const rvsdg::SimpleNode & CallFib() 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.