25std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
35 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
36 auto graph = &
module->Rvsdg();
50 std::vector<jlm::rvsdg::Output *>{ d[1], fct->GetFunctionArguments()[0] });
62 fct->finalize({ c_amp_d[0] });
64 GraphExport::Create(*fct->output(),
"f");
80std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
90 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
91 auto graph = &
module->Rvsdg();
106 std::vector<jlm::rvsdg::Output *>{ a[1], fct->GetFunctionArguments()[0] });
121 fct->finalize({ p_amp_y[0] });
123 GraphExport::Create(*fct->output(),
"f");
140std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
148 auto intType = BitType::Create(32);
153 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath("LoadTest1.c"), "", "");
154 auto graph = &
module->Rvsdg();
161 fct->GetFunctionArguments()[0],
162 { fct->GetFunctionArguments()[1] },
169 GraphExport::Create(*fct->output(),
"f");
181std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
192 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
193 auto graph = &
module->Rvsdg();
208 std::vector<jlm::rvsdg::Output *>{ a[1], fct->GetFunctionArguments()[0] });
226 fct->finalize({ y_star_p[0] });
228 GraphExport::Create(*fct->output(),
"f");
248std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
261 auto & rvsdg = rvsdgModule->Rvsdg();
264 rvsdg.GetRootRegion(),
285std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
291 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
292 auto graph = &
module->Rvsdg();
313 { fct->GetFunctionArguments()[1] },
323 fct->finalize({ sum, ldy[1] });
325 GraphExport::Create(*fct->output(),
"f");
338std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
347 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
348 auto graph = &
module->Rvsdg();
356 fct->finalize({ cast });
358 GraphExport::Create(*fct->output(),
"f");
367std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
373 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
374 auto graph = &
module->Rvsdg();
376 auto setupBit2PtrFunction = [&]()
387 auto valueArgument = lambda->GetFunctionArguments()[0];
388 auto iOStateArgument = lambda->GetFunctionArguments()[1];
389 auto memoryStateArgument = lambda->GetFunctionArguments()[2];
393 lambda->finalize({ cast, iOStateArgument, memoryStateArgument });
409 auto valueArgument = lambda->GetFunctionArguments()[0];
410 auto iOStateArgument = lambda->GetFunctionArguments()[1];
411 auto memoryStateArgument = lambda->GetFunctionArguments()[2];
413 auto cvbits2ptr = lambda->AddContextVar(*b2p).inner;
418 { valueArgument, iOStateArgument, memoryStateArgument });
422 GraphExport::Create(*lambda->output(),
"testfct");
424 return std::make_tuple(lambda, &call);
427 auto [lambdaBits2Ptr, bitsToPtrNode] = setupBit2PtrFunction();
428 auto [lambdaTest, callNode] = setupTestFunction(lambdaBits2Ptr->output());
441std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
452 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
453 auto graph = &
module->Rvsdg();
459 auto constantPointerNullResult =
462 fct->GetFunctionArguments()[0],
463 constantPointerNullResult,
464 { fct->GetFunctionArguments()[1] },
467 fct->finalize({ st[0] });
469 GraphExport::Create(*fct->output(),
"f");
480std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
486 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
487 auto graph = &
module->Rvsdg();
504 auto pointerArgument1 = lambda->GetFunctionArguments()[0];
505 auto pointerArgument2 = lambda->GetFunctionArguments()[1];
506 auto iOStateArgument = lambda->GetFunctionArguments()[2];
507 auto memoryStateArgument = lambda->GetFunctionArguments()[3];
511 { memoryStateArgument },
522 lambda->finalize({ sum, iOStateArgument, ld2[1] });
542 auto pointerArgument1 = lambda->GetFunctionArguments()[0];
543 auto pointerArgument2 = lambda->GetFunctionArguments()[1];
544 auto iOStateArgument = lambda->GetFunctionArguments()[2];
545 auto memoryStateArgument = lambda->GetFunctionArguments()[3];
549 { memoryStateArgument },
560 lambda->finalize({ diff, iOStateArgument, ld2[1] });
576 auto iOStateArgument = lambda->GetFunctionArguments()[0];
577 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
579 auto cvf = lambda->AddContextVar(*f->
output()).inner;
580 auto cvg = lambda->AddContextVar(*g->output()).inner;
589 std::vector<jlm::rvsdg::Output *>({ x[1], memoryStateArgument }));
604 { x[0], y[0], iOStateArgument, stz[0] });
607 g->GetOperation().Type(),
610 &CallOperation::GetIOStateOutput(callF),
611 &CallOperation::GetMemoryStateOutput(callF) });
615 lambda->finalize({ sum,
618 GraphExport::Create(*lambda->output(),
"h");
624 return std::make_tuple(lambda, allocaX, allocaY, allocaZ, &callF, &callG);
627 auto lambdaF = SetupF();
628 auto lambdaG = SetupG();
629 auto [lambdaH, allocaX, allocaY, allocaZ, callF, callG] = SetupH(lambdaF, lambdaG);
648std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
654 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
655 auto graph = &
module->Rvsdg();
657 auto SetupCreate = [&]()
669 auto valueArgument = lambda->GetFunctionArguments()[0];
670 auto iOStateArgument = lambda->GetFunctionArguments()[1];
671 auto memoryStateArgument = lambda->GetFunctionArguments()[2];
683 return std::make_tuple(lambda, &mallocNode);
686 auto SetupDestroy = [&]()
698 auto pointerArgument = lambda->GetFunctionArguments()[0];
699 auto iOStateArgument = lambda->GetFunctionArguments()[1];
700 auto memoryStateArgument = lambda->GetFunctionArguments()[2];
708 return std::make_tuple(lambda, &freeNode);
722 auto iOStateArgument = lambda->GetFunctionArguments()[0];
723 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
725 auto create_cv = lambda->AddContextVar(*lambdaCreate->
output()).inner;
726 auto destroy_cv = lambda->AddContextVar(*lambdaDestroy->output()).inner;
734 { six, iOStateArgument, memoryStateArgument });
739 &CallOperation::GetIOStateOutput(create1),
740 &CallOperation::GetMemoryStateOutput(create1) });
744 lambdaDestroy->GetOperation().Type(),
746 &CallOperation::GetIOStateOutput(create2),
747 &CallOperation::GetMemoryStateOutput(create2) });
750 lambdaDestroy->GetOperation().Type(),
752 &CallOperation::GetIOStateOutput(destroy1),
753 &CallOperation::GetMemoryStateOutput(destroy1) });
757 GraphExport::Create(*lambda->output(),
"test");
759 return std::make_tuple(lambda, &create1, &create2, &destroy1, &destroy2);
762 auto [lambdaCreate, mallocNode] = SetupCreate();
763 auto [lambdaDestroy, freeNode] = SetupDestroy();
764 auto [lambdaTest, callCreate1, callCreate2, callDestroy1, callDestroy2] =
765 SetupTest(lambdaCreate, lambdaDestroy);
774 this->
malloc = mallocNode;
775 this->
free = freeNode;
786std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
799 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
800 auto graph = &
module->Rvsdg();
802 auto SetupConstantFunction = [&](ssize_t n,
const std::string & name)
807 auto iOStateArgument = lambda->GetFunctionArguments()[0];
808 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
812 return lambda->finalize({ constant, iOStateArgument, memoryStateArgument });
815 auto SetupIndirectCallFunction = [&]()
826 auto pointerArgument = lambda->GetFunctionArguments()[0];
827 auto functionOfPointer =
830 auto iOStateArgument = lambda->GetFunctionArguments()[1];
831 auto memoryStateArgument = lambda->GetFunctionArguments()[2];
835 constantFunctionType,
836 { iOStateArgument, memoryStateArgument });
838 auto lambdaOutput = lambda->finalize(outputs(&call));
840 return std::make_tuple(lambdaOutput, &call);
843 auto SetupTestFunction =
853 auto iOStateArgument = lambda->GetFunctionArguments()[0];
854 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
856 auto fctindcall_cv = lambda->AddContextVar(*fctindcall).inner;
857 auto fctfour_cv = lambda->AddContextVar(*fctfour).inner;
858 auto fctthree_cv = lambda->AddContextVar(*fctthree).inner;
863 { fctfour_cv, iOStateArgument, memoryStateArgument });
868 &CallOperation::GetIOStateOutput(call_four),
869 &CallOperation::GetMemoryStateOutput(call_four) });
874 auto lambdaOutput = lambda->finalize({
add,
877 GraphExport::Create(*lambda->output(),
"test");
879 return std::make_tuple(lambdaOutput, &call_three, &call_four);
882 auto fctfour = SetupConstantFunction(4,
"four");
883 auto fctthree = SetupConstantFunction(3,
"three");
884 auto [fctindcall, callIndirectFunction] = SetupIndirectCallFunction();
885 auto [fcttest, callFunctionThree, callFunctionFour] = SetupTestFunction(
905std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
918 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
919 auto graph = &
module->Rvsdg();
935 return &delta->finalize(constant);
952 return &delta->finalize(constant);
955 auto SetupConstantFunction = [&](ssize_t n,
const std::string & name)
960 auto iOStateArgument = lambda->GetFunctionArguments()[0];
961 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
965 return lambda->finalize({ constant, iOStateArgument, memoryStateArgument });
980 auto pointerArgument = lambda->GetFunctionArguments()[0];
981 auto iOStateArgument = lambda->GetFunctionArguments()[1];
982 auto memoryStateArgument = lambda->GetFunctionArguments()[2];
987 constantFunctionType,
988 { iOStateArgument, memoryStateArgument });
990 auto lambdaOutput = lambda->finalize(outputs(&call));
992 return std::make_tuple(lambdaOutput, &call);
995 auto SetupIndirectCallFunction = [&](ssize_t n,
996 const std::string & name,
1009 auto pointerArgument = lambda->GetFunctionArguments()[0];
1010 auto iOStateArgument = lambda->GetFunctionArguments()[1];
1011 auto memoryStateArgument = lambda->GetFunctionArguments()[2];
1013 auto functionICv = lambda->AddContextVar(functionI).inner;
1014 auto argumentFunctionCv = lambda->AddContextVar(argumentFunction).inner;
1016 { argumentFunctionCv },
1017 constantFunctionType)
1027 { argumentFunctionPtr, iOStateArgument, storeNode[0] });
1029 auto lambdaOutput = lambda->finalize(outputs(&call));
1031 return std::make_tuple(lambdaOutput, &call);
1046 auto iOStateArgument = lambda->GetFunctionArguments()[0];
1047 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
1049 auto functionXCv = lambda->AddContextVar(functionX).inner;
1050 auto functionYCv = lambda->AddContextVar(functionY).inner;
1051 auto globalG1Cv = lambda->AddContextVar(globalG1).inner;
1052 auto globalG2Cv = lambda->AddContextVar(globalG2).inner;
1060 std::vector<jlm::rvsdg::Output *>{ pxAlloca[1], memoryStateArgument });
1062 std::vector<jlm::rvsdg::Output *>({ pyAlloca[1], pxMerge }));
1067 { pxAlloca[0], iOStateArgument, pyMerge });
1091 auto lambdaOutput = lambda->finalize({ sum,
1094 GraphExport::Create(*lambdaOutput,
"test");
1096 return std::make_tuple(
1100 jlm::util::assertedCast<rvsdg::SimpleNode>(
1102 jlm::util::assertedCast<rvsdg::SimpleNode>(
1115 auto iOStateArgument = lambda->GetFunctionArguments()[0];
1116 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
1122 std::vector<jlm::rvsdg::Output *>{ pzAlloca[1], memoryStateArgument });
1124 auto functionXCv = lambda->AddContextVar(functionX).inner;
1129 { pzAlloca[0], iOStateArgument, pzMerge });
1131 auto lambdaOutput = lambda->finalize(outputs(&callX));
1132 GraphExport::Create(*lambdaOutput,
"test2");
1134 return std::make_tuple(
1137 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
1141 auto deltaG1 = SetupG1();
1142 auto deltaG2 = SetupG2();
1143 auto lambdaThree = SetupConstantFunction(3,
"three");
1144 auto lambdaFour = SetupConstantFunction(4,
"four");
1145 auto [lambdaI, indirectCall] = SetupI();
1146 auto [lambdaX, callIWithThree] = SetupIndirectCallFunction(5,
"x", *lambdaI, *lambdaThree);
1147 auto [lambdaY, callIWithFour] = SetupIndirectCallFunction(6,
"y", *lambdaI, *lambdaFour);
1148 auto [lambdaTest, testCallX, callY, allocaPx, allocaPy] =
1149 SetupTestFunction(*lambdaX, *lambdaY, *deltaG1, *deltaG2);
1150 auto [lambdaTest2, test2CallX, allocaPz] = SetupTest2Function(*lambdaX);
1179std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1186 auto rvsdg = &rvsdgModule->Rvsdg();
1198 auto SetupFunctionGDeclaration = [&]()
1221 rvsdg->GetRootRegion(),
1223 auto pathArgument = lambda->GetFunctionArguments()[0];
1224 auto modeArgument = lambda->GetFunctionArguments()[1];
1225 auto iOStateArgument = lambda->GetFunctionArguments()[2];
1226 auto memoryStateArgument = lambda->GetFunctionArguments()[3];
1228 auto functionGCv = lambda->AddContextVar(*functionG).inner;
1236 std::vector<jlm::rvsdg::Output *>{ allocaPath[1], memoryStateArgument });
1238 std::vector<jlm::rvsdg::Output *>({ allocaMode[1], mergePath }));
1252 { loadPath[0], loadMode[0], iOStateArgument, loadMode[1] });
1254 lambda->finalize(outputs(&callG));
1255 GraphExport::Create(*lambda->output(),
"f");
1257 return std::make_tuple(lambda, &callG);
1269std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1275 auto & rvsdg = rvsdgModule->Rvsdg();
1309 lambdaLlvmLifetimeStartType,
1310 "llvm.lifetime.start.p0",
1315 lambdaLlvmLifetimeEndType,
1316 "llvm.lifetime.end.p0",
1328 rvsdg.GetRootRegion(),
1341 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
1344 llvmLifetimeStartArgument,
1345 lambdaLlvmLifetimeStartType,
1346 { twentyFour, allocaResults[0], iOStateArgument, memoryState });
1374 auto storeResults1 =
1379 auto storeResults2 =
1383 llvmLifetimeEndArgument,
1384 lambdaLlvmLifetimeEndType,
1388 storeResults2[0] });
1395std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1412 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
1413 auto graph = &
module->Rvsdg();
1421 auto & predicateNode = MatchOperation::CreateNode(*biteq, { { 0, 1 } }, 0, 2);
1423 auto gammanode = GammaNode::create(predicateNode.output(0), 2);
1424 auto p1ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[1]);
1425 auto p2ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[2]);
1426 auto p3ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[3]);
1427 auto p4ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[4]);
1429 auto tmp1 = gammanode->AddExitVar({ p1ev.branchArgument[0], p3ev.branchArgument[1] });
1430 auto tmp2 = gammanode->AddExitVar({ p2ev.branchArgument[0], p4ev.branchArgument[1] });
1434 { fct->GetFunctionArguments()[5] },
1441 fct->finalize({ sum, ld2[1] });
1443 GraphExport::Create(*fct->output(),
"f");
1449 this->
gamma = gammanode;
1454std::unique_ptr<llvm::LlvmRvsdgModule>
1461 auto rvsdg = &rvsdgModule->Rvsdg();
1463 auto SetupLambdaF = [&]()
1473 auto gammaInputX = gammaNode->AddEntryVar(xAddress);
1474 auto gammaInputY = gammaNode->AddEntryVar(yAddress);
1475 auto gammaInputZ = gammaNode->AddEntryVar(zAddress);
1476 auto gammaInputMemoryState = gammaNode->AddEntryVar(memoryState);
1480 gammaInputX.branchArgument[0],
1481 { gammaInputMemoryState.branchArgument[0] },
1487 gammaInputZ.branchArgument[0],
1489 { loadXResults[1] },
1494 gammaInputY.branchArgument[1],
1495 { gammaInputMemoryState.branchArgument[1] },
1501 gammaInputZ.branchArgument[1],
1503 { loadYResults[1] },
1507 auto gammaOutputA = gammaNode->AddExitVar({ loadXResults[0], loadYResults[0] });
1508 auto gammaOutputMemoryState =
1509 gammaNode->AddExitVar({ storeZRegion0Results[0], storeZRegion1Results[0] });
1511 return std::make_tuple(gammaOutputA.output, gammaOutputMemoryState.output);
1526 rvsdg->GetRootRegion(),
1528 auto cArgument = lambda->GetFunctionArguments()[0];
1529 auto xArgument = lambda->GetFunctionArguments()[1];
1530 auto yArgument = lambda->GetFunctionArguments()[2];
1531 auto iOStateArgument = lambda->GetFunctionArguments()[3];
1532 auto memoryStateArgument = lambda->GetFunctionArguments()[4];
1539 std::vector<jlm::rvsdg::Output *>{ allocaZResults[1], memoryStateArgument });
1542 auto storeZResults =
1547 auto & predicateNode = MatchOperation::CreateNode(*intEq.output(0), { { 0, 1 } }, 0, 2);
1549 auto [gammaOutputA, gammaOutputMemoryState] =
1550 SetupGamma(predicateNode.output(0), xArgument, yArgument, allocaZResults[0], memoryState);
1554 { gammaOutputMemoryState },
1560 lambda->finalize({ sum, iOStateArgument, loadZResults[1] });
1562 return std::make_tuple(
1572 const char * functionName)
1582 rvsdg->GetRootRegion(),
1584 auto iOStateArgument = lambda->GetFunctionArguments()[0];
1585 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
1586 auto lambdaFArgument = lambda->AddContextVar(lambdaF).inner;
1594 std::vector<jlm::rvsdg::Output *>{ allocaXResults[1], memoryStateArgument });
1596 std::vector<jlm::rvsdg::Output *>({ allocaYResults[1], memoryState }));
1603 auto storeXResults =
1606 auto storeYResults =
1612 { predicate, allocaXResults[0], allocaYResults[0], iOStateArgument, storeYResults[0] });
1614 lambda->finalize(outputs(&call));
1615 GraphExport::Create(*lambda->output(), functionName);
1617 return std::make_tuple(
1624 auto [lambdaF, gammaNode, allocaZ] = SetupLambdaF();
1625 auto [lambdaG, callFromG, allocaXFromG, allocaYFromG] = SetupLambdaGH(*lambdaF, 0, 1, 2,
"g");
1626 auto [lambdaH, callFromH, allocaXFromH, allocaYFromH] = SetupLambdaGH(*lambdaF, 1, 3, 4,
"h");
1633 this->Gamma_ = gammaNode;
1635 this->CallFromG_ = callFromG;
1636 this->CallFromH_ = callFromH;
1638 this->AllocaXFromG_ = allocaXFromG;
1639 this->AllocaYFromG_ = allocaYFromG;
1640 this->AllocaXFromH_ = allocaXFromH;
1641 this->AllocaYFromH_ = allocaYFromH;
1642 this->AllocaZ_ = allocaZ;
1647std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1648ThetaTest::SetupRvsdg()
1653 auto mt = MemoryStateType::Create();
1654 auto pointerType = PointerType::Create();
1657 PointerType::Create(),
1659 MemoryStateType::Create() },
1660 { MemoryStateType::Create() });
1662 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
1663 auto graph = &
module->Rvsdg();
1666 graph->GetRootRegion(),
1669 auto zero = IntegerConstantOperation::Create(*fct->subregion(), { 32, 0 }).output(0);
1673 auto n = thetanode->AddLoopVar(zero);
1674 auto l = thetanode->AddLoopVar(fct->GetFunctionArguments()[0]);
1675 auto a = thetanode->AddLoopVar(fct->GetFunctionArguments()[1]);
1676 auto c = thetanode->AddLoopVar(fct->GetFunctionArguments()[2]);
1677 auto s = thetanode->AddLoopVar(fct->GetFunctionArguments()[3]);
1679 auto gepnode = GetElementPtrOperation::create(a.pre, { n.pre }, BitType::Create(32));
1680 auto store = StoreNonVolatileOperation::Create(gepnode, c.pre, { s.pre }, 4);
1682 auto one = IntegerConstantOperation::Create(*thetanode->subregion(), { 32, 1 }).output(0);
1683 auto sum = IntegerAddOperation::createNode(32, *n.pre, *
one).output(0);
1684 auto cmp = IntegerUltOperation::createNode(32, *sum, *l.pre).output(0);
1685 auto & predicateNode = MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);
1687 n.post->divert_to(sum);
1688 s.post->divert_to(store[0]);
1689 thetanode->set_predicate(predicateNode.output(0));
1691 fct->finalize({ s.output });
1692 GraphExport::Create(*fct->output(),
"f");
1698 this->theta = thetanode;
1704std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1705DeltaTest1::SetupRvsdg()
1710 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
1711 auto graph = &
module->Rvsdg();
1713 auto SetupGlobalF = [&]()
1716 &graph->GetRootRegion(),
1717 LlvmDeltaOperation::Create(
1720 Linkage::externalLinkage,
1725 auto constant = IntegerConstantOperation::Create(*dfNode->subregion(), { 32, 0 }).output(0);
1727 return &dfNode->finalize(constant);
1730 auto SetupFunctionG = [&]()
1732 auto pt = PointerType::Create();
1733 auto iOStateType = IOStateType::Create();
1734 auto memoryStateType = MemoryStateType::Create();
1736 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() },
1740 graph->GetRootRegion(),
1742 auto pointerArgument = lambda->GetFunctionArguments()[0];
1743 auto iOStateArgument = lambda->GetFunctionArguments()[1];
1744 auto memoryStateArgument = lambda->GetFunctionArguments()[2];
1746 auto ld = LoadNonVolatileOperation::Create(
1748 { memoryStateArgument },
1752 return lambda->finalize({ ld[0], iOStateArgument, ld[1] });
1757 auto iOStateType = IOStateType::Create();
1758 auto memoryStateType = MemoryStateType::Create();
1760 { IOStateType::Create(), MemoryStateType::Create() },
1764 graph->GetRootRegion(),
1766 auto iOStateArgument = lambda->GetFunctionArguments()[0];
1767 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
1769 auto cvf = lambda->AddContextVar(*f).inner;
1770 auto cvg = lambda->AddContextVar(*g).inner;
1772 auto five = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 5 }).output(0);
1773 auto st = StoreNonVolatileOperation::Create(cvf, five, { memoryStateArgument }, 4);
1774 auto & callG = CallOperation::CreateNode(
1777 { cvf, iOStateArgument, st[0] });
1779 auto lambdaOutput = lambda->finalize(outputs(&callG));
1780 GraphExport::Create(*lambda->output(),
"h");
1785 auto f = SetupGlobalF();
1786 auto g = SetupFunctionG();
1787 auto [h, callFunctionG, constantFive] = SetupFunctionH(f, g);
1797 this->CallG_ = callFunctionG;
1798 this->constantFive = constantFive;
1803std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1804DeltaTest2::SetupRvsdg()
1809 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
1810 auto graph = &
module->Rvsdg();
1812 auto SetupD1 = [&]()
1815 &graph->GetRootRegion(),
1816 LlvmDeltaOperation::Create(
1819 Linkage::externalLinkage,
1824 auto constant = IntegerConstantOperation::Create(*delta->subregion(), { 32, 0 }).output(0);
1826 return &delta->finalize(constant);
1829 auto SetupD2 = [&]()
1832 &graph->GetRootRegion(),
1833 LlvmDeltaOperation::Create(
1836 Linkage::externalLinkage,
1841 auto constant = IntegerConstantOperation::Create(*delta->subregion(), { 32, 0 }).output(0);
1843 return &delta->finalize(constant);
1848 auto iOStateType = IOStateType::Create();
1849 auto memoryStateType = MemoryStateType::Create();
1851 { IOStateType::Create(), MemoryStateType::Create() },
1852 { IOStateType::Create(), MemoryStateType::Create() });
1855 graph->GetRootRegion(),
1857 auto iOStateArgument = lambda->GetFunctionArguments()[0];
1858 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
1860 auto cvd1 = lambda->AddContextVar(*d1).inner;
1861 auto b2 = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 2 }).output(0);
1862 auto st = StoreNonVolatileOperation::Create(cvd1, b2, { memoryStateArgument }, 4);
1864 return lambda->finalize({ iOStateArgument, st[0] });
1869 auto iOStateType = IOStateType::Create();
1870 auto memoryStateType = MemoryStateType::Create();
1872 { IOStateType::Create(), MemoryStateType::Create() },
1873 { IOStateType::Create(), MemoryStateType::Create() });
1876 graph->GetRootRegion(),
1878 auto iOStateArgument = lambda->GetFunctionArguments()[0];
1879 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
1881 auto cvd1 = lambda->AddContextVar(*d1).inner;
1882 auto cvd2 = lambda->AddContextVar(*d2).inner;
1883 auto cvf1 = lambda->AddContextVar(*f1).inner;
1885 auto b5 = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 5 }).output(0);
1886 auto b42 = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 42 }).output(0);
1887 auto st = StoreNonVolatileOperation::Create(cvd1, b5, { memoryStateArgument }, 4);
1888 auto & call = CallOperation::CreateNode(
1891 { iOStateArgument, st[0] });
1892 st = StoreNonVolatileOperation::Create(
1895 { &CallOperation::GetMemoryStateOutput(call) },
1898 auto lambdaOutput = lambda->finalize(outputs(&call));
1899 GraphExport::Create(*lambdaOutput,
"f2");
1901 return std::make_tuple(lambdaOutput, &call);
1904 auto d1 = SetupD1();
1905 auto d2 = SetupD2();
1906 auto f1 = SetupF1(d1);
1907 auto [f2, callF1] = SetupF2(f1, d1, d2);
1916 this->CallF1_ = callF1;
1921std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1922DeltaTest3::SetupRvsdg()
1927 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
1928 auto graph = &
module->Rvsdg();
1930 auto SetupG1 = [&]()
1933 &graph->GetRootRegion(),
1934 LlvmDeltaOperation::Create(
1937 Linkage::externalLinkage,
1942 auto constant = IntegerConstantOperation::Create(*delta->subregion(), { 32, 1 }).output(0);
1944 return &delta->finalize(constant);
1949 auto pointerType = PointerType::Create();
1952 &graph->GetRootRegion(),
1953 LlvmDeltaOperation::Create(pointerType,
"g2", Linkage::externalLinkage,
"",
false, 4));
1955 auto ctxVar = delta->AddContextVar(g1);
1957 return &delta->finalize(ctxVar.inner);
1962 auto iOStateType = IOStateType::Create();
1963 auto memoryStateType = MemoryStateType::Create();
1965 { IOStateType::Create(), MemoryStateType::Create() },
1969 graph->GetRootRegion(),
1971 auto iOStateArgument = lambda->GetFunctionArguments()[0];
1972 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
1973 auto g1CtxVar = lambda->AddContextVar(g1).inner;
1974 auto g2CtxVar = lambda->AddContextVar(g2).inner;
1976 auto loadResults = LoadNonVolatileOperation::Create(
1978 { memoryStateArgument },
1979 PointerType::Create(),
1982 StoreNonVolatileOperation::Create(g2CtxVar, loadResults[0], { loadResults[1] }, 8);
1984 loadResults = LoadNonVolatileOperation::Create(
1989 auto & truncResult = TruncOperation::create(16, *loadResults[0]);
1991 return lambda->finalize({ &truncResult, iOStateArgument, loadResults[1] });
1996 auto iOStateType = IOStateType::Create();
1997 auto memoryStateType = MemoryStateType::Create();
1999 { IOStateType::Create(), MemoryStateType::Create() },
2000 { IOStateType::Create(), MemoryStateType::Create() });
2003 graph->GetRootRegion(),
2005 auto iOStateArgument = lambda->GetFunctionArguments()[0];
2006 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
2008 auto lambdaFArgument = lambda->AddContextVar(lambdaF).inner;
2010 auto & call = CallOperation::CreateNode(
2013 { iOStateArgument, memoryStateArgument });
2015 auto lambdaOutput = lambda->finalize(
2016 { &CallOperation::GetIOStateOutput(call), &CallOperation::GetMemoryStateOutput(call) });
2017 GraphExport::Create(*lambdaOutput,
"test");
2019 return std::make_tuple(lambdaOutput, &call);
2022 auto g1 = SetupG1();
2023 auto g2 = SetupG2(*g1);
2024 auto f = SetupF(*g1, *g2);
2025 auto [test, callF] = SetupTest(*f);
2036 this->CallF_ = callF;
2041std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2042ImportTest::SetupRvsdg()
2047 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
2048 auto graph = &
module->Rvsdg();
2052 auto iOStateType = IOStateType::Create();
2053 auto memoryStateType = MemoryStateType::Create();
2055 { IOStateType::Create(), MemoryStateType::Create() },
2056 { IOStateType::Create(), MemoryStateType::Create() });
2059 graph->GetRootRegion(),
2061 auto iOStateArgument = lambda->GetFunctionArguments()[0];
2062 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
2064 auto cvd1 = lambda->AddContextVar(*d1).inner;
2066 auto b5 = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 5 }).output(0);
2067 auto st = StoreNonVolatileOperation::Create(cvd1, b5, { memoryStateArgument }, 4);
2069 return lambda->finalize({ iOStateArgument, st[0] });
2074 auto iOStateType = IOStateType::Create();
2075 auto memoryStateType = MemoryStateType::Create();
2077 { IOStateType::Create(), MemoryStateType::Create() },
2078 { IOStateType::Create(), MemoryStateType::Create() });
2081 graph->GetRootRegion(),
2083 auto iOStateArgument = lambda->GetFunctionArguments()[0];
2084 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
2086 auto cvd1 = lambda->AddContextVar(*d1).inner;
2087 auto cvd2 = lambda->AddContextVar(*d2).inner;
2088 auto cvf1 = lambda->AddContextVar(*f1).inner;
2089 auto b2 = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 2 }).output(0);
2090 auto b21 = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 21 }).output(0);
2091 auto st = StoreNonVolatileOperation::Create(cvd1, b2, { memoryStateArgument }, 4);
2092 auto & call = CallOperation::CreateNode(
2095 { iOStateArgument, st[0] });
2096 st = StoreNonVolatileOperation::Create(
2099 { &CallOperation::GetMemoryStateOutput(call) },
2102 auto lambdaOutput = lambda->finalize(outputs(&call));
2103 GraphExport::Create(*lambda->output(),
"f2");
2105 return std::make_tuple(lambdaOutput, &call);
2110 BitType::Create(32),
2111 PointerType::Create(),
2113 Linkage::externalLinkage,
2119 PointerType::Create(),
2121 Linkage::externalLinkage,
2125 auto f1 = SetupF1(d1);
2126 auto [f2, callF1] = SetupF2(f1, d1, d2);
2132 this->CallF1_ = callF1;
2134 this->import_d1 = d1;
2135 this->import_d2 = d2;
2140std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2141PhiTest1::SetupRvsdg()
2146 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
2147 auto graph = &
module->Rvsdg();
2149 auto iOStateType = IOStateType::Create();
2150 auto memoryStateType = MemoryStateType::Create();
2153 PointerType::Create(),
2154 IOStateType::Create(),
2155 MemoryStateType::Create() },
2156 { IOStateType::Create(), MemoryStateType::Create() });
2158 auto SetupFib = [&]()
2160 auto pt = PointerType::Create();
2163 pb.
begin(&graph->GetRootRegion());
2164 auto fibrv = pb.
AddFixVar(fibFunctionType);
2169 auto valueArgument = lambda->GetFunctionArguments()[0];
2170 auto pointerArgument = lambda->GetFunctionArguments()[1];
2171 auto iOStateArgument = lambda->GetFunctionArguments()[2];
2172 auto memoryStateArgument = lambda->GetFunctionArguments()[3];
2173 auto ctxVarFib = lambda->AddContextVar(*fibrv.recref).inner;
2175 auto two = IntegerConstantOperation::Create(*lambda->subregion(), { 64, 2 }).output(0);
2176 auto bitult = IntegerUltOperation::createNode(64, *valueArgument, *two).output(0);
2177 auto & predicateNode = MatchOperation::CreateNode(*bitult, { { 0, 1 } }, 0, 2);
2179 auto gammaNode = GammaNode::create(predicateNode.output(0), 2);
2180 auto nev = gammaNode->AddEntryVar(valueArgument);
2181 auto resultev = gammaNode->AddEntryVar(pointerArgument);
2182 auto fibev = gammaNode->AddEntryVar(ctxVarFib);
2183 auto gIIoState = gammaNode->AddEntryVar(iOStateArgument);
2184 auto gIMemoryState = gammaNode->AddEntryVar(memoryStateArgument);
2187 auto one = IntegerConstantOperation::Create(*gammaNode->subregion(0), { 64, 1 }).output(0);
2188 auto nm1 = IntegerSubOperation::createNode(64, *nev.branchArgument[0], *
one).output(0);
2189 auto & callFibm1 = CallOperation::CreateNode(
2190 fibev.branchArgument[0],
2193 resultev.branchArgument[0],
2194 gIIoState.branchArgument[0],
2195 gIMemoryState.branchArgument[0] });
2197 two = IntegerConstantOperation::Create(*gammaNode->subregion(0), { 64, 2 }).output(0);
2198 auto nm2 = IntegerSubOperation::createNode(64, *nev.branchArgument[0], *two).output(0);
2199 auto & callFibm2 = CallOperation::CreateNode(
2200 fibev.branchArgument[0],
2203 resultev.branchArgument[0],
2204 &CallOperation::GetIOStateOutput(callFibm1),
2205 &CallOperation::GetMemoryStateOutput(callFibm1) });
2207 auto gepnm1 = GetElementPtrOperation::create(
2208 resultev.branchArgument[0],
2211 auto ldnm1 = LoadNonVolatileOperation::Create(
2213 { &CallOperation::GetMemoryStateOutput(callFibm2) },
2217 auto gepnm2 = GetElementPtrOperation::create(
2218 resultev.branchArgument[0],
2224 auto sum = IntegerAddOperation::createNode(64, *ldnm1[0], *ldnm2[0]).output(0);
2229 auto sumex = gammaNode->AddExitVar({ sum, nev.branchArgument[1] });
2230 auto gOIoState = gammaNode->AddExitVar(
2231 { &CallOperation::GetIOStateOutput(callFibm2), gIIoState.branchArgument[1] });
2232 auto gOMemoryState = gammaNode->AddExitVar({ ldnm2[1], gIMemoryState.branchArgument[1] });
2234 auto gepn = GetElementPtrOperation::create(
2238 auto store = StoreNonVolatileOperation::Create(gepn, sumex.output, { gOMemoryState.output }, 8);
2240 auto lambdaOutput = lambda->finalize({ gOIoState.output, store[0] });
2242 fibrv.result->divert_to(lambdaOutput);
2243 auto phiNode = pb.
end();
2245 return std::make_tuple(phiNode, lambdaOutput, gammaNode, &callFibm1, &callFibm2);
2251 auto iOStateType = IOStateType::Create();
2252 auto memoryStateType = MemoryStateType::Create();
2254 { IOStateType::Create(), MemoryStateType::Create() },
2255 { IOStateType::Create(), MemoryStateType::Create() });
2258 graph->GetRootRegion(),
2260 auto iOStateArgument = lambda->GetFunctionArguments()[0];
2261 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
2262 auto fibcv = lambda->AddContextVar(*phiNode->output(0)).inner;
2264 auto constantOne = IntegerConstantOperation::Create(*lambda->subregion(), { 64, 1 }).output(0);
2265 auto constantTen = IntegerConstantOperation::Create(*lambda->subregion(), { 64, 10 }).output(0);
2267 auto allocaResults = AllocaOperation::create(at, constantOne, 16);
2268 auto state = MemoryStateMergeOperation::Create(
2269 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
2271 auto zero = IntegerConstantOperation::Create(*lambda->subregion(), { 64, 0 }).output(0);
2272 auto gep = GetElementPtrOperation::create(allocaResults[0], { zero, zero }, at);
2274 auto & call = CallOperation::CreateNode(
2277 { constantTen, gep, iOStateArgument, state });
2279 auto lambdaOutput = lambda->finalize(outputs(&call));
2280 GraphExport::Create(*lambdaOutput,
"test");
2282 return std::make_tuple(
2288 auto [phiNode, fibfct, gammaNode, callFib1, callFib2] = SetupFib();
2289 auto [testfct, callFib, alloca] = SetupTestFunction(phiNode);
2295 this->gamma = gammaNode;
2296 this->phi = phiNode;
2298 this->CallFibm1_ = callFib1;
2299 this->CallFibm2_ = callFib2;
2301 this->CallFib_ = callFib;
2303 this->alloca = alloca;
2308std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2309PhiTest2::SetupRvsdg()
2314 auto iOStateType = IOStateType::Create();
2315 auto memoryStateType = MemoryStateType::Create();
2317 auto pointerType = PointerType::Create();
2320 { IOStateType::Create(), MemoryStateType::Create() },
2324 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() },
2328 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() },
2332 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() },
2335 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
2336 auto graph = &
module->Rvsdg();
2338 auto SetupEight = [&]()
2341 graph->GetRootRegion(),
2343 auto iOStateArgument = lambda->GetFunctionArguments()[0];
2344 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
2346 auto constant = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 8 }).output(0);
2348 return lambda->finalize({ constant, iOStateArgument, memoryStateArgument });
2354 graph->GetRootRegion(),
2356 auto pointerArgument = lambda->GetFunctionArguments()[0];
2357 auto functionArgument =
2360 auto iOStateArgument = lambda->GetFunctionArguments()[1];
2361 auto memoryStateArgument = lambda->GetFunctionArguments()[2];
2363 auto & call = CallOperation::CreateNode(
2365 constantFunctionType,
2366 { iOStateArgument, memoryStateArgument });
2368 auto lambdaOutput = lambda->finalize(outputs(&call));
2370 return std::make_tuple(lambdaOutput, &call);
2380 auto pointerArgument = lambda->GetFunctionArguments()[0];
2381 auto iOStateArgument = lambda->GetFunctionArguments()[1];
2382 auto memoryStateArgument = lambda->GetFunctionArguments()[2];
2384 auto functionBCv = lambda->AddContextVar(functionB).inner;
2385 auto functionDCv = lambda->AddContextVar(functionD).inner;
2387 auto one = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 1 }).output(0);
2389 StoreNonVolatileOperation::Create(pointerArgument,
one, { memoryStateArgument }, 4);
2391 auto constantOne = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 1 }).output(0);
2394 auto paMerge = MemoryStateMergeOperation::Create(
2395 std::vector<jlm::rvsdg::Output *>({ paAlloca[1], storeNode[0] }));
2397 auto & callB = CallOperation::CreateNode(
2400 { paAlloca[0], iOStateArgument, paMerge });
2402 auto & callD = CallOperation::CreateNode(
2406 &CallOperation::GetIOStateOutput(callB),
2407 &CallOperation::GetMemoryStateOutput(callB) });
2409 auto sum = IntegerAddOperation::createNode(32, *callB.output(0), *callD.output(0)).output(0);
2411 auto lambdaOutput = lambda->finalize({ sum,
2412 &CallOperation::GetIOStateOutput(callD),
2413 &CallOperation::GetMemoryStateOutput(callD) });
2415 return std::make_tuple(
2419 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2431 auto pointerArgument = lambda->GetFunctionArguments()[0];
2432 auto iOStateArgument = lambda->GetFunctionArguments()[1];
2433 auto memoryStateArgument = lambda->GetFunctionArguments()[2];
2435 auto functionICv = lambda->AddContextVar(functionI).inner;
2436 auto functionCCv = lambda->AddContextVar(functionC).inner;
2437 auto functionEightCv = lambda->AddContextVar(functionEight).inner;
2439 auto two = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 2 }).output(0);
2441 StoreNonVolatileOperation::Create(pointerArgument, two, { memoryStateArgument }, 4);
2443 auto constantOne = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 1 }).output(0);
2446 auto pbMerge = MemoryStateMergeOperation::Create(
2447 std::vector<jlm::rvsdg::Output *>({ pbAlloca[1], storeNode[0] }));
2449 auto & callI = CallOperation::CreateNode(
2457 auto & callC = CallOperation::CreateNode(
2461 &CallOperation::GetIOStateOutput(callI),
2462 &CallOperation::GetMemoryStateOutput(callI) });
2464 auto sum = IntegerAddOperation::createNode(32, *callI.output(0), *callC.output(0)).output(0);
2466 auto lambdaOutput = lambda->finalize({ sum,
2467 &CallOperation::GetIOStateOutput(callC),
2468 &CallOperation::GetMemoryStateOutput(callC) });
2470 return std::make_tuple(
2474 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2483 auto xArgument = lambda->GetFunctionArguments()[0];
2484 auto iOStateArgument = lambda->GetFunctionArguments()[1];
2485 auto memoryStateArgument = lambda->GetFunctionArguments()[2];
2487 auto functionACv = lambda->AddContextVar(functionA).inner;
2489 auto three = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 3 }).output(0);
2491 StoreNonVolatileOperation::Create(xArgument, three, { memoryStateArgument }, 4);
2493 auto constanOne = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 1 }).output(0);
2495 auto pcMerge = MemoryStateMergeOperation::Create(
2496 std::vector<jlm::rvsdg::Output *>({ pcAlloca[1], storeNode[0] }));
2498 auto & callA = CallOperation::CreateNode(
2501 { pcAlloca[0], iOStateArgument, pcMerge });
2503 auto loadX = LoadNonVolatileOperation::Create(
2505 { &CallOperation::GetMemoryStateOutput(callA) },
2509 auto sum = IntegerAddOperation::createNode(32, *callA.output(0), *loadX[0]).output(0);
2512 lambda->finalize({ sum, &CallOperation::GetIOStateOutput(callA), loadX[1] });
2514 return std::make_tuple(
2517 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2526 auto xArgument = lambda->GetFunctionArguments()[0];
2527 auto iOStateArgument = lambda->GetFunctionArguments()[1];
2528 auto memoryStateArgument = lambda->GetFunctionArguments()[2];
2530 auto functionACv = lambda->AddContextVar(functionA).inner;
2532 auto four = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 4 }).output(0);
2533 auto storeNode = StoreNonVolatileOperation::Create(xArgument, four, { memoryStateArgument }, 4);
2535 auto constantOne = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 1 }).output(0);
2537 auto pdMerge = MemoryStateMergeOperation::Create(
2538 std::vector<jlm::rvsdg::Output *>({ pdAlloca[1], storeNode[0] }));
2540 auto & callA = CallOperation::CreateNode(
2543 { pdAlloca[0], iOStateArgument, pdMerge });
2545 auto lambdaOutput = lambda->finalize(outputs(&callA));
2547 return std::make_tuple(
2550 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2557 phiBuilder.
begin(&graph->GetRootRegion());
2558 auto lambdaARv = phiBuilder.
AddFixVar(recFunctionType);
2559 auto lambdaBRv = phiBuilder.
AddFixVar(recFunctionType);
2560 auto lambdaCRv = phiBuilder.
AddFixVar(recFunctionType);
2561 auto lambdaDRv = phiBuilder.
AddFixVar(recFunctionType);
2565 auto [lambdaAOutput, callB, callD, paAlloca] =
2566 SetupA(*phiBuilder.
subregion(), *lambdaBRv.recref, *lambdaDRv.recref);
2568 auto [lambdaBOutput, callI, callC, pbAlloca] =
2569 SetupB(*phiBuilder.
subregion(), *lambdaICv.inner, *lambdaCRv.recref, *lambdaEightCv.inner);
2571 auto [lambdaCOutput, callAFromC, pcAlloca] = SetupC(*phiBuilder.
subregion(), *lambdaARv.recref);
2573 auto [lambdaDOutput, callAFromD, pdAlloca] = SetupD(*phiBuilder.
subregion(), *lambdaARv.recref);
2575 lambdaARv.result->divert_to(lambdaAOutput);
2576 lambdaBRv.result->divert_to(lambdaBOutput);
2577 lambdaCRv.result->divert_to(lambdaCOutput);
2578 lambdaDRv.result->divert_to(lambdaDOutput);
2582 return std::make_tuple(
2601 auto pointerType = PointerType::Create();
2604 { IOStateType::Create(), MemoryStateType::Create() },
2608 graph->GetRootRegion(),
2610 auto iOStateArgument = lambda->GetFunctionArguments()[0];
2611 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
2613 auto functionACv = lambda->AddContextVar(functionA).inner;
2615 auto constantOne = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 1 }).output(0);
2617 auto pTestMerge = MemoryStateMergeOperation::Create(
2618 std::vector<jlm::rvsdg::Output *>({ pTestAlloca[1], memoryStateArgument }));
2620 auto & callA = CallOperation::CreateNode(
2623 { pTestAlloca[0], iOStateArgument, pTestMerge });
2625 auto lambdaOutput = lambda->finalize(outputs(&callA));
2626 GraphExport::Create(*lambdaOutput,
"test");
2628 return std::make_tuple(
2631 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2635 auto lambdaEight = SetupEight();
2636 auto [lambdaI, indirectCall] = SetupI();
2652 pdAlloca] = SetupPhi(*lambdaEight, *lambdaI);
2654 auto [lambdaTest, callAFromTest, pTestAlloca] = SetupTest(*lambdaA.output);
2667 this->CallAFromTest_ = callAFromTest;
2668 this->CallAFromC_ = callAFromC;
2669 this->CallAFromD_ = callAFromD;
2670 this->CallB_ = callB;
2671 this->CallC_ = callC;
2672 this->CallD_ = callD;
2673 this->CallI_ = callI;
2674 this->IndirectCall_ = indirectCall;
2676 this->PTestAlloca_ = pTestAlloca;
2677 this->PaAlloca_ = paAlloca;
2678 this->PbAlloca_ = pbAlloca;
2679 this->PcAlloca_ = pcAlloca;
2680 this->PdAlloca_ = pdAlloca;
2685std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2686PhiWithDeltaTest::SetupRvsdg()
2692 auto & rvsdg = rvsdgModule->Rvsdg();
2694 auto pointerType = PointerType::Create();
2695 auto structType = StructType::CreateIdentified(
"myStruct", { PointerType::Create() },
false);
2696 auto arrayType = ArrayType::Create(structType, 2);
2699 pb.
begin(&rvsdg.GetRootRegion());
2700 auto myArrayRecVar = pb.
AddFixVar(pointerType);
2704 LlvmDeltaOperation::Create(arrayType,
"myArray", Linkage::externalLinkage,
"",
false, 4));
2705 auto myArrayArgument = delta->AddContextVar(*myArrayRecVar.recref).inner;
2707 auto aggregateZero = ConstantAggregateZeroOperation::Create(*delta->subregion(), structType);
2708 auto & constantStruct =
2709 ConstantStructOperation::Create(*delta->subregion(), { myArrayArgument }, structType);
2710 auto constantArray = ConstantArrayOperation::Create({ aggregateZero, &constantStruct });
2712 auto deltaOutput = &delta->finalize(constantArray);
2714 myArrayRecVar.result->divert_to(deltaOutput);
2716 auto phiNode = pb.
end();
2717 GraphExport::Create(*phiNode->output(0),
"myArray");
2722std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2723ExternalMemoryTest::SetupRvsdg()
2728 auto mt = MemoryStateType::Create();
2729 auto pointerType = PointerType::Create();
2731 { PointerType::Create(), PointerType::Create(), MemoryStateType::Create() },
2732 { MemoryStateType::Create() });
2734 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
2735 auto graph = &
module->Rvsdg();
2741 graph->GetRootRegion(),
2743 auto x = LambdaF->GetFunctionArguments()[0];
2744 auto y = LambdaF->GetFunctionArguments()[1];
2745 auto state = LambdaF->GetFunctionArguments()[2];
2747 auto one = IntegerConstantOperation::Create(*LambdaF->subregion(), { 32, 1 }).output(0);
2748 auto two = IntegerConstantOperation::Create(*LambdaF->subregion(), { 32, 2 }).output(0);
2750 auto storeOne = StoreNonVolatileOperation::Create(x,
one, { state }, 4);
2751 auto storeTwo = StoreNonVolatileOperation::Create(y, two, { storeOne[0] }, 4);
2753 LambdaF->finalize(storeTwo);
2754 GraphExport::Create(*LambdaF->output(),
"f");
2759std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2760EscapedMemoryTest1::SetupRvsdg()
2766 auto rvsdg = &rvsdgModule->Rvsdg();
2768 auto SetupDeltaA = [&]()
2771 &rvsdg->GetRootRegion(),
2772 LlvmDeltaOperation::Create(
2775 Linkage::externalLinkage,
2780 auto constant = IntegerConstantOperation::Create(*deltaNode->subregion(), { 32, 1 }).output(0);
2782 return &deltaNode->finalize(constant);
2785 auto SetupDeltaB = [&]()
2788 &rvsdg->GetRootRegion(),
2789 LlvmDeltaOperation::Create(
2792 Linkage::externalLinkage,
2797 auto constant = IntegerConstantOperation::Create(*deltaNode->subregion(), { 32, 2 }).output(0);
2799 return &deltaNode->finalize(constant);
2804 auto pointerType = PointerType::Create();
2807 &rvsdg->GetRootRegion(),
2808 LlvmDeltaOperation::Create(pointerType,
"x", Linkage::externalLinkage,
"",
false, 4));
2810 auto contextVariableA = deltaNode->AddContextVar(deltaA).inner;
2812 return &deltaNode->finalize(contextVariableA);
2817 auto pointerType = PointerType::Create();
2820 &rvsdg->GetRootRegion(),
2821 LlvmDeltaOperation::Create(pointerType,
"y", Linkage::externalLinkage,
"",
false, 4));
2823 auto contextVariableX = deltaNode->AddContextVar(deltaX).inner;
2825 auto deltaOutput = &deltaNode->finalize(contextVariableX);
2826 GraphExport::Create(*deltaOutput,
"y");
2833 auto pointerType = PointerType::Create();
2834 auto iOStateType = IOStateType::Create();
2835 auto memoryStateType = MemoryStateType::Create();
2837 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() },
2841 rvsdg->GetRootRegion(),
2843 auto pointerArgument = lambda->GetFunctionArguments()[0];
2844 auto iOStateArgument = lambda->GetFunctionArguments()[1];
2845 auto memoryStateArgument = lambda->GetFunctionArguments()[2];
2847 auto contextVariableB = lambda->AddContextVar(deltaB).inner;
2850 LoadNonVolatileOperation::Create(pointerArgument, { memoryStateArgument }, pointerType, 4);
2851 auto loadResults2 = LoadNonVolatileOperation::Create(
2853 { loadResults1[1] },
2857 auto five = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 5 }).output(0);
2859 StoreNonVolatileOperation::Create(contextVariableB, five, { loadResults2[1] }, 4);
2861 auto lambdaOutput = lambda->finalize({ loadResults2[0], iOStateArgument, storeResults[0] });
2863 GraphExport::Create(*lambdaOutput,
"test");
2865 return std::make_tuple(
2867 jlm::util::assertedCast<rvsdg::SimpleNode>(
2871 auto deltaA = SetupDeltaA();
2872 auto deltaB = SetupDeltaB();
2873 auto deltaX = SetupDeltaX(*deltaA);
2874 auto deltaY = SetupDeltaY(*deltaX);
2875 auto [lambdaTest, loadNode1] = SetupLambdaTest(*deltaB);
2887 this->LoadNode1 = loadNode1;
2892std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2893EscapedMemoryTest2::SetupRvsdg()
2899 auto rvsdg = &rvsdgModule->Rvsdg();
2901 auto pointerType = PointerType::Create();
2902 auto iOStateType = IOStateType::Create();
2903 auto memoryStateType = MemoryStateType::Create();
2906 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() },
2907 { IOStateType::Create(), MemoryStateType::Create() });
2910 { IOStateType::Create(), MemoryStateType::Create() },
2911 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() });
2913 auto SetupExternalFunction1Declaration = [&]()
2917 externalFunction1Type,
2918 "ExternalFunction1",
2919 Linkage::externalLinkage,
2923 auto SetupExternalFunction2Declaration = [&]()
2927 externalFunction2Type,
2928 "ExternalFunction2",
2929 Linkage::externalLinkage,
2933 auto SetupReturnAddressFunction = [&]()
2936 auto iOStateType = IOStateType::Create();
2937 auto memoryStateType = MemoryStateType::Create();
2939 { IOStateType::Create(), MemoryStateType::Create() },
2940 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() });
2943 rvsdg->GetRootRegion(),
2945 auto iOStateArgument = lambda->GetFunctionArguments()[0];
2946 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
2948 auto eight = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 8 }).output(0);
2950 auto & mallocNode = MallocOperation::createNode(*eight, *iOStateArgument);
2951 auto mergeResults = MemoryStateMergeOperation::Create(
2952 std::vector({ memoryStateArgument, &MallocOperation::memoryStateOutput(mallocNode) }));
2954 auto lambdaOutput = lambda->finalize({ &MallocOperation::addressOutput(mallocNode),
2955 &MallocOperation::ioStateOutput(mallocNode),
2958 GraphExport::Create(*lambdaOutput,
"ReturnAddress");
2960 return std::make_tuple(lambdaOutput, &mallocNode);
2965 auto iOStateType = IOStateType::Create();
2966 auto memoryStateType = MemoryStateType::Create();
2968 { IOStateType::Create(), MemoryStateType::Create() },
2969 { IOStateType::Create(), MemoryStateType::Create() });
2972 rvsdg->GetRootRegion(),
2975 "CallExternalFunction1",
2976 Linkage::externalLinkage));
2977 auto iOStateArgument = lambda->GetFunctionArguments()[0];
2978 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
2980 auto externalFunction1 = lambda->AddContextVar(*externalFunction1Argument).inner;
2982 auto eight = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 8 }).output(0);
2984 auto & mallocNode = MallocOperation::createNode(*eight, *iOStateArgument);
2985 auto mergeResult = MemoryStateMergeOperation::Create(
2986 std::vector({ memoryStateArgument, &MallocOperation::memoryStateOutput(mallocNode) }));
2988 auto & call = CallOperation::CreateNode(
2990 externalFunction1Type,
2991 { &MallocOperation::addressOutput(mallocNode),
2992 &MallocOperation::ioStateOutput(mallocNode),
2995 auto lambdaOutput = lambda->finalize(outputs(&call));
2997 GraphExport::Create(*lambdaOutput,
"CallExternalFunction1");
2999 return std::make_tuple(lambdaOutput, &call, &mallocNode);
3004 auto iOStateType = IOStateType::Create();
3005 auto memoryStateType = MemoryStateType::Create();
3007 { IOStateType::Create(), MemoryStateType::Create() },
3011 rvsdg->GetRootRegion(),
3014 "CallExternalFunction2",
3015 Linkage::externalLinkage));
3016 auto iOStateArgument = lambda->GetFunctionArguments()[0];
3017 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
3019 auto externalFunction2 = lambda->AddContextVar(*externalFunction2Argument).inner;
3021 auto & call = CallOperation::CreateNode(
3023 externalFunction2Type,
3024 { iOStateArgument, memoryStateArgument });
3026 auto loadResults = LoadNonVolatileOperation::Create(
3028 { &CallOperation::GetMemoryStateOutput(call) },
3032 auto lambdaOutput = lambda->finalize(
3033 { loadResults[0], &CallOperation::GetIOStateOutput(call), loadResults[1] });
3035 GraphExport::Create(*lambdaOutput,
"CallExternalFunction2");
3037 return std::make_tuple(
3040 jlm::util::assertedCast<rvsdg::SimpleNode>(
3044 auto externalFunction1 = SetupExternalFunction1Declaration();
3045 auto externalFunction2 = SetupExternalFunction2Declaration();
3046 auto [returnAddressFunction, returnAddressMalloc] = SetupReturnAddressFunction();
3047 auto [callExternalFunction1, externalFunction1Call, callExternalFunction1Malloc] =
3048 SetupCallExternalFunction1(externalFunction1);
3049 auto [callExternalFunction2, externalFunction2Call, loadNode] =
3050 SetupCallExternalFunction2(externalFunction2);
3055 this->ReturnAddressFunction =
3057 this->CallExternalFunction1 =
3059 this->CallExternalFunction2 =
3062 this->ExternalFunction1Call = externalFunction1Call;
3063 this->ExternalFunction2Call = externalFunction2Call;
3065 this->ReturnAddressMalloc = returnAddressMalloc;
3066 this->CallExternalFunction1Malloc = callExternalFunction1Malloc;
3068 this->ExternalFunction1Import = externalFunction1;
3069 this->ExternalFunction2Import = externalFunction2;
3071 this->LoadNode = loadNode;
3076std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3077EscapedMemoryTest3::SetupRvsdg()
3083 auto rvsdg = &rvsdgModule->Rvsdg();
3085 auto pointerType = PointerType::Create();
3086 auto iOStateType = IOStateType::Create();
3087 auto memoryStateType = MemoryStateType::Create();
3089 { IOStateType::Create(), MemoryStateType::Create() },
3090 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() });
3092 auto SetupExternalFunctionDeclaration = [&]()
3094 return &LlvmGraphImport::createFunctionImport(
3096 externalFunctionType,
3098 Linkage::externalLinkage,
3102 auto SetupGlobal = [&]()
3105 &rvsdg->GetRootRegion(),
3106 LlvmDeltaOperation::Create(
3109 Linkage::externalLinkage,
3114 auto constant = IntegerConstantOperation::Create(*delta->subregion(), { 32, 4 }).output(0);
3116 auto deltaOutput = &delta->finalize(constant);
3118 GraphExport::Create(*deltaOutput,
"global");
3125 auto iOStateType = IOStateType::Create();
3126 auto memoryStateType = MemoryStateType::Create();
3128 { IOStateType::Create(), MemoryStateType::Create() },
3132 rvsdg->GetRootRegion(),
3134 auto iOStateArgument = lambda->GetFunctionArguments()[0];
3135 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
3137 auto externalFunction = lambda->AddContextVar(*externalFunctionArgument).inner;
3139 auto & call = CallOperation::CreateNode(
3141 externalFunctionType,
3142 { iOStateArgument, memoryStateArgument });
3144 auto loadResults = LoadNonVolatileOperation::Create(
3146 { &CallOperation::GetMemoryStateOutput(call) },
3150 auto lambdaOutput = lambda->finalize(
3151 { loadResults[0], &CallOperation::GetIOStateOutput(call), loadResults[1] });
3153 GraphExport::Create(*lambdaOutput,
"test");
3155 return std::make_tuple(
3158 jlm::util::assertedCast<rvsdg::SimpleNode>(
3162 auto importExternalFunction = SetupExternalFunctionDeclaration();
3163 auto deltaGlobal = SetupGlobal();
3164 auto [lambdaTest, callExternalFunction, loadNode] = SetupTestFunction(importExternalFunction);
3169 this->ImportExternalFunction = importExternalFunction;
3170 this->CallExternalFunction = callExternalFunction;
3171 this->LoadNode = loadNode;
3176std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3177MemcpyTest::SetupRvsdg()
3183 auto rvsdg = &rvsdgModule->Rvsdg();
3187 auto SetupInitArray = [&]()
3190 &rvsdg->GetRootRegion(),
3191 LlvmDeltaOperation::Create(arrayType,
"initArray", Linkage::externalLinkage,
"",
false, 4));
3193 auto zero = IntegerConstantOperation::Create(*delta->subregion(), { 32, 0 }).output(0);
3194 auto one = IntegerConstantOperation::Create(*delta->subregion(), { 32, 1 }).output(0);
3195 auto two = IntegerConstantOperation::Create(*delta->subregion(), { 32, 2 }).output(0);
3196 auto three = IntegerConstantOperation::Create(*delta->subregion(), { 32, 3 }).output(0);
3197 auto four = IntegerConstantOperation::Create(*delta->subregion(), { 32, 4 }).output(0);
3199 auto constantDataArray = ConstantDataArrayOperation::Create({ zero,
one, two, three, four });
3201 auto deltaOutput = &delta->finalize(constantDataArray);
3203 GraphExport::Create(*deltaOutput,
"initArray");
3208 auto SetupGlobalArray = [&]()
3211 &rvsdg->GetRootRegion(),
3212 LlvmDeltaOperation::Create(
3215 Linkage::externalLinkage,
3220 auto constantAggregateZero =
3221 ConstantAggregateZeroOperation::Create(*delta->subregion(), arrayType);
3223 auto deltaOutput = &delta->finalize(constantAggregateZero);
3225 GraphExport::Create(*deltaOutput,
"globalArray");
3232 auto iOStateType = IOStateType::Create();
3233 auto memoryStateType = MemoryStateType::Create();
3235 { IOStateType::Create(), MemoryStateType::Create() },
3239 rvsdg->GetRootRegion(),
3241 auto iOStateArgument = lambda->GetFunctionArguments()[0];
3242 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
3244 auto globalArrayArgument = lambda->AddContextVar(globalArray).inner;
3246 auto zero = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 0 }).output(0);
3247 auto two = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 2 }).output(0);
3248 auto six = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 6 }).output(0);
3250 auto gep = GetElementPtrOperation::create(globalArrayArgument, { zero, two }, arrayType);
3252 auto storeResults = StoreNonVolatileOperation::Create(gep, six, { memoryStateArgument }, 8);
3254 auto loadResults = LoadNonVolatileOperation::Create(
3256 { storeResults[0] },
3260 auto lambdaOutput = lambda->finalize({ loadResults[0], iOStateArgument, loadResults[1] });
3262 GraphExport::Create(*lambdaOutput,
"f");
3264 return lambdaOutput;
3267 auto SetupFunctionG =
3270 auto iOStateType = IOStateType::Create();
3271 auto memoryStateType = MemoryStateType::Create();
3273 { IOStateType::Create(), MemoryStateType::Create() },
3277 rvsdg->GetRootRegion(),
3279 auto iOStateArgument = lambda->GetFunctionArguments()[0];
3280 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
3282 auto localArrayArgument = lambda->AddContextVar(localArray).inner;
3283 auto globalArrayArgument = lambda->AddContextVar(globalArray).inner;
3284 auto functionFArgument = lambda->AddContextVar(lambdaF).inner;
3286 auto bcLocalArray = BitCastOperation::create(localArrayArgument, PointerType::Create());
3287 auto bcGlobalArray = BitCastOperation::create(globalArrayArgument, PointerType::Create());
3289 auto twenty = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 20 }).output(0);
3291 auto memcpyResults = MemCpyNonVolatileOperation::create(
3295 { memoryStateArgument });
3297 auto & call = CallOperation::CreateNode(
3300 { iOStateArgument, memcpyResults[0] });
3302 auto lambdaOutput = lambda->finalize(outputs(&call));
3304 GraphExport::Create(*lambdaOutput,
"g");
3306 return std::make_tuple(
3312 auto initArray = SetupInitArray();
3313 auto globalArray = SetupGlobalArray();
3314 auto lambdaF = SetupFunctionF(*globalArray);
3315 auto [lambdaG, callF, memcpyNode] = SetupFunctionG(*initArray, *globalArray, *lambdaF);
3324 this->CallF_ = callF;
3325 this->Memcpy_ = memcpyNode;
3330std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3331MemcpyTest2::SetupRvsdg()
3337 auto rvsdg = &rvsdgModule->Rvsdg();
3339 auto pointerType = PointerType::Create();
3340 auto arrayType = ArrayType::Create(PointerType::Create(), 32);
3341 auto structTypeB = StructType::CreateIdentified(
"structTypeB", { arrayType },
false);
3343 auto SetupFunctionG = [&]()
3345 auto iOStateType = IOStateType::Create();
3346 auto memoryStateType = MemoryStateType::Create();
3348 { PointerType::Create(),
3349 PointerType::Create(),
3350 IOStateType::Create(),
3351 MemoryStateType::Create() },
3352 { IOStateType::Create(), MemoryStateType::Create() });
3355 rvsdg->GetRootRegion(),
3357 auto s1Argument = lambda->GetFunctionArguments()[0];
3358 auto s2Argument = lambda->GetFunctionArguments()[1];
3359 auto iOStateArgument = lambda->GetFunctionArguments()[2];
3360 auto memoryStateArgument = lambda->GetFunctionArguments()[3];
3362 auto c0 = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 0 }).output(0);
3363 auto c128 = IntegerConstantOperation::Create(*lambda->subregion(), { 64, 128 }).output(0);
3365 auto gepS21 = GetElementPtrOperation::create(s2Argument, { c0, c0 }, structTypeB);
3366 auto gepS22 = GetElementPtrOperation::create(gepS21, { c0, c0 }, arrayType);
3367 auto ldS2 = LoadNonVolatileOperation::Create(gepS22, { memoryStateArgument }, pointerType, 8);
3369 auto gepS11 = GetElementPtrOperation::create(s1Argument, { c0, c0 }, structTypeB);
3370 auto gepS12 = GetElementPtrOperation::create(gepS11, { c0, c0 }, arrayType);
3371 auto ldS1 = LoadNonVolatileOperation::Create(gepS12, { ldS2[1] }, pointerType, 8);
3373 auto memcpyResults = MemCpyNonVolatileOperation::create(ldS2[0], ldS1[0], c128, { ldS1[1] });
3375 auto lambdaOutput = lambda->finalize({ iOStateArgument, memcpyResults[0] });
3382 auto iOStateType = IOStateType::Create();
3383 auto memoryStateType = MemoryStateType::Create();
3385 { PointerType::Create(),
3386 PointerType::Create(),
3387 IOStateType::Create(),
3388 MemoryStateType::Create() },
3389 { IOStateType::Create(), MemoryStateType::Create() });
3392 rvsdg->GetRootRegion(),
3394 auto s1Argument = lambda->GetFunctionArguments()[0];
3395 auto s2Argument = lambda->GetFunctionArguments()[1];
3396 auto iOStateArgument = lambda->GetFunctionArguments()[2];
3397 auto memoryStateArgument = lambda->GetFunctionArguments()[3];
3399 auto functionFArgument = lambda->AddContextVar(functionF).inner;
3401 auto c0 = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 0 }).output(0);
3403 auto gepS1 = GetElementPtrOperation::create(s1Argument, { c0, c0 }, structTypeB);
3404 auto ldS1 = LoadNonVolatileOperation::Create(gepS1, { memoryStateArgument }, pointerType, 8);
3406 auto gepS2 = GetElementPtrOperation::create(s2Argument, { c0, c0 }, structTypeB);
3407 auto ldS2 = LoadNonVolatileOperation::Create(gepS2, { ldS1[1] }, pointerType, 8);
3409 auto & call = CallOperation::CreateNode(
3412 { ldS1[0], ldS2[0], iOStateArgument, ldS2[1] });
3414 auto lambdaOutput = lambda->finalize(outputs(&call));
3416 GraphExport::Create(*lambdaOutput,
"f");
3418 return std::make_tuple(lambdaOutput, &call);
3421 auto [lambdaG, memcpyNode] = SetupFunctionG();
3422 auto [lambdaF, callG] = SetupFunctionF(*lambdaG);
3426 this->CallG_ = callG;
3427 this->Memcpy_ = memcpyNode;
3432std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3433MemcpyTest3::SetupRvsdg()
3439 auto rvsdg = &rvsdgModule->Rvsdg();
3441 auto pointerType = PointerType::Create();
3442 auto structType = StructType::CreateIdentified(
"myStruct", { PointerType::Create() },
false);
3444 auto iOStateType = IOStateType::Create();
3445 auto memoryStateType = MemoryStateType::Create();
3447 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() },
3448 { IOStateType::Create(), MemoryStateType::Create() });
3451 rvsdg->GetRootRegion(),
3453 auto pArgument = Lambda_->GetFunctionArguments()[0];
3454 auto iOStateArgument = Lambda_->GetFunctionArguments()[1];
3455 auto memoryStateArgument = Lambda_->GetFunctionArguments()[2];
3457 auto eight = IntegerConstantOperation::Create(*Lambda_->subregion(), { 64, 8 }).output(0);
3458 auto zero = IntegerConstantOperation::Create(*Lambda_->subregion(), { 32, 0 }).output(0);
3459 auto minusFive = IntegerConstantOperation::Create(*Lambda_->subregion(), { 64, -5 }).output(0);
3460 auto three = IntegerConstantOperation::Create(*Lambda_->subregion(), { 64, 3 }).output(0);
3462 auto constantOne = IntegerConstantOperation::Create(*Lambda_->subregion(), { 64, 1 }).output(0);
3463 auto allocaResults = AllocaOperation::create(structType, constantOne, 8);
3464 auto memoryState = MemoryStateMergeOperation::Create(
3465 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
3467 auto memcpyResults =
3468 MemCpyNonVolatileOperation::create(allocaResults[0], pArgument, eight, { memoryState });
3470 auto gep1 = GetElementPtrOperation::create(allocaResults[0], { zero, zero }, structType);
3471 auto ld = LoadNonVolatileOperation::Create(gep1, { memcpyResults[0] }, pointerType, 8);
3473 auto gep2 = GetElementPtrOperation::create(allocaResults[0], { minusFive }, structType);
3475 memcpyResults = MemCpyNonVolatileOperation::create(ld[0], gep2, three, { ld[1] });
3477 auto lambdaOutput = Lambda_->finalize({ iOStateArgument, memcpyResults[0] });
3479 GraphExport::Create(*lambdaOutput,
"f");
3487std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3488LinkedListTest::SetupRvsdg()
3494 auto & rvsdg = rvsdgModule->Rvsdg();
3496 auto pointerType = PointerType::Create();
3497 auto structType = StructType::CreateIdentified(
"list", { PointerType::Create() },
false);
3499 auto SetupDeltaMyList = [&]()
3502 &rvsdg.GetRootRegion(),
3503 LlvmDeltaOperation::Create(pointerType,
"MyList", Linkage::externalLinkage,
"",
false, 4));
3505 auto constantPointerNullResult =
3506 ConstantPointerNullOperation::createNode(*delta->subregion()).output(0);
3508 auto deltaOutput = &delta->finalize(constantPointerNullResult);
3509 GraphExport::Create(*deltaOutput,
"myList");
3516 auto iOStateType = IOStateType::Create();
3517 auto memoryStateType = MemoryStateType::Create();
3519 { IOStateType::Create(), MemoryStateType::Create() },
3520 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() });
3523 rvsdg.GetRootRegion(),
3525 auto iOStateArgument = lambda->GetFunctionArguments()[0];
3526 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
3528 auto myListArgument = lambda->AddContextVar(myList).inner;
3530 auto zero = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 0 }).output(0);
3531 auto constantOne = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 1 }).output(0);
3533 auto alloca = AllocaOperation::create(pointerType, constantOne, 4);
3534 auto mergedMemoryState = MemoryStateMergeOperation::Create(
3535 std::vector<jlm::rvsdg::Output *>{ alloca[1], memoryStateArgument });
3538 LoadNonVolatileOperation::Create(myListArgument, { mergedMemoryState }, pointerType, 4);
3539 auto store1 = StoreNonVolatileOperation::Create(alloca[0], load1[0], { load1[1] }, 4);
3541 auto load2 = LoadNonVolatileOperation::Create(alloca[0], { store1[0] }, pointerType, 4);
3542 auto gep = GetElementPtrOperation::create(load2[0], { zero, zero }, structType);
3544 auto load3 = LoadNonVolatileOperation::Create(gep, { load2[1] }, pointerType, 4);
3545 auto store2 = StoreNonVolatileOperation::Create(alloca[0], load3[0], { load3[1] }, 4);
3547 auto load4 = LoadNonVolatileOperation::Create(alloca[0], { store2[0] }, pointerType, 4);
3549 auto lambdaOutput = lambda->finalize({ load4[0], iOStateArgument, load4[1] });
3550 GraphExport::Create(*lambdaOutput,
"next");
3555 auto deltaMyList = SetupDeltaMyList();
3556 auto [alloca, lambdaNext] = SetupFunctionNext(*deltaMyList);
3563 this->Alloca_ = alloca;
3568std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3569AllMemoryNodesTest::SetupRvsdg()
3574 auto mt = MemoryStateType::Create();
3575 auto pointerType = PointerType::Create();
3576 auto ioStateType = IOStateType::Create();
3578 { MemoryStateType::Create(), ioStateType },
3579 { MemoryStateType::Create(), ioStateType });
3581 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
3582 auto graph = &
module->Rvsdg();
3585 Import_ = &LlvmGraphImport::createGlobalImport(
3587 BitType::Create(32),
3588 PointerType::Create(),
3590 Linkage::externalLinkage,
3596 &graph->GetRootRegion(),
3597 LlvmDeltaOperation::Create(pointerType,
"global", Linkage::externalLinkage,
"",
false, 4));
3598 auto constantPointerNullResult =
3599 ConstantPointerNullOperation::createNode(*Delta_->subregion()).output(0);
3600 Delta_->finalize(constantPointerNullResult);
3604 graph->GetRootRegion(),
3606 auto entryMemoryState = Lambda_->GetFunctionArguments()[0];
3607 auto ioStateArgument = Lambda_->GetFunctionArguments()[1];
3608 auto deltaContextVar = Lambda_->AddContextVar(Delta_->output()).inner;
3609 auto importContextVar = Lambda_->AddContextVar(*Import_).inner;
3612 auto allocaSize = IntegerConstantOperation::Create(*Lambda_->subregion(), { 32, 1 }).output(0);
3613 auto allocaOutputs = AllocaOperation::create(pointerType, allocaSize, 8);
3616 auto afterAllocaMemoryState = MemoryStateMergeOperation::Create(
3617 std::vector<jlm::rvsdg::Output *>{ entryMemoryState, allocaOutputs[1] });
3620 auto mallocSize = IntegerConstantOperation::Create(*Lambda_->subregion(), { 32, 4 }).output(0);
3621 Malloc_ = &MallocOperation::createNode(*mallocSize, *ioStateArgument);
3623 auto afterMallocMemoryState = MemoryStateMergeOperation::Create(
3624 std::vector{ afterAllocaMemoryState, &MallocOperation::memoryStateOutput(*Malloc_) });
3627 auto storeAllocaOutputs = StoreNonVolatileOperation::Create(
3629 &MallocOperation::addressOutput(*Malloc_),
3630 { afterMallocMemoryState },
3634 auto loadAllocaOutputs =
3635 LoadNonVolatileOperation::Create(allocaOutputs[0], { storeAllocaOutputs[0] }, pointerType, 8);
3638 auto loadImportedOutputs = LoadNonVolatileOperation::Create(
3640 { loadAllocaOutputs[1] },
3646 auto storeImportedOutputs = StoreNonVolatileOperation::Create(
3647 loadAllocaOutputs[0],
3648 loadImportedOutputs[0],
3649 { loadImportedOutputs[1] },
3653 auto storeOutputs = StoreNonVolatileOperation::Create(
3655 loadAllocaOutputs[0],
3656 { storeImportedOutputs[0] },
3659 Lambda_->finalize({ storeOutputs[0], &MallocOperation::ioStateOutput(*Malloc_) });
3661 GraphExport::Create(Delta_->output(),
"global");
3662 GraphExport::Create(*Lambda_->output(),
"f");
3667std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3668NAllocaNodesTest::SetupRvsdg()
3673 auto mt = MemoryStateType::Create();
3674 auto pointerType = PointerType::Create();
3678 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
3679 auto graph = &
module->Rvsdg();
3682 graph->GetRootRegion(),
3685 auto constantOne = IntegerConstantOperation::Create(*Function_->subregion(), { 32, 1 }).output(0);
3689 for (
size_t i = 0; i < NumAllocaNodes_; i++)
3694 AllocaNodes_.push_back(allocaNode);
3698 MemoryStateMergeOperation::Create(std::vector{ latestMemoryState, allocaOutputs[1] });
3701 Function_->finalize({ latestMemoryState });
3703 GraphExport::Create(*Function_->output(),
"f");
3708std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3709EscapingLocalFunctionTest::SetupRvsdg()
3715 auto mt = MemoryStateType::Create();
3716 auto pointerType = PointerType::Create();
3718 { PointerType::Create(), MemoryStateType::Create() },
3719 { PointerType::Create(), MemoryStateType::Create() });
3721 { MemoryStateType::Create() },
3722 { PointerType::Create(), MemoryStateType::Create() });
3724 auto module = llvm::LlvmRvsdgModule::Create(util::FilePath(""), "", "");
3725 const auto graph = &
module->Rvsdg();
3728 &graph->GetRootRegion(),
3729 LlvmDeltaOperation::Create(uint32Type,
"global", Linkage::internalLinkage,
"",
false, 4));
3730 const auto constantZero =
3731 IntegerConstantOperation::Create(*Global_->subregion(), { 32, 0 }).output(0);
3732 const auto deltaOutput = &Global_->finalize(constantZero);
3735 graph->GetRootRegion(),
3738 LocalFuncParam_ = LocalFunc_->GetFunctionArguments()[0];
3740 const auto constantOne =
3741 IntegerConstantOperation::Create(*LocalFunc_->subregion(), { 32, 1 }).output(0);
3742 const auto allocaOutputs = AllocaOperation::create(uint32Type, constantOne, 4);
3746 rvsdg::Output * mergedMemoryState = MemoryStateMergeOperation::Create(
3747 std::vector<rvsdg::Output *>{ LocalFunc_->GetFunctionArguments()[1], allocaOutputs[1] });
3750 auto storeOutputs = StoreNonVolatileOperation::Create(
3753 { mergedMemoryState },
3757 const auto deltaOutputCtxVar = LocalFunc_->AddContextVar(*deltaOutput).inner;
3760 LocalFunc_->finalize({ deltaOutputCtxVar, storeOutputs[0] });
3762 LocalFuncRegister_ =
3767 graph->GetRootRegion(),
3771 Linkage::externalLinkage));
3773 const auto localFuncCtxVar = ExportedFunc_->AddContextVar(*LocalFuncRegister_).inner;
3776 ExportedFunc_->finalize({ localFuncCtxVar, ExportedFunc_->GetFunctionArguments()[0] });
3778 GraphExport::Create(*ExportedFunc_->output(),
"exportedFunc");
3783std::unique_ptr<llvm::LlvmRvsdgModule>
3784FreeNullTest::SetupRvsdg()
3790 { IOStateType::Create(), MemoryStateType::Create() },
3791 { IOStateType::Create(), MemoryStateType::Create() });
3793 auto module = llvm::LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
3794 auto graph = &
module->Rvsdg();
3797 graph->GetRootRegion(),
3799 auto iOStateArgument = LambdaMain_->GetFunctionArguments()[0];
3800 auto memoryStateArgument = LambdaMain_->GetFunctionArguments()[1];
3802 auto constantPointerNullResult =
3803 ConstantPointerNullOperation::createNode(*LambdaMain_->subregion()).output(0);
3805 auto & freeNode = FreeOperation::createNode(
3806 *constantPointerNullResult,
3808 { memoryStateArgument });
3810 LambdaMain_->finalize({ &FreeOperation::getIOStateOutput(freeNode),
3811 &*FreeOperation::memoryStateOutputs(freeNode).begin() });
3813 GraphExport::Create(*LambdaMain_->output(),
"main");
3818std::unique_ptr<llvm::LlvmRvsdgModule>
3819LambdaCallArgumentMismatch::SetupRvsdg()
3825 auto & rvsdg = rvsdgModule->Rvsdg();
3828 { IOStateType::Create(), MemoryStateType::Create() },
3830 auto variableArgumentType = VariableArgumentType::Create();
3833 variableArgumentType,
3834 IOStateType::Create(),
3835 MemoryStateType::Create() },
3838 auto setupLambdaG = [&]()
3840 auto iOStateType = IOStateType::Create();
3841 auto memoryStateType = MemoryStateType::Create();
3844 rvsdg.GetRootRegion(),
3846 auto iOStateArgument = lambda->GetFunctionArguments()[0];
3847 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
3849 auto five = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 5 }).output(0);
3851 return lambda->finalize({ five, iOStateArgument, memoryStateArgument });
3856 auto pointerType = PointerType::Create();
3857 auto iOStateType = IOStateType::Create();
3858 auto memoryStateType = MemoryStateType::Create();
3860 { IOStateType::Create(), MemoryStateType::Create() },
3864 rvsdg.GetRootRegion(),
3866 auto iOStateArgument = lambda->GetFunctionArguments()[0];
3867 auto memoryStateArgument = lambda->GetFunctionArguments()[1];
3868 auto lambdaGArgument = lambda->AddContextVar(lambdaG).inner;
3870 auto one = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 1 }).output(0);
3871 auto six = IntegerConstantOperation::Create(*lambda->subregion(), { 32, 6 }).output(0);
3873 auto vaList = VariadicArgumentListOperation::Create(*lambda->subregion(), {});
3877 auto memoryState = MemoryStateMergeOperation::Create(
3878 std::vector<rvsdg::Output *>{ memoryStateArgument, allocaResults[1] });
3881 StoreNonVolatileOperation::Create(allocaResults[0], six, { memoryState }, 4);
3883 auto loadResults = LoadNonVolatileOperation::Create(
3889 auto & call = CallOperation::CreateNode(
3892 { loadResults[0], vaList, iOStateArgument, loadResults[1] });
3894 auto lambdaOutput = lambda->finalize(outputs(&call));
3896 GraphExport::Create(*lambdaOutput,
"main");
3898 return std::make_tuple(lambdaOutput, &call);
3911 auto [lambdaMainOutput, call] = setupLambdaMain(*fn);
3918std::unique_ptr<llvm::LlvmRvsdgModule>
3919VariadicFunctionTest1::SetupRvsdg()
3923 auto rvsdgModule = LlvmRvsdgModule::Create(
util::FilePath(
""),
"",
"");
3924 auto & rvsdg = rvsdgModule->Rvsdg();
3926 auto pointerType = PointerType::Create();
3927 auto iOStateType = IOStateType::Create();
3928 auto memoryStateType = MemoryStateType::Create();
3929 auto varArgType = VariableArgumentType::Create();
3933 IOStateType::Create(),
3934 MemoryStateType::Create() },
3935 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() });
3937 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() },
3938 { IOStateType::Create(), MemoryStateType::Create() });
3940 { IOStateType::Create(), MemoryStateType::Create() },
3941 { IOStateType::Create(), MemoryStateType::Create() });
3944 ImportH_ = &LlvmGraphImport::createFunctionImport(
3948 Linkage::externalLinkage,
3954 rvsdg.GetRootRegion(),
3956 auto iArgument = LambdaF_->GetFunctionArguments()[0];
3957 auto iOStateArgument = LambdaF_->GetFunctionArguments()[1];
3958 auto memoryStateArgument = LambdaF_->GetFunctionArguments()[2];
3959 auto lambdaHArgument = LambdaF_->AddContextVar(*ImportH_).inner;
3961 auto one = IntegerConstantOperation::Create(*LambdaF_->subregion(), { 32, 1 }).output(0);
3962 auto three = IntegerConstantOperation::Create(*LambdaF_->subregion(), { 32, 3 }).output(0);
3964 auto varArgList = VariadicArgumentListOperation::Create(*LambdaF_->subregion(), { iArgument });
3966 CallH_ = &CallOperation::CreateNode(
3969 {
one, varArgList, iOStateArgument, memoryStateArgument });
3971 auto storeResults = StoreNonVolatileOperation::Create(
3974 { &CallOperation::GetMemoryStateOutput(*CallH_) },
3977 LambdaF_->finalize({ &CallOperation::GetIOStateOutput(*CallH_), storeResults[0] });
3983 rvsdg.GetRootRegion(),
3985 auto iOStateArgument = LambdaG_->GetFunctionArguments()[0];
3986 auto memoryStateArgument = LambdaG_->GetFunctionArguments()[1];
3987 auto lambdaFArgument = LambdaG_->AddContextVar(*LambdaF_->output()).inner;
3989 auto one = IntegerConstantOperation::Create(*LambdaG_->subregion(), { 32, 1 }).output(0);
3990 auto five = IntegerConstantOperation::Create(*LambdaG_->subregion(), { 32, 5 }).output(0);
3993 auto merge = MemoryStateMergeOperation::Create(
3994 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
3997 auto storeResults = StoreNonVolatileOperation::Create(allocaResults[0], five, { merge }, 4);
3999 auto & callF = CallOperation::CreateNode(
4002 { allocaResults[0], iOStateArgument, storeResults[0] });
4004 LambdaG_->finalize(outputs(&callF));
4010std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
4011VariadicFunctionTest2::SetupRvsdg()
4016 auto & rvsdg = rvsdgModule->Rvsdg();
4018 auto pointerType = PointerType::Create();
4019 auto structType = StructType::CreateIdentified(
4020 "struct.__va_list_tag",
4023 PointerType::Create(),
4024 PointerType::Create() },
4026 auto arrayType = ArrayType::Create(structType, 1);
4027 auto iOStateType = IOStateType::Create();
4028 auto memoryStateType = MemoryStateType::Create();
4029 auto varArgType = VariableArgumentType::Create();
4032 PointerType::Create(),
4033 IOStateType::Create(),
4034 MemoryStateType::Create() },
4035 { IOStateType::Create(), MemoryStateType::Create() });
4038 PointerType::Create(),
4039 IOStateType::Create(),
4040 MemoryStateType::Create() },
4041 { IOStateType::Create(), MemoryStateType::Create() });
4043 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() },
4044 { IOStateType::Create(), MemoryStateType::Create() });
4046 { PointerType::Create(), IOStateType::Create(), MemoryStateType::Create() },
4047 { IOStateType::Create(), MemoryStateType::Create() });
4052 { IOStateType::Create(), MemoryStateType::Create() },
4055 auto llvmLifetimeStart = &LlvmGraphImport::createFunctionImport(
4057 lambdaLlvmLifetimeStartType,
4058 "llvm.lifetime.start.p0",
4059 Linkage::externalLinkage,
4061 auto llvmLifetimeEnd = &LlvmGraphImport::createFunctionImport(
4063 lambdaLlvmLifetimeEndType,
4064 "llvm.lifetime.end.p0",
4065 Linkage::externalLinkage,
4067 auto llvmVaStart = &LlvmGraphImport::createFunctionImport(
4071 Linkage::externalLinkage,
4073 auto llvmVaEnd = &LlvmGraphImport::createFunctionImport(
4077 Linkage::externalLinkage,
4083 rvsdg.GetRootRegion(),
4085 auto iOStateArgument = LambdaFst_->GetFunctionArguments()[2];
4086 auto memoryStateArgument = LambdaFst_->GetFunctionArguments()[3];
4087 auto llvmLifetimeStartArgument = LambdaFst_->AddContextVar(*llvmLifetimeStart).inner;
4088 auto llvmLifetimeEndArgument = LambdaFst_->AddContextVar(*llvmLifetimeEnd).inner;
4089 auto llvmVaStartArgument = LambdaFst_->AddContextVar(*llvmVaStart).inner;
4090 auto llvmVaEndArgument = LambdaFst_->AddContextVar(*llvmVaEnd).inner;
4092 auto one = IntegerConstantOperation::Create(*LambdaFst_->subregion(), { 32, 1 }).output(0);
4094 IntegerConstantOperation::Create(*LambdaFst_->subregion(), { 64, 24 }).output(0);
4096 IntegerConstantOperation::Create(*LambdaFst_->subregion(), { 32, 41 }).output(0);
4098 auto allocaResults = AllocaOperation::create(arrayType,
one, 16);
4099 auto memoryState = MemoryStateMergeOperation::Create(
4100 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
4103 auto & callLLvmLifetimeStart = CallOperation::CreateNode(
4104 llvmLifetimeStartArgument,
4105 lambdaLlvmLifetimeStartType,
4106 { twentyFour, allocaResults[0], iOStateArgument, memoryState });
4107 auto & callVaStart = CallOperation::CreateNode(
4108 llvmVaStartArgument,
4111 &CallOperation::GetIOStateOutput(callLLvmLifetimeStart),
4112 &CallOperation::GetMemoryStateOutput(callLLvmLifetimeStart) });
4114 auto loadResults = LoadNonVolatileOperation::Create(
4116 { &CallOperation::GetMemoryStateOutput(callVaStart) },
4119 auto icmpResult = IntegerUltOperation::createNode(32, *loadResults[0], *fortyOne).output(0);
4123 auto gammaVaAddress = gammaNode->AddEntryVar(allocaResults[0]);
4124 auto gammaLoadResult = gammaNode->AddEntryVar(loadResults[0]);
4125 auto gammaMemoryState = gammaNode->AddEntryVar(loadResults[1]);
4128 auto zero = IntegerConstantOperation::Create(*gammaNode->subregion(0), { 64, 0 }).output(0);
4129 auto two = IntegerConstantOperation::Create(*gammaNode->subregion(0), { 32, 2 }).output(0);
4130 auto eight = IntegerConstantOperation::Create(*gammaNode->subregion(0), { 64, 8 }).output(0);
4132 GetElementPtrOperation::create(gammaVaAddress.branchArgument[0], { zero, two }, structType);
4133 auto loadResultsGamma0 = LoadNonVolatileOperation::Create(
4135 { gammaMemoryState.branchArgument[0] },
4140 auto storeResultsGamma0 =
4141 StoreNonVolatileOperation::Create(gepResult1, gepResult2, { loadResultsGamma0[1] }, 8);
4144 zero = IntegerConstantOperation::Create(*gammaNode->subregion(1), { 64, 0 }).output(0);
4146 IntegerConstantOperation::Create(*gammaNode->subregion(1), { 32, 8 }).output(0);
4147 auto three = IntegerConstantOperation::Create(*gammaNode->subregion(1), { 32, 3 }).output(0);
4148 gepResult1 = GetElementPtrOperation::create(
4149 gammaVaAddress.branchArgument[1],
4152 auto loadResultsGamma1 = LoadNonVolatileOperation::Create(
4154 { gammaMemoryState.branchArgument[1] },
4157 auto & zextResult = ZExtOperation::create(64, *gammaLoadResult.branchArgument[1]);
4158 gepResult2 = GetElementPtrOperation::create(
4159 loadResultsGamma1[0],
4163 IntegerAddOperation::createNode(32, *gammaLoadResult.branchArgument[1], *eightBit32)
4165 auto storeResultsGamma1 = StoreNonVolatileOperation::Create(
4166 gammaVaAddress.branchArgument[1],
4168 { loadResultsGamma1[1] },
4171 auto gammaAddress = gammaNode->AddExitVar({ loadResultsGamma0[0], gepResult2 });
4172 auto gammaOutputMemoryState =
4173 gammaNode->AddExitVar({ storeResultsGamma0[0], storeResultsGamma1[0] });
4175 loadResults = LoadNonVolatileOperation::Create(
4176 gammaAddress.output,
4177 { gammaOutputMemoryState.output },
4180 auto & callVaEnd = CallOperation::CreateNode(
4183 { allocaResults[0], &CallOperation::GetIOStateOutput(callVaStart), loadResults[1] });
4184 auto & callLLvmLifetimeEnd = CallOperation::CreateNode(
4185 llvmLifetimeEndArgument,
4186 lambdaLlvmLifetimeEndType,
4189 &CallOperation::GetIOStateOutput(callVaEnd),
4190 &CallOperation::GetMemoryStateOutput(callVaEnd) });
4192 LambdaFst_->finalize({ loadResults[0],
4193 &CallOperation::GetIOStateOutput(callLLvmLifetimeEnd),
4194 &CallOperation::GetMemoryStateOutput(callLLvmLifetimeEnd) });
4200 rvsdg.GetRootRegion(),
4202 auto iOStateArgument = LambdaG_->GetFunctionArguments()[0];
4203 auto memoryStateArgument = LambdaG_->GetFunctionArguments()[1];
4204 auto lambdaFstArgument = LambdaG_->AddContextVar(*LambdaFst_->output()).inner;
4206 auto zero = IntegerConstantOperation::Create(*LambdaG_->subregion(), { 32, 0 }).output(0);
4207 auto one = IntegerConstantOperation::Create(*LambdaG_->subregion(), { 32, 1 }).output(0);
4208 auto two = IntegerConstantOperation::Create(*LambdaG_->subregion(), { 32, 2 }).output(0);
4209 auto three = IntegerConstantOperation::Create(*LambdaG_->subregion(), { 32, 3 }).output(0);
4212 VariadicArgumentListOperation::Create(*LambdaG_->subregion(), { zero, one, two });
4214 auto & callFst = CallOperation::CreateNode(
4217 { three, vaListResult, iOStateArgument, memoryStateArgument });
4219 LambdaG_->finalize(outputs(&callFst));
static std::vector< rvsdg::Output * > create(std::shared_ptr< const rvsdg::Type > allocatedType, rvsdg::Output *count, const size_t alignment)
static jlm::rvsdg::Output * create(jlm::rvsdg::Output *operand, std::shared_ptr< const jlm::rvsdg::Type > rtype)
jlm::rvsdg::LambdaNode * lambda
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::LambdaNode * LambdaTest_
rvsdg::SimpleNode * CallNode_
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
rvsdg::Node * BitsToPtrNode_
jlm::rvsdg::LambdaNode * LambdaBits2Ptr_
static rvsdg::Output & GetMemoryStateOutput(const rvsdg::Node &node) noexcept
static rvsdg::SimpleNode & CreateNode(rvsdg::Region ®ion, std::unique_ptr< CallOperation > callOperation, const std::vector< rvsdg::Output * > &operands)
static rvsdg::Output & GetIOStateOutput(const rvsdg::Node &node) noexcept
rvsdg::SimpleNode * CallF_
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
rvsdg::SimpleNode * CallG_
rvsdg::SimpleNode * alloca_y
rvsdg::SimpleNode * alloca_z
jlm::rvsdg::LambdaNode * lambda_g
jlm::rvsdg::LambdaNode * lambda_f
rvsdg::SimpleNode * alloca_x
jlm::rvsdg::LambdaNode * lambda_h
jlm::rvsdg::LambdaNode * lambda_test
rvsdg::SimpleNode * CallCreate1_
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
rvsdg::SimpleNode * CallDestroy1_
rvsdg::SimpleNode * CallCreate2_
jlm::rvsdg::LambdaNode * lambda_create
jlm::rvsdg::LambdaNode * lambda_destroy
rvsdg::SimpleNode * malloc
rvsdg::SimpleNode * CallDestroy2_
static rvsdg::Node & createNode(rvsdg::Region ®ion)
jlm::rvsdg::LambdaNode * lambda
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
rvsdg::Node * constantPointerNullNode
jlm::rvsdg::GraphImport * ExternalGArgument_
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::LambdaNode * LambdaF_
rvsdg::SimpleNode * CallG_
jlm::rvsdg::LambdaNode * LambdaG_
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::RegionArgument * ExternalFArgument_
rvsdg::SimpleNode * CallF_
static rvsdg::Node::OutputIteratorRange memoryStateOutputs(const rvsdg::Node &node) noexcept
static rvsdg::Output & getIOStateOutput(const rvsdg::Node &node) noexcept
static rvsdg::SimpleNode & createNode(rvsdg::Output &pointer, rvsdg::Output &iOState, const std::vector< rvsdg::Output * > &memoryStates)
std::unique_ptr< llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::LambdaNode * lambda
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
static rvsdg::Output * create(rvsdg::Output *baseAddress, const std::vector< rvsdg::Output * > &indices, std::shared_ptr< const rvsdg::Type > gepType)
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
rvsdg::Node * getElementPtrX
rvsdg::Node * getElementPtrY
jlm::rvsdg::LambdaNode * lambda
static std::shared_ptr< const IOStateType > Create()
jlm::rvsdg::LambdaNode * LambdaIndcall_
rvsdg::SimpleNode * CallFour_
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::LambdaNode * LambdaFour_
rvsdg::SimpleNode * CallIndcall_
jlm::rvsdg::LambdaNode * LambdaTest_
jlm::rvsdg::LambdaNode * LambdaThree_
rvsdg::SimpleNode * CallThree_
rvsdg::SimpleNode * CallIWithThree_
rvsdg::SimpleNode * IndirectCall_
jlm::rvsdg::SimpleNode * AllocaPx_
rvsdg::SimpleNode * CallIWithFour_
jlm::rvsdg::DeltaNode * DeltaG1_
jlm::rvsdg::SimpleNode * AllocaPy_
jlm::rvsdg::LambdaNode * LambdaThree_
rvsdg::SimpleNode * TestCallX_
rvsdg::SimpleNode * CallY_
rvsdg::SimpleNode * Test2CallX_
jlm::rvsdg::LambdaNode * LambdaY_
jlm::rvsdg::SimpleNode * AllocaPz_
jlm::rvsdg::LambdaNode * LambdaFour_
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::LambdaNode * LambdaTest_
jlm::rvsdg::LambdaNode * LambdaTest2_
jlm::rvsdg::LambdaNode * LambdaX_
jlm::rvsdg::LambdaNode * LambdaI_
jlm::rvsdg::DeltaNode * DeltaG2_
static std::unique_ptr< ThreeAddressCode > create(const Variable *argument)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & Create(rvsdg::Region ®ion, IntegerValueRepresentation representation)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static std::unique_ptr< LlvmDeltaOperation > Create(std::shared_ptr< const rvsdg::Type > type, const std::string &name, const Linkage &linkage, std::string section, bool constant, const size_t alignment)
static LlvmGraphImport & createGlobalImport(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::Type > valueType, std::shared_ptr< const rvsdg::Type > importedType, std::string name, Linkage linkage, const bool isConstant, const size_t alignment)
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)
static std::unique_ptr< LlvmRvsdgModule > Create(const util::FilePath &sourceFileName, const std::string &targetTriple, const std::string &dataLayout)
rvsdg::Node * UndefValueNode_
jlm::rvsdg::LambdaNode * Lambda_
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
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
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
rvsdg::SimpleNode * load_a
rvsdg::SimpleNode * alloca_p
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::LambdaNode * lambda
rvsdg::SimpleNode * alloca_y
rvsdg::SimpleNode * load_x
rvsdg::SimpleNode * alloca_a
rvsdg::SimpleNode * alloca_x
rvsdg::SimpleNode * alloca_b
static rvsdg::Output & addressOutput(const rvsdg::Node &node)
static rvsdg::Output & memoryStateOutput(const rvsdg::Node &node)
static rvsdg::SimpleNode & createNode(rvsdg::Output &size, rvsdg::Output &ioState)
static rvsdg::Output & ioStateOutput(const rvsdg::Node &node)
static rvsdg::Output * Create(const std::vector< rvsdg::Output * > &operands)
static std::shared_ptr< const MemoryStateType > Create()
static std::shared_ptr< const PointerType > Create()
const rvsdg::Graph & graph()
static std::unique_ptr< llvm::ThreeAddressCode > Create(const Variable *address, const Variable *value, const Variable *state, size_t alignment)
rvsdg::SimpleNode * alloca_c
rvsdg::SimpleNode * alloca_a
rvsdg::SimpleNode * alloca_d
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::LambdaNode * lambda
rvsdg::SimpleNode * alloca_b
rvsdg::SimpleNode * alloca_p
jlm::rvsdg::LambdaNode * lambda
rvsdg::SimpleNode * alloca_y
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
rvsdg::SimpleNode * alloca_x
rvsdg::SimpleNode * alloca_b
rvsdg::SimpleNode * alloca_a
static std::shared_ptr< const StructType > CreateIdentified(const std::string &name, std::vector< std::shared_ptr< const Type > > types, bool isPacked)
static jlm::rvsdg::Output * Create(rvsdg::Region ®ion, std::shared_ptr< const jlm::rvsdg::Type > type)
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)
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 nalternatives)
Region & GetRootRegion() const noexcept
rvsdg::Output * finalize(const std::vector< jlm::rvsdg::Output * > &results)
std::vector< rvsdg::Output * > GetFunctionArguments() const
ContextVar AddContextVar(jlm::rvsdg::Output &origin)
Adds a context/free variable to the lambda node.
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
rvsdg::Output * output() const noexcept
rvsdg::Region * subregion() const noexcept
LambdaOperation & GetOperation() const noexcept override
const std::shared_ptr< const FunctionType > & Type() const noexcept
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
PhiNode::ContextVar AddContextVar(jlm::rvsdg::Output &origin)
PhiNode::FixVar AddFixVar(std::shared_ptr< const jlm::rvsdg::Type > type)
void begin(rvsdg::Region *parent)
rvsdg::Region * subregion() const noexcept
A phi node represents the fixpoint of mutually recursive definitions.
Represents the argument of a region.
Represent acyclic RVSDG subgraphs.
static ThetaNode * create(rvsdg::Region *parent)
Global memory state passed between functions.
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
rvsdg::Output * inner
Access to bound object in subregion.