7 #include <gtest/gtest.h>
23 static std::unique_ptr<jlm::llvm::aa::PointsToGraph>
27 return andersen.
Analyze(rvsdgModule);
36 return receivedMemoryNodes == expectedMemoryNodes;
39 TEST(RegionAwareModRefSummarizerTests, TestStore1)
48 auto allocaAMemoryNode = pointsToGraph.getNodeForAlloca(*test.
alloca_a);
50 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda);
51 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
53 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda);
54 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
58 EXPECT_TRUE(jlm::rvsdg::is<jlm::llvm::StoreNonVolatileOperation>(storeANode));
60 auto & storeANodes = modRefSummary.GetSimpleNodeModRef(*storeANode);
61 EXPECT_TRUE(
setsEqual(storeANodes, { allocaAMemoryNode }));
79 ValidateProvider(test, *modRefSummary, *pointsToGraph);
82 TEST(RegionAwareModRefSummarizerTests, TestStore2)
91 auto allocaAMemoryNode = pointsToGraph.getNodeForAlloca(*test.
alloca_a);
92 auto allocaBMemoryNode = pointsToGraph.getNodeForAlloca(*test.
alloca_b);
93 auto allocaPMemoryNode = pointsToGraph.getNodeForAlloca(*test.
alloca_p);
94 auto allocaXMemoryNode = pointsToGraph.getNodeForAlloca(*test.
alloca_x);
95 auto allocaYMemoryNode = pointsToGraph.getNodeForAlloca(*test.
alloca_y);
103 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda);
104 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
106 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda);
107 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
125 ValidateProvider(test, *modRefSummary, *pointsToGraph);
128 TEST(RegionAwareModRefSummarizerTests, TestLoad1)
137 auto externalMemoryNode = pointsToGraph.getExternalMemoryNode();
139 auto lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda);
140 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, { externalMemoryNode }));
142 auto lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda);
143 EXPECT_TRUE(
setsEqual(lambdaExitNodes, { externalMemoryNode }));
161 ValidateProvider(test, *modRefSummary, *pointsToGraph);
164 TEST(RegionAwareModRefSummarizerTests, TestLoad2)
169 auto ValidateProvider =
172 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda);
173 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
175 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda);
176 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
194 ValidateProvider(test, *modRefSummary);
197 TEST(RegionAwareModRefSummarizerTests, TestLoadFromUndef)
206 auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
Lambda()).Size();
207 auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
Lambda()).Size();
209 EXPECT_EQ(numLambdaEntryNodes, 0u);
210 EXPECT_EQ(numLambdaExitNodes, 0u);
228 ValidateProvider(test, *modRefSummary, *pointsToGraph);
231 TEST(RegionAwareModRefSummarizerTests, TestCall1)
240 auto allocaXMemoryNode = pointsToGraph.getNodeForAlloca(*test.
alloca_x);
241 auto allocaYMemoryNode = pointsToGraph.getNodeForAlloca(*test.
alloca_y);
242 auto allocaZMemoryNode = pointsToGraph.getNodeForAlloca(*test.
alloca_z);
248 auto & lambdaFEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_f);
249 EXPECT_TRUE(
setsEqual(lambdaFEntryNodes, { allocaXMemoryNode, allocaYMemoryNode }));
251 auto & lambdaFExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_f);
252 EXPECT_TRUE(
setsEqual(lambdaFExitNodes, { allocaXMemoryNode, allocaYMemoryNode }));
259 auto & lambdaGEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_g);
260 EXPECT_TRUE(
setsEqual(lambdaGEntryNodes, { allocaZMemoryNode }));
262 auto & lambdaGExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_g);
263 EXPECT_TRUE(
setsEqual(lambdaGExitNodes, { allocaZMemoryNode }));
270 auto & lambdaHEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_h);
271 EXPECT_TRUE(
setsEqual(lambdaHEntryNodes, {}));
273 auto & callFNodes = modRefSummary.GetSimpleNodeModRef(test.
CallF());
274 EXPECT_TRUE(
setsEqual(callFNodes, { allocaXMemoryNode, allocaYMemoryNode }));
276 auto & callGNodes = modRefSummary.GetSimpleNodeModRef(test.
CallG());
277 EXPECT_TRUE(
setsEqual(callGNodes, { allocaZMemoryNode }));
279 auto & lambdaHExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_h);
280 EXPECT_TRUE(
setsEqual(lambdaHExitNodes, {}));
299 ValidateProvider(test, *modRefSummary, *pointsToGraph);
302 TEST(RegionAwareModRefSummarizerTests, TestCall2)
311 auto mallocMemoryNode = pointsToGraph.getNodeForMalloc(*test.
malloc);
317 auto & lambdaCreateEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_create);
318 EXPECT_TRUE(
setsEqual(lambdaCreateEntryNodes, { mallocMemoryNode }));
320 auto & lambdaCreateExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_create);
321 EXPECT_TRUE(
setsEqual(lambdaCreateExitNodes, { mallocMemoryNode }));
328 auto & lambdaDestroyEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_destroy);
329 EXPECT_TRUE(
setsEqual(lambdaDestroyEntryNodes, { mallocMemoryNode }));
331 auto & lambdaDestroyExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_destroy);
332 EXPECT_TRUE(
setsEqual(lambdaDestroyExitNodes, { mallocMemoryNode }));
339 auto & lambdaTestEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_test);
340 EXPECT_TRUE(
setsEqual(lambdaTestEntryNodes, { mallocMemoryNode }));
342 auto & callCreate1Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallCreate1());
343 EXPECT_TRUE(
setsEqual(callCreate1Nodes, { mallocMemoryNode }));
345 auto & callCreate2Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallCreate2());
346 EXPECT_TRUE(
setsEqual(callCreate2Nodes, { mallocMemoryNode }));
348 auto & callDestroy1Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallDestroy1());
349 EXPECT_TRUE(
setsEqual(callDestroy1Nodes, { mallocMemoryNode }));
351 auto & callDestroy2Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallDestroy2());
352 EXPECT_TRUE(
setsEqual(callDestroy2Nodes, { mallocMemoryNode }));
354 auto & lambdaTestExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_test);
355 EXPECT_TRUE(
setsEqual(lambdaTestExitNodes, { mallocMemoryNode }));
374 ValidateProvider(test, *modRefSummary, *pointsToGraph);
377 TEST(RegionAwareModRefSummarizerTests, TestIndirectCall)
390 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaFour());
391 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
393 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaFour());
394 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
401 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaThree());
402 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
404 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaThree());
405 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
412 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaIndcall());
413 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
415 auto & callNodes = modRefSummary.GetSimpleNodeModRef(test.
CallIndcall());
418 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaIndcall());
419 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
426 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaTest());
427 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
429 auto & callFourNodes = modRefSummary.GetSimpleNodeModRef(test.
CallFour());
430 EXPECT_TRUE(
setsEqual(callFourNodes, {}));
432 auto & callThreeNodes = modRefSummary.GetSimpleNodeModRef(test.
CallThree());
433 EXPECT_TRUE(
setsEqual(callThreeNodes, {}));
435 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaTest());
436 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
455 ValidateProvider(test, *modRefSummary, *pointsToGraph);
458 TEST(RegionAwareModRefSummarizerTests, TestIndirectCall2)
467 auto deltaG1MemoryNode = pointsToGraph.getNodeForDelta(test.
GetDeltaG1());
468 auto deltaG2MemoryNode = pointsToGraph.getNodeForDelta(test.
GetDeltaG2());
470 auto allocaPxMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetAllocaPx());
471 auto allocaPyMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetAllocaPy());
472 auto allocaPzMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetAllocaPz());
495 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaFour());
496 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
498 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaFour());
499 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
506 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaThree());
507 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
509 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaThree());
510 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
517 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaI());
518 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
520 auto & callNodes = modRefSummary.GetSimpleNodeModRef(test.
GetIndirectCall());
523 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaI());
524 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
531 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaX());
532 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, pXZ));
534 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaX());
535 EXPECT_TRUE(
setsEqual(lambdaExitNodes, pXZ));
542 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaY());
543 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, pY));
545 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaY());
546 EXPECT_TRUE(
setsEqual(lambdaExitNodes, pY));
553 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaTest());
554 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, pG1G2));
556 auto & callXNodes = modRefSummary.GetSimpleNodeModRef(test.
GetTestCallX());
559 auto & callYNodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallY());
562 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaTest());
563 EXPECT_TRUE(
setsEqual(lambdaExitNodes, pG1G2));
570 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaTest2());
571 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
573 auto & callXNodes = modRefSummary.GetSimpleNodeModRef(test.
GetTest2CallX());
576 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaTest2());
577 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
596 ValidateProvider(test, *modRefSummary, *pointsToGraph);
599 TEST(RegionAwareModRefSummarizerTests, TestGamma)
608 auto externalMemoryNode = pointsToGraph.getExternalMemoryNode();
610 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda);
611 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, { externalMemoryNode }));
613 auto gammaEntryNodes = modRefSummary.GetGammaEntryModRef(*test.
gamma);
614 EXPECT_TRUE(
setsEqual(gammaEntryNodes, {}));
616 auto gammaExitNodes = modRefSummary.GetGammaExitModRef(*test.
gamma);
617 EXPECT_TRUE(
setsEqual(gammaExitNodes, {}));
619 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda);
620 EXPECT_TRUE(
setsEqual(lambdaExitNodes, { externalMemoryNode }));
638 ValidateProvider(test, *modRefSummary, *pointsToGraph);
641 TEST(RegionAwareModRefSummarizerTests, TestTheta)
650 auto externalMemoryNode = pointsToGraph.getExternalMemoryNode();
652 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda);
653 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, { externalMemoryNode }));
655 auto & thetaEntryExitNodes = modRefSummary.GetThetaModRef(*test.
theta);
656 EXPECT_TRUE(
setsEqual(thetaEntryExitNodes, { externalMemoryNode }));
658 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda);
659 EXPECT_TRUE(
setsEqual(lambdaExitNodes, { externalMemoryNode }));
677 ValidateProvider(test, *modRefSummary, *pointsToGraph);
680 TEST(RegionAwareModRefSummarizerTests, TestDelta1)
689 auto deltaFNode = pointsToGraph.getNodeForDelta(*test.
delta_f);
695 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_g);
696 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, { deltaFNode }));
698 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_g);
699 EXPECT_TRUE(
setsEqual(lambdaExitNodes, { deltaFNode }));
706 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_h);
707 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, { deltaFNode }));
709 auto & callEntryNodes = modRefSummary.GetSimpleNodeModRef(test.
CallG());
710 EXPECT_TRUE(
setsEqual(callEntryNodes, { deltaFNode }));
712 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_h);
713 EXPECT_TRUE(
setsEqual(lambdaExitNodes, { deltaFNode }));
732 ValidateProvider(test, *modRefSummary, *pointsToGraph);
735 TEST(RegionAwareModRefSummarizerTests, TestDelta2)
744 auto deltaD1Node = pointsToGraph.getNodeForDelta(*test.
delta_d1);
745 auto deltaD2Node = pointsToGraph.getNodeForDelta(*test.
delta_d2);
751 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_f1);
752 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, { deltaD1Node }));
754 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_f1);
755 EXPECT_TRUE(
setsEqual(lambdaExitNodes, { deltaD1Node }));
762 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_f2);
763 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, { deltaD1Node, deltaD2Node }));
765 auto & callEntryNodes = modRefSummary.GetSimpleNodeModRef(test.
CallF1());
766 EXPECT_TRUE(
setsEqual(callEntryNodes, { deltaD1Node }));
768 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_f2);
769 EXPECT_TRUE(
setsEqual(lambdaExitNodes, { deltaD1Node, deltaD2Node }));
788 ValidateProvider(test, *modRefSummary, *pointsToGraph);
791 TEST(RegionAwareModRefSummarizerTests, TestImports)
800 auto importD1Node = pointsToGraph.getNodeForImport(*test.
import_d1);
801 auto importD2Node = pointsToGraph.getNodeForImport(*test.
import_d2);
807 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_f1);
808 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, { importD1Node }));
810 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_f1);
811 EXPECT_TRUE(
setsEqual(lambdaExitNodes, { importD1Node }));
818 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_f2);
819 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, { importD1Node, importD2Node }));
821 auto & callNodes = modRefSummary.GetSimpleNodeModRef(test.
CallF1());
822 EXPECT_TRUE(
setsEqual(callNodes, { importD1Node }));
824 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_f2);
825 EXPECT_TRUE(
setsEqual(lambdaExitNodes, { importD1Node, importD2Node }));
844 ValidateProvider(test, *modRefSummary, *pointsToGraph);
847 TEST(RegionAwareModRefSummarizerTests, TestPhi1)
856 auto resultAllocaNode = pointsToGraph.getNodeForAlloca(*test.
alloca);
862 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_fib);
863 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, { resultAllocaNode }));
865 auto & callFibM1Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallFibm1());
866 EXPECT_TRUE(
setsEqual(callFibM1Nodes, { resultAllocaNode }));
868 auto & callFibM2Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallFibm2());
869 EXPECT_TRUE(
setsEqual(callFibM2Nodes, { resultAllocaNode }));
871 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_fib);
872 EXPECT_TRUE(
setsEqual(lambdaExitNodes, { resultAllocaNode }));
879 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_test);
880 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
882 auto & callNodes = modRefSummary.GetSimpleNodeModRef(test.
CallFib());
883 EXPECT_TRUE(
setsEqual(callNodes, { resultAllocaNode }));
885 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_test);
886 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
905 ValidateProvider(test, *modRefSummary, *pointsToGraph);
908 TEST(RegionAwareModRefSummarizerTests, TestPhi2)
917 auto pTestAllocaMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetPTestAlloca());
918 auto paAllocaMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetPaAlloca());
919 [[maybe_unused]]
auto pbAllocaMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetPbAlloca());
920 auto pcAllocaMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetPcAlloca());
921 auto pdAllocaMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetPdAlloca());
923 jlm::util::HashSet pTestAC({ pTestAllocaMemoryNode, paAllocaMemoryNode, pcAllocaMemoryNode });
924 jlm::util::HashSet pTestBD({ pTestAllocaMemoryNode, pbAllocaMemoryNode, pdAllocaMemoryNode });
925 jlm::util::HashSet pTestCD({ pTestAllocaMemoryNode, pcAllocaMemoryNode, pdAllocaMemoryNode });
926 jlm::util::HashSet pTestAD({ pTestAllocaMemoryNode, paAllocaMemoryNode, pdAllocaMemoryNode });
928 { pTestAllocaMemoryNode, paAllocaMemoryNode, pcAllocaMemoryNode, pdAllocaMemoryNode });
934 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaEight());
935 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
937 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaEight());
938 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
945 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaI());
946 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
948 auto & callNodes = modRefSummary.GetSimpleNodeModRef(test.
GetIndirectCall());
951 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaI());
952 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
959 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaA());
960 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, pTestCD));
962 auto & callBNodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallB());
963 EXPECT_TRUE(
setsEqual(callBNodes, pTestAD));
965 auto & callDNodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallD());
966 EXPECT_TRUE(
setsEqual(callDNodes, pTestAC));
968 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaA());
969 EXPECT_TRUE(
setsEqual(lambdaExitNodes, pTestCD));
976 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaB());
977 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, pTestAD));
979 auto & callINodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallI());
982 auto & callCNodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallC());
983 EXPECT_TRUE(
setsEqual(callCNodes, pTestBD));
985 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaB());
986 EXPECT_TRUE(
setsEqual(lambdaExitNodes, pTestAD));
993 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaC());
994 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, pTestBD));
996 auto & callNodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallAFromC());
997 EXPECT_TRUE(
setsEqual(callNodes, pTestCD));
999 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaC());
1000 EXPECT_TRUE(
setsEqual(lambdaExitNodes, pTestBD));
1007 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaD());
1008 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, pTestAC));
1010 auto & callNodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallAFromD());
1011 EXPECT_TRUE(
setsEqual(callNodes, pTestCD));
1013 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaD());
1014 EXPECT_TRUE(
setsEqual(lambdaExitNodes, pTestAC));
1021 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaTest());
1022 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, {}));
1024 auto & callNodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallAFromTest());
1025 EXPECT_TRUE(
setsEqual(callNodes, { pTestAllocaMemoryNode }));
1027 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaTest());
1028 EXPECT_TRUE(
setsEqual(lambdaExitNodes, {}));
1041 auto modRefSummary =
1047 ValidateProvider(test, *modRefSummary, *pointsToGraph);
1050 TEST(RegionAwareModRefSummarizerTests, TestPhiWithDelta)
1054 std::unordered_map<const jlm::rvsdg::Output *, std::string> outputMap;
1061 auto modRefSummary =
1068 TEST(RegionAwareModRefSummarizerTests, TestMemcpy)
1077 auto localArrayMemoryNode = pointsToGraph.getNodeForDelta(test.
LocalArray());
1078 auto globalArrayMemoryNode = pointsToGraph.getNodeForDelta(test.
GlobalArray());
1084 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
LambdaF());
1085 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, { globalArrayMemoryNode }));
1087 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
LambdaF());
1088 EXPECT_TRUE(
setsEqual(lambdaExitNodes, { globalArrayMemoryNode }));
1095 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
LambdaG());
1096 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, { localArrayMemoryNode, globalArrayMemoryNode }));
1098 auto & callNodes = modRefSummary.GetSimpleNodeModRef(test.
CallF());
1099 EXPECT_TRUE(
setsEqual(callNodes, { globalArrayMemoryNode }));
1101 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
LambdaG());
1102 EXPECT_TRUE(
setsEqual(lambdaExitNodes, { localArrayMemoryNode, globalArrayMemoryNode }));
1115 auto modRefSummary =
1121 ValidateProvider(test, *modRefSummary, *pointsToGraph);
1124 TEST(RegionAwareModRefSummarizerTests, TestEscapedMemory1)
1133 auto deltaBMemoryNode = pointsToGraph.getNodeForDelta(*test.
DeltaB);
1135 auto externalMemoryNode = pointsToGraph.getExternalMemoryNode();
1139 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
LambdaTest);
1140 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, expectedMemoryNodes));
1142 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
LambdaTest);
1143 EXPECT_TRUE(
setsEqual(lambdaExitNodes, expectedMemoryNodes));
1155 auto modRefSummary =
1161 ValidateProvider(test, *modRefSummary, *pointsToGraph);
1164 TEST(RegionAwareModRefSummarizerTests, TestEscapedMemory2)
1173 auto returnAddressMallocMemoryNode = pointsToGraph.getNodeForMalloc(*test.
ReturnAddressMalloc);
1174 auto callExternalFunction1MallocMemoryNode =
1177 auto externalMemoryNode = pointsToGraph.getExternalMemoryNode();
1184 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, { returnAddressMallocMemoryNode }));
1187 EXPECT_TRUE(
setsEqual(lambdaExitNodes, { returnAddressMallocMemoryNode }));
1196 externalMemoryNode };
1199 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, expectedMemoryNodes));
1202 EXPECT_TRUE(
setsEqual(callNodes, expectedMemoryNodes));
1205 EXPECT_TRUE(
setsEqual(lambdaExitNodes, expectedMemoryNodes));
1218 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, expectedMemoryNodes));
1221 EXPECT_TRUE(
setsEqual(callNodes, expectedMemoryNodes));
1224 EXPECT_TRUE(
setsEqual(lambdaExitNodes, expectedMemoryNodes));
1237 auto modRefSummary =
1243 ValidateProvider(test, *modRefSummary, *pointsToGraph);
1246 TEST(RegionAwareModRefSummarizerTests, TestEscapedMemory3)
1255 auto externalMemoryNode = pointsToGraph.getExternalMemoryNode();
1260 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
LambdaTest);
1261 EXPECT_TRUE(
setsEqual(lambdaEntryNodes, expectedMemoryNodes));
1264 EXPECT_TRUE(
setsEqual(callNodes, expectedMemoryNodes));
1266 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.
LambdaTest);
1267 EXPECT_TRUE(
setsEqual(lambdaExitNodes, expectedMemoryNodes));
1279 auto modRefSummary =
1285 ValidateProvider(test, *modRefSummary, *pointsToGraph);
1288 TEST(RegionAwareModRefSummarizerTests, testSetjmpHandling)
1290 using namespace jlm;
1326 auto & graph = rvsdgModule.
Rvsdg();
1338 { ioStateType, memoryStateType },
1339 { ioStateType, memoryStateType });
1342 { pointerType, ioStateType, memoryStateType },
1343 { int32Type, ioStateType, memoryStateType });
1346 { pointerType, ioStateType, memoryStateType },
1347 { ioStateType, memoryStateType });
1350 { ioStateType, memoryStateType },
1351 { int32Type, ioStateType, memoryStateType });
1381 const auto arguments = hLambdaNode.GetFunctionArguments();
1382 auto ioState = arguments.at(0);
1383 auto memoryState = arguments.at(1);
1385 const auto opaqueCtxVar = hLambdaNode.AddContextVar(opaqueImport);
1389 callOpaqueNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*call[0]);
1391 memoryState = call[1];
1393 hLambdaNode.finalize({ ioState, memoryState });
1400 const auto arguments = kLambdaNode.GetFunctionArguments();
1401 kLambdaNode.finalize({ arguments.at(0), arguments.at(1) });
1408 const auto arguments = gLambdaNode.GetFunctionArguments();
1409 const auto p = arguments.at(0);
1410 auto ioState = arguments.at(1);
1411 auto memoryState = arguments.at(2);
1413 const auto setjmpCtxVar = gLambdaNode.AddContextVar(setjmpImport);
1414 const auto bufCtxVar = gLambdaNode.AddContextVar(bufGlobal.output());
1415 const auto hCtxVar = gLambdaNode.AddContextVar(*hLambdaNode.output());
1416 const auto kCtxVar = gLambdaNode.AddContextVar(*kLambdaNode.output());
1421 { bufCtxVar.inner, ioState, memoryState });
1422 auto & setjmpResult = *setjmpCall[0];
1423 ioState = setjmpCall[1];
1424 memoryState = setjmpCall[2];
1429 auto hEntryVar = gammaNode.AddEntryVar(hCtxVar.inner);
1430 auto kEntryVar = gammaNode.AddEntryVar(kCtxVar.inner);
1431 auto ioStateEntryVar = gammaNode.AddEntryVar(ioState);
1432 auto memoryStateEntryVar = gammaNode.AddEntryVar(memoryState);
1433 auto & elseRegion = *gammaNode.subregion(0);
1436 pEntryVar.branchArgument[0],
1438 { memoryStateEntryVar.branchArgument[0] },
1442 hEntryVar.branchArgument[0],
1444 { ioStateEntryVar.branchArgument[0], storeOutputs[0] });
1445 callHNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*hCall[0]);
1448 kEntryVar.branchArgument[0],
1450 { hCall[0], hCall[1] });
1451 callKNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*kCall[0]);
1453 ioState = gammaNode.AddExitVar({ kCall[0], ioStateEntryVar.branchArgument[1] }).output;
1454 memoryState = gammaNode.AddExitVar({ kCall[1], memoryStateEntryVar.branchArgument[1] }).output;
1456 gLambdaNode.finalize({ ioState, memoryState });
1463 const auto arguments = fLambdaNode.GetFunctionArguments();
1464 const auto ioStateIn = arguments.at(0);
1465 const auto memoryStateIn = arguments.at(1);
1467 const auto gCtxVar = fLambdaNode.AddContextVar(*gLambdaNode.output());
1469 const auto constant1 =
1472 allocaNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*aAlloca[0]);
1474 auto & memoryStateJoin =
1475 rvsdg::CreateOpNode<MemoryStateJoinOperation>({ memoryStateIn, aAlloca[1] }, 2);
1480 { aAlloca[0], ioStateIn, memoryStateJoin.output(0) });
1484 fLambdaNode.finalize({ loadOutputs[0], gCall[0], loadOutputs[1] });
1501 EXPECT_NE(callOpaqueNode,
nullptr);
1502 EXPECT_NE(callHNode,
nullptr);
1503 EXPECT_NE(callKNode,
nullptr);
1504 EXPECT_NE(allocaNode,
nullptr);
1506 const auto allocaPtgNode = ptg->getNodeForAlloca(*allocaNode);
1509 const auto callHModRef = modRefSummary->GetSimpleNodeModRef(*callHNode);
1510 EXPECT_TRUE(callHModRef.Contains(allocaPtgNode));
1513 const auto callKModRef = modRefSummary->GetSimpleNodeModRef(*callKNode);
1514 EXPECT_FALSE(callKModRef.Contains(allocaPtgNode));
1518 const auto callOpaqueModRef = modRefSummary->GetSimpleNodeModRef(*callOpaqueNode);
1519 EXPECT_EQ(callOpaqueModRef.Size(), 1);
1522 auto & statistic = *collector.CollectedStatistics().begin();
1524 EXPECT_EQ(statistic.GetMeasurementValue<uint64_t>(
"#CallGraphSccs"), 2u);
1526 EXPECT_EQ(statistic.GetMeasurementValue<uint64_t>(
"#FunctionsCallingSetjmp"), 1u);
1529 TEST(RegionAwareModRefSummarizerTests, TestEscapedFunction)
1531 using namespace jlm;
1551 auto & graph = rvsdgModule.
Rvsdg();
1559 { ioStateType, memoryStateType },
1560 { ioStateType, memoryStateType });
1563 { ioStateType, memoryStateType },
1564 { int32Type, ioStateType, memoryStateType });
1583 const auto arguments = fLambdaNode.GetFunctionArguments();
1584 auto ioState = arguments.at(0);
1585 auto memoryState = arguments.at(1);
1587 const auto globalCtxVar = fLambdaNode.AddContextVar(global.output());
1588 const auto opaqueCtxVar = fLambdaNode.AddContextVar(opaqueImport);
1590 const auto loadOutputs =
1593 const auto incrementedGlobal =
1594 rvsdg::CreateOpNode<IntegerAddOperation>({ loadOutputs[0],
one }, 32).output(0);
1601 const auto opaqueCall =
1603 opaqueCallNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*opaqueCall[0]);
1604 ioState = opaqueCall[0];
1605 memoryState = opaqueCall[1];
1607 const auto returnLoadOutputs =
1610 fLambdaNode.finalize({ returnLoadOutputs[0], ioState, returnLoadOutputs[1] });
1615 const auto pointsToGraph =
RunAndersen(rvsdgModule);
1618 const auto globalMemoryNode = pointsToGraph->getNodeForDelta(global);
1619 const auto externalMemoryNode = pointsToGraph->getExternalMemoryNode();
1620 const util::HashSet expectedMemoryNodes{ globalMemoryNode, externalMemoryNode };
1622 const auto & opaqueCallModRef = modRefSummary->GetSimpleNodeModRef(*opaqueCallNode);
1623 EXPECT_TRUE(
setsEqual(opaqueCallModRef, expectedMemoryNodes));
1626 TEST(RegionAwareModRefSummarizerTests, TestStatistics)
1628 using namespace jlm;
1648 EXPECT_EQ(statistics.GetMeasurementValue<uint64_t>(
"#RvsdgNodes"), 18u);
1649 EXPECT_EQ(statistics.GetMeasurementValue<uint64_t>(
"#RvsdgRegions"), 2u);
1650 EXPECT_EQ(statistics.GetMeasurementValue<uint64_t>(
"#PointsToGraphMemoryNodes"), 7u);
1651 EXPECT_EQ(statistics.GetMeasurementValue<uint64_t>(
"#SimpleAllocas"), 5u);
1652 EXPECT_EQ(statistics.GetMeasurementValue<uint64_t>(
"#NonReentrantAllocas"), 5u);
1653 EXPECT_EQ(statistics.GetMeasurementValue<uint64_t>(
"#CallGraphSccs"), 2u);
1655 EXPECT_TRUE(statistics.HasTimer(
"CallGraphTimer"));
1656 EXPECT_TRUE(statistics.HasTimer(
"AllocasDeadInSccsTimer"));
1657 EXPECT_TRUE(statistics.HasTimer(
"SimpleAllocasSetTimer"));
1658 EXPECT_TRUE(statistics.HasTimer(
"NonReentrantAllocaSetsTimer"));
1659 EXPECT_TRUE(statistics.HasTimer(
"CreateExternalModRefSetTimer"));
1660 EXPECT_TRUE(statistics.HasTimer(
"AnnotationTimer"));
1661 EXPECT_TRUE(statistics.HasTimer(
"SolvingTimer"));
static jlm::util::StatisticsCollector statisticsCollector
static bool setsEqual(const jlm::util::HashSet< jlm::llvm::aa::PointsToGraph::NodeIndex > &receivedMemoryNodes, const jlm::util::HashSet< jlm::llvm::aa::PointsToGraph::NodeIndex > &expectedMemoryNodes)
static std::unique_ptr< jlm::llvm::aa::PointsToGraph > RunAndersen(jlm::llvm::LlvmRvsdgModule &rvsdgModule)
TEST(RegionAwareModRefSummarizerTests, TestStore1)
static std::vector< rvsdg::Output * > create(std::shared_ptr< const rvsdg::Type > allocatedType, rvsdg::Output *count, const size_t alignment)
static std::shared_ptr< const ArrayType > Create(std::shared_ptr< const Type > type, size_t nelements)
static std::vector< rvsdg::Output * > Create(rvsdg::Output *function, std::shared_ptr< const rvsdg::FunctionType > functionType, const std::vector< rvsdg::Output * > &arguments)
rvsdg::SimpleNode * alloca_y
const rvsdg::SimpleNode & CallG() const noexcept
rvsdg::SimpleNode * alloca_z
jlm::rvsdg::LambdaNode * lambda_g
jlm::rvsdg::LambdaNode * lambda_f
rvsdg::SimpleNode * alloca_x
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
rvsdg::SimpleNode * malloc
static std::unique_ptr< DeltaOperation > Create(std::shared_ptr< const rvsdg::Type > type, const std::string &name, const Linkage &linkage, std::string section, bool constant, const size_t alignment)
jlm::rvsdg::DeltaNode * delta_f
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::DeltaNode * delta_d2
jlm::rvsdg::DeltaNode * delta_d1
EscapedMemoryTest1 class.
jlm::rvsdg::DeltaNode * DeltaB
jlm::rvsdg::LambdaNode * LambdaTest
EscapedMemoryTest2 class.
jlm::rvsdg::LambdaNode * CallExternalFunction2
rvsdg::SimpleNode * ExternalFunction1Call
rvsdg::SimpleNode * ReturnAddressMalloc
jlm::rvsdg::LambdaNode * CallExternalFunction1
rvsdg::SimpleNode * ExternalFunction2Call
jlm::rvsdg::LambdaNode * ReturnAddressFunction
rvsdg::SimpleNode * CallExternalFunction1Malloc
EscapedMemoryTest3 class.
rvsdg::SimpleNode * CallExternalFunction
jlm::rvsdg::LambdaNode * LambdaTest
jlm::rvsdg::LambdaNode * lambda
static std::shared_ptr< const IOStateType > Create()
jlm::rvsdg::LambdaNode * lambda_f1
jlm::rvsdg::LambdaNode * lambda_f2
jlm::rvsdg::GraphImport * import_d2
jlm::rvsdg::GraphImport * import_d1
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
rvsdg::SimpleNode & GetCallY() const noexcept
rvsdg::SimpleNode & GetTest2CallX() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaI() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaFour() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaTest() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaTest2() const noexcept
jlm::rvsdg::SimpleNode & GetAllocaPy() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaX() const noexcept
rvsdg::SimpleNode & GetIndirectCall() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaY() const noexcept
jlm::rvsdg::SimpleNode & GetAllocaPz() const noexcept
jlm::rvsdg::DeltaNode & GetDeltaG2() const noexcept
rvsdg::SimpleNode & GetTestCallX() const noexcept
jlm::rvsdg::DeltaNode & GetDeltaG1() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaThree() const noexcept
jlm::rvsdg::SimpleNode & GetAllocaPx() const noexcept
static rvsdg::Node & Create(rvsdg::Region ®ion, IntegerValueRepresentation representation)
static LlvmGraphImport & createFunctionImport(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::FunctionType > functionType, std::string name, Linkage linkage, CallingConvention callingConvention)
static std::unique_ptr< LlvmLambdaOperation > Create(std::shared_ptr< const jlm::rvsdg::FunctionType > type, std::string name, const jlm::llvm::Linkage &linkage, jlm::llvm::CallingConvention callingConvention, jlm::llvm::AttributeSet attributes)
const jlm::rvsdg::LambdaNode & Lambda() const noexcept
static std::unique_ptr< llvm::ThreeAddressCode > Create(const Variable *address, const Variable *state, std::shared_ptr< const rvsdg::Type > loadedType, size_t alignment)
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::LambdaNode * lambda
const jlm::rvsdg::DeltaNode & LocalArray() const noexcept
const jlm::rvsdg::DeltaNode & GlobalArray() const noexcept
const rvsdg::SimpleNode & CallF() const noexcept
const jlm::rvsdg::LambdaNode & LambdaF() const noexcept
const jlm::rvsdg::LambdaNode & LambdaG() const noexcept
static std::shared_ptr< const MemoryStateType > Create()
rvsdg::SimpleNode * alloca
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::rvsdg::LambdaNode & GetLambdaTest() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaA() const noexcept
jlm::rvsdg::SimpleNode & GetPdAlloca() const noexcept
rvsdg::SimpleNode & GetCallB() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaEight() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaD() const noexcept
rvsdg::SimpleNode & GetCallD() const noexcept
jlm::rvsdg::SimpleNode & GetPTestAlloca() const noexcept
rvsdg::SimpleNode & GetCallAFromTest() const noexcept
jlm::rvsdg::SimpleNode & GetPcAlloca() const noexcept
rvsdg::SimpleNode & GetCallC() const noexcept
rvsdg::SimpleNode & GetIndirectCall() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaI() const noexcept
rvsdg::SimpleNode & GetCallAFromD() const noexcept
jlm::rvsdg::SimpleNode & GetPaAlloca() const noexcept
rvsdg::SimpleNode & GetCallI() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaB() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaC() const noexcept
rvsdg::SimpleNode & GetCallAFromC() const noexcept
jlm::rvsdg::SimpleNode & GetPbAlloca() const noexcept
static std::shared_ptr< const PointerType > Create()
jlm::llvm::LlvmRvsdgModule & module()
static std::unique_ptr< llvm::ThreeAddressCode > Create(const Variable *address, const Variable *value, const Variable *state, size_t alignment)
rvsdg::SimpleNode * alloca_a
jlm::rvsdg::LambdaNode * lambda
rvsdg::SimpleNode * alloca_p
jlm::rvsdg::LambdaNode * lambda
rvsdg::SimpleNode * alloca_y
rvsdg::SimpleNode * alloca_x
rvsdg::SimpleNode * alloca_b
rvsdg::SimpleNode * alloca_a
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::ThetaNode * theta
static jlm::rvsdg::Output * Create(rvsdg::Region ®ion, std::shared_ptr< const jlm::rvsdg::Type > type)
std::unique_ptr< PointsToGraph > Analyze(const rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
static std::unique_ptr< ModRefSummary > Create(const rvsdg::RvsdgModule &rvsdgModule, const PointsToGraph &pointsToGraph, util::StatisticsCollector &statisticsCollector)
static std::shared_ptr< const BitType > Create(std::size_t nbits)
Creates bit type of specified width.
static DeltaNode * Create(rvsdg::Region *parent, std::unique_ptr< DeltaOperation > op)
util::graph::Graph & WriteGraphs(util::graph::Writer &writer, const Region ®ion, bool emitTypeGraph)
static std::shared_ptr< const FunctionType > Create(std::vector< std::shared_ptr< const jlm::rvsdg::Type >> argumentTypes, std::vector< std::shared_ptr< const jlm::rvsdg::Type >> resultTypes)
static GammaNode & Create(jlm::rvsdg::Output &predicate, size_t numAlternatives, std::vector< std::shared_ptr< const Type >> matchContentTypes)
EntryVar AddEntryVar(rvsdg::Output *origin)
Routes a variable into the gamma branches.
static GraphExport & Create(Output &origin, std::string name)
Region & GetRootRegion() const noexcept
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
static Output * Create(Output &predicate, const std::unordered_map< uint64_t, uint64_t > &mapping, const uint64_t defaultAlternative, const size_t numAlternatives)
NodeOutput * output(size_t index) const noexcept
rvsdg::Input & SingleUser() noexcept
NodeOutput * output(size_t index) const noexcept
static std::shared_ptr< const UnitType > Create()
StatisticsRange CollectedStatistics() const noexcept
size_t NumCollectedStatistics() const noexcept
@ RegionAwareModRefSummarizer
Global memory state passed between functions.