312TEST(RegionAwareModRefSummarizerTests, TestCall1)
321 auto allocaXMemoryNode = pointsToGraph.getNodeForAlloca(*test.
alloca_x);
322 auto allocaYMemoryNode = pointsToGraph.getNodeForAlloca(*test.
alloca_y);
323 auto allocaZMemoryNode = pointsToGraph.getNodeForAlloca(*test.
alloca_z);
329 auto & lambdaFEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_f);
332 { { allocaXMemoryNode, ModRefEffect::RefOnly },
333 { allocaYMemoryNode, ModRefEffect::RefOnly } }));
335 auto & lambdaFExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_f);
338 { { allocaXMemoryNode, ModRefEffect::RefOnly },
339 { allocaYMemoryNode, ModRefEffect::RefOnly } }));
346 auto & lambdaGEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_g);
348 assertSetContains(lambdaGEntryNodes, { { allocaZMemoryNode, ModRefEffect::RefOnly } }));
350 auto & lambdaGExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_g);
352 assertSetContains(lambdaGExitNodes, { { allocaZMemoryNode, ModRefEffect::RefOnly } }));
359 auto & lambdaHEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_h);
362 auto & callFNodes = modRefSummary.GetSimpleNodeModRef(test.
CallF());
365 { { allocaXMemoryNode, ModRefEffect::RefOnly },
366 { allocaYMemoryNode, ModRefEffect::RefOnly } }));
368 auto & callGNodes = modRefSummary.GetSimpleNodeModRef(test.
CallG());
369 ASSERT_TRUE(
assertSetContains(callGNodes, { { allocaZMemoryNode, ModRefEffect::RefOnly } }));
371 auto & lambdaHExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_h);
391 ValidateProvider(test, *modRefSummary, *pointsToGraph);
394TEST(RegionAwareModRefSummarizerTests, TestCall2)
403 auto mallocMemoryNode = pointsToGraph.getNodeForMalloc(*test.
malloc);
409 auto & lambdaCreateEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_create);
411 lambdaCreateEntryNodes,
412 { { mallocMemoryNode, ModRefEffect::RefOnly } }));
414 auto & lambdaCreateExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_create);
416 lambdaCreateExitNodes,
417 { { mallocMemoryNode, ModRefEffect::RefOnly } }));
424 auto & lambdaDestroyEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_destroy);
426 lambdaDestroyEntryNodes,
427 { { mallocMemoryNode, ModRefEffect::ModOnly } }));
429 auto & lambdaDestroyExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_destroy);
431 lambdaDestroyExitNodes,
432 { { mallocMemoryNode, ModRefEffect::ModOnly } }));
439 auto & lambdaTestEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.
lambda_test);
441 assertSetContains(lambdaTestEntryNodes, { { mallocMemoryNode, ModRefEffect::ModRef } }));
443 auto & callCreate1Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallCreate1());
445 assertSetContains(callCreate1Nodes, { { mallocMemoryNode, ModRefEffect::RefOnly } }));
447 auto & callCreate2Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallCreate2());
449 assertSetContains(callCreate2Nodes, { { mallocMemoryNode, ModRefEffect::RefOnly } }));
451 auto & callDestroy1Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallDestroy1());
453 assertSetContains(callDestroy1Nodes, { { mallocMemoryNode, ModRefEffect::ModOnly } }));
455 auto & callDestroy2Nodes = modRefSummary.GetSimpleNodeModRef(test.
CallDestroy2());
457 assertSetContains(callDestroy2Nodes, { { mallocMemoryNode, ModRefEffect::ModOnly } }));
459 auto & lambdaTestExitNodes = modRefSummary.GetLambdaExitModRef(*test.
lambda_test);
461 assertSetContains(lambdaTestExitNodes, { { mallocMemoryNode, ModRefEffect::ModRef } }));
480 ValidateProvider(test, *modRefSummary, *pointsToGraph);
564TEST(RegionAwareModRefSummarizerTests, TestIndirectCall2)
573 auto allocaPxMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetAllocaPx());
574 auto allocaPyMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetAllocaPy());
575 auto allocaPzMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetAllocaPz());
581 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaFour());
584 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaFour());
592 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaThree());
595 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaThree());
603 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaI());
606 auto & callNodes = modRefSummary.GetSimpleNodeModRef(test.
GetIndirectCall());
609 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaI());
617 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaX());
620 { { allocaPxMemoryNode, ModRefEffect::ModOnly },
621 { allocaPzMemoryNode, ModRefEffect::ModOnly } }));
623 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaX());
626 { { allocaPxMemoryNode, ModRefEffect::ModOnly },
627 { allocaPzMemoryNode, ModRefEffect::ModOnly } }));
634 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaY());
636 assertSetContains(lambdaEntryNodes, { { allocaPyMemoryNode, ModRefEffect::ModOnly } }));
638 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaY());
640 assertSetContains(lambdaExitNodes, { { allocaPyMemoryNode, ModRefEffect::ModOnly } }));
648 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaTest());
651 auto & callXNodes = modRefSummary.GetSimpleNodeModRef(test.
GetTestCallX());
652 ASSERT_TRUE(
assertSetContains(callXNodes, { { allocaPxMemoryNode, ModRefEffect::ModOnly } }));
654 auto & callYNodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallY());
655 ASSERT_TRUE(
assertSetContains(callYNodes, { { allocaPyMemoryNode, ModRefEffect::ModOnly } }));
657 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaTest());
665 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaTest2());
668 auto & callXNodes = modRefSummary.GetSimpleNodeModRef(test.
GetTest2CallX());
669 ASSERT_TRUE(
assertSetContains(callXNodes, { { allocaPzMemoryNode, ModRefEffect::ModOnly } }));
671 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaTest2());
691 ValidateProvider(test, *modRefSummary, *pointsToGraph);
1021TEST(RegionAwareModRefSummarizerTests, TestPhi2)
1030 auto pTestAllocaMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetPTestAlloca());
1031 auto paAllocaMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetPaAlloca());
1032 [[maybe_unused]]
auto pbAllocaMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetPbAlloca());
1033 auto pcAllocaMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetPcAlloca());
1034 auto pdAllocaMemoryNode = pointsToGraph.getNodeForAlloca(test.
GetPdAlloca());
1036 jlm::util::HashSet pTestAC({ pTestAllocaMemoryNode, paAllocaMemoryNode, pcAllocaMemoryNode });
1037 jlm::util::HashSet pTestBD({ pTestAllocaMemoryNode, pbAllocaMemoryNode, pdAllocaMemoryNode });
1038 jlm::util::HashSet pTestCD({ pTestAllocaMemoryNode, pcAllocaMemoryNode, pdAllocaMemoryNode });
1039 jlm::util::HashSet pTestAD({ pTestAllocaMemoryNode, paAllocaMemoryNode, pdAllocaMemoryNode });
1041 { pTestAllocaMemoryNode, paAllocaMemoryNode, pcAllocaMemoryNode, pdAllocaMemoryNode });
1047 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaEight());
1050 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaEight());
1058 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaI());
1061 auto & callNodes = modRefSummary.GetSimpleNodeModRef(test.
GetIndirectCall());
1064 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaI());
1072 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaA());
1076 auto & callBNodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallB());
1077 ASSERT_TRUE(
assertSetContains(callBNodes, { { paAllocaMemoryNode, ModRefEffect::ModOnly } }));
1079 auto & callDNodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallD());
1080 ASSERT_TRUE(
assertSetContains(callDNodes, { { paAllocaMemoryNode, ModRefEffect::ModOnly } }));
1082 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaA());
1091 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaB());
1093 assertSetContains(lambdaEntryNodes, { { paAllocaMemoryNode, ModRefEffect::ModOnly } }));
1095 auto & callINodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallI());
1098 auto & callCNodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallC());
1099 ASSERT_TRUE(
assertSetContains(callCNodes, { { pbAllocaMemoryNode, ModRefEffect::ModRef } }));
1101 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaB());
1103 assertSetContains(lambdaExitNodes, { { paAllocaMemoryNode, ModRefEffect::ModOnly } }));
1110 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaC());
1112 assertSetContains(lambdaEntryNodes, { { pbAllocaMemoryNode, ModRefEffect::ModRef } }));
1114 auto & callNodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallAFromC());
1115 ASSERT_TRUE(
assertSetContains(callNodes, { { pcAllocaMemoryNode, ModRefEffect::ModOnly } }));
1117 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaC());
1119 assertSetContains(lambdaExitNodes, { { pbAllocaMemoryNode, ModRefEffect::ModRef } }));
1126 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaD());
1128 assertSetContains(lambdaEntryNodes, { { paAllocaMemoryNode, ModRefEffect::ModOnly } }));
1130 auto & callNodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallAFromD());
1131 ASSERT_TRUE(
assertSetContains(callNodes, { { pdAllocaMemoryNode, ModRefEffect::ModOnly } }));
1133 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaD());
1135 assertSetContains(lambdaExitNodes, { { paAllocaMemoryNode, ModRefEffect::ModOnly } }));
1142 auto & lambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.
GetLambdaTest());
1145 auto & callNodes = modRefSummary.GetSimpleNodeModRef(test.
GetCallAFromTest());
1147 assertSetContains(callNodes, { { pTestAllocaMemoryNode, ModRefEffect::ModOnly } }));
1149 auto & lambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.
GetLambdaTest());
1163 auto modRefSummary =
1169 ValidateProvider(test, *modRefSummary, *pointsToGraph);
1442TEST(RegionAwareModRefSummarizerTests, testSetjmpHandling)
1444 using namespace jlm;
1480 auto & graph = rvsdgModule.
Rvsdg();
1483 const auto ioStateType = IOStateType::Create();
1484 const auto memoryStateType = MemoryStateType::Create();
1485 const auto pointerType = PointerType::Create();
1486 const auto int32Type = rvsdg::BitType::Create(32);
1488 const auto jmpBufType = ArrayType::Create(int32Type, 34);
1489 const auto unitType = rvsdg::UnitType::Create();
1491 const auto unitFunctionType = rvsdg::FunctionType::Create(
1492 { ioStateType, memoryStateType },
1493 { ioStateType, memoryStateType });
1495 const auto setjmpFunctionType = rvsdg::FunctionType::Create(
1496 { pointerType, ioStateType, memoryStateType },
1497 { int32Type, ioStateType, memoryStateType });
1499 const auto gFunctionType = rvsdg::FunctionType::Create(
1500 { pointerType, ioStateType, memoryStateType },
1501 { ioStateType, memoryStateType });
1503 const auto fFunctionType = rvsdg::FunctionType::Create(
1504 { ioStateType, memoryStateType },
1505 { int32Type, ioStateType, memoryStateType });
1507 auto & opaqueImport = LlvmGraphImport::createFunctionImport(
1511 Linkage::externalLinkage,
1512 CallingConvention::Default);
1514 auto & setjmpImport = LlvmGraphImport::createFunctionImport(
1518 Linkage::externalLinkage,
1519 CallingConvention::Default);
1521 auto & bufGlobal = *rvsdg::DeltaNode::Create(
1523 LlvmDeltaOperation::Create(jmpBufType,
"buf", Linkage::externalLinkage,
"",
false, 4));
1524 bufGlobal.finalize(UndefValueOperation::Create(*bufGlobal.subregion(), jmpBufType));
1531 auto & hLambdaNode = *rvsdg::LambdaNode::Create(
1533 LlvmLambdaOperation::Create(unitFunctionType,
"h", Linkage::internalLinkage));
1535 const auto arguments = hLambdaNode.GetFunctionArguments();
1539 const auto opaqueCtxVar = hLambdaNode.AddContextVar(opaqueImport);
1542 CallOperation::Create(opaqueCtxVar.inner, unitFunctionType, { ioState, memoryState });
1543 callOpaqueNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*call[0]);
1545 memoryState = call[1];
1547 hLambdaNode.finalize({ ioState, memoryState });
1550 auto & kLambdaNode = *rvsdg::LambdaNode::Create(
1552 LlvmLambdaOperation::Create(unitFunctionType,
"k", Linkage::internalLinkage));
1554 const auto arguments = kLambdaNode.GetFunctionArguments();
1558 auto & gLambdaNode = *rvsdg::LambdaNode::Create(
1560 LlvmLambdaOperation::Create(gFunctionType,
"g", Linkage::internalLinkage));
1562 const auto arguments = gLambdaNode.GetFunctionArguments();
1567 const auto setjmpCtxVar = gLambdaNode.AddContextVar(setjmpImport);
1568 const auto bufCtxVar = gLambdaNode.AddContextVar(bufGlobal.output());
1569 const auto hCtxVar = gLambdaNode.AddContextVar(*hLambdaNode.output());
1570 const auto kCtxVar = gLambdaNode.AddContextVar(*kLambdaNode.output());
1572 const auto setjmpCall = CallOperation::Create(
1575 { bufCtxVar.inner, ioState, memoryState });
1576 auto & setjmpResult = *setjmpCall[0];
1577 ioState = setjmpCall[1];
1578 memoryState = setjmpCall[2];
1580 auto & matchOutput = *rvsdg::MatchOperation::Create(setjmpResult, { { 0, 0 } }, 1, 2);
1581 auto & gammaNode = rvsdg::GammaNode::Create(matchOutput, 2, { unitType, unitType });
1582 auto pEntryVar = gammaNode.AddEntryVar(p);
1583 auto hEntryVar = gammaNode.AddEntryVar(hCtxVar.inner);
1584 auto kEntryVar = gammaNode.AddEntryVar(kCtxVar.inner);
1585 auto ioStateEntryVar = gammaNode.AddEntryVar(ioState);
1586 auto memoryStateEntryVar = gammaNode.AddEntryVar(memoryState);
1587 auto & elseRegion = *gammaNode.subregion(0);
1588 const auto constant10 = IntegerConstantOperation::Create(elseRegion, 32, 10).output(0);
1589 const auto storeOutputs = StoreNonVolatileOperation::Create(
1590 pEntryVar.branchArgument[0],
1592 { memoryStateEntryVar.branchArgument[0] },
1595 const auto hCall = CallOperation::Create(
1596 hEntryVar.branchArgument[0],
1598 { ioStateEntryVar.branchArgument[0], storeOutputs[0] });
1599 callHNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*hCall[0]);
1601 const auto kCall = CallOperation::Create(
1602 kEntryVar.branchArgument[0],
1604 { hCall[0], hCall[1] });
1605 callKNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*kCall[0]);
1607 ioState = gammaNode.AddExitVar({ kCall[0], ioStateEntryVar.branchArgument[1] }).output;
1608 memoryState = gammaNode.AddExitVar({ kCall[1], memoryStateEntryVar.branchArgument[1] }).output;
1610 gLambdaNode.finalize({ ioState, memoryState });
1613 auto & fLambdaNode = *rvsdg::LambdaNode::Create(
1615 LlvmLambdaOperation::Create(fFunctionType,
"f", Linkage::externalLinkage));
1617 const auto arguments = fLambdaNode.GetFunctionArguments();
1619 const auto memoryStateIn =
arguments.at(1);
1621 const auto gCtxVar = fLambdaNode.AddContextVar(*gLambdaNode.output());
1623 const auto constant1 =
1624 IntegerConstantOperation::Create(*fLambdaNode.subregion(), 32, 1).output(0);
1625 const auto aAlloca = AllocaOperation::create(int32Type, constant1, 4);
1626 allocaNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*aAlloca[0]);
1628 auto & memoryStateJoin =
1629 rvsdg::CreateOpNode<MemoryStateJoinOperation>({ memoryStateIn, aAlloca[1] }, 2);
1631 const auto gCall = CallOperation::Create(
1634 { aAlloca[0], ioStateIn, memoryStateJoin.output(0) });
1636 auto loadOutputs = LoadNonVolatileOperation::Create(aAlloca[0], { gCall[1] }, int32Type, 4);
1638 fLambdaNode.finalize({ loadOutputs[0], gCall[0], loadOutputs[1] });
1641 rvsdg::GraphExport::Create(*fLambdaNode.output(),
"f");
1652 const auto modRefSummary = aa::RegionAwareModRefSummarizer::Create(rvsdgModule, *ptg, collector);
1655 EXPECT_NE(callOpaqueNode,
nullptr);
1656 EXPECT_NE(callHNode,
nullptr);
1657 EXPECT_NE(callKNode,
nullptr);
1658 EXPECT_NE(allocaNode,
nullptr);
1660 const auto allocaPtgNode = ptg->getNodeForAlloca(*allocaNode);
1663 const auto & callHModRef = modRefSummary->GetSimpleNodeModRef(*callHNode);
1664 EXPECT_TRUE(callHModRef.getModRefNodes().at(allocaPtgNode));
1667 const auto & callKModRef = modRefSummary->GetSimpleNodeModRef(*callKNode);
1668 EXPECT_FALSE(callKModRef.getModRefNodes().count(allocaPtgNode));
1672 const auto & callOpaqueModRef = modRefSummary->GetSimpleNodeModRef(*callOpaqueNode);
1673 EXPECT_EQ(callOpaqueModRef.getModRefNodes().size(), 1u);
1676 auto & statistic = *collector.CollectedStatistics().begin();
1678 EXPECT_EQ(statistic.GetMeasurementValue<uint64_t>(
"#CallGraphSccs"), 2u);
1680 EXPECT_EQ(statistic.GetMeasurementValue<uint64_t>(
"#FunctionsCallingSetjmp"), 1u);
1683TEST(RegionAwareModRefSummarizerTests, TestEscapedFunction)
1685 using namespace jlm;
1705 auto & graph = rvsdgModule.
Rvsdg();
1708 const auto ioStateType = IOStateType::Create();
1709 const auto memoryStateType = MemoryStateType::Create();
1710 const auto int32Type = rvsdg::BitType::Create(32);
1712 const auto opaqueFunctionType = rvsdg::FunctionType::Create(
1713 { ioStateType, memoryStateType },
1714 { ioStateType, memoryStateType });
1716 const auto fFunctionType = rvsdg::FunctionType::Create(
1717 { ioStateType, memoryStateType },
1718 { int32Type, ioStateType, memoryStateType });
1720 auto & opaqueImport = LlvmGraphImport::createFunctionImport(
1724 Linkage::externalLinkage,
1725 CallingConvention::Default);
1727 auto & global = *rvsdg::DeltaNode::Create(
1729 LlvmDeltaOperation::Create(int32Type,
"global", Linkage::internalLinkage,
"",
false, 4));
1730 global.finalize(IntegerConstantOperation::Create(*global.subregion(), 32, 0).output(0));
1733 auto & fLambdaNode = *rvsdg::LambdaNode::Create(
1735 LlvmLambdaOperation::Create(fFunctionType,
"f", Linkage::externalLinkage));
1737 const auto arguments = fLambdaNode.GetFunctionArguments();
1741 const auto globalCtxVar = fLambdaNode.AddContextVar(global.output());
1742 const auto opaqueCtxVar = fLambdaNode.AddContextVar(opaqueImport);
1744 const auto loadOutputs =
1745 LoadNonVolatileOperation::Create(globalCtxVar.inner, { memoryState }, int32Type, 4);
1746 const auto one = IntegerConstantOperation::Create(*fLambdaNode.subregion(), 32, 1).output(0);
1747 const auto incrementedGlobal =
1748 rvsdg::CreateOpNode<IntegerAddOperation>({ loadOutputs[0], one }, 32).output(0);
1749 const auto storeOutputs = StoreNonVolatileOperation::Create(
1755 const auto opaqueCall =
1756 CallOperation::Create(opaqueCtxVar.inner, opaqueFunctionType, { ioState, storeOutputs[0] });
1757 opaqueCallNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*opaqueCall[0]);
1758 ioState = opaqueCall[0];
1759 memoryState = opaqueCall[1];
1761 const auto returnLoadOutputs =
1762 LoadNonVolatileOperation::Create(globalCtxVar.inner, { memoryState }, int32Type, 4);
1764 fLambdaNode.finalize({ returnLoadOutputs[0], ioState, returnLoadOutputs[1] });
1767 rvsdg::GraphExport::Create(*fLambdaNode.output(),
"f");
1769 const auto pointsToGraph =
RunAndersen(rvsdgModule);
1770 const auto modRefSummary = aa::RegionAwareModRefSummarizer::Create(rvsdgModule, *pointsToGraph);
1772 const auto globalMemoryNode = pointsToGraph->getNodeForDelta(global);
1773 const auto externalMemoryNode = pointsToGraph->getExternalMemoryNode();
1774 const util::HashSet expectedMemoryNodes{ globalMemoryNode, externalMemoryNode };
1776 const auto & opaqueCallModRef = modRefSummary->GetSimpleNodeModRef(*opaqueCallNode);