27 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
44 auto constantOne = &BitConstantOperation::create(*fct->subregion(), { 32, 1 });
52 std::vector<jlm::rvsdg::Output *>{ d[1], fct->GetFunctionArguments()[0] });
64 fct->finalize({ c_amp_d[0] });
66 GraphExport::Create(*fct->output(),
"f");
72 this->
size = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*constantOne);
74 this->
alloca_a = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*a[0]);
75 this->
alloca_b = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*b[0]);
76 this->
alloca_c = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*c[0]);
77 this->
alloca_d = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*d[0]);
82 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
99 auto constantOne = &BitConstantOperation::create(*fct->subregion(), { 32, 1 });
108 std::vector<jlm::rvsdg::Output *>{ a[1], fct->GetFunctionArguments()[0] });
123 fct->finalize({ p_amp_y[0] });
125 GraphExport::Create(*fct->output(),
"f");
131 this->
size = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*constantOne);
133 this->
alloca_a = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*a[0]);
134 this->
alloca_b = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*b[0]);
135 this->alloca_x = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*x[0]);
136 this->alloca_y = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*y[0]);
137 this->alloca_p = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*p[0]);
142 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
150 auto intType = BitType::Create(32);
163 fct->GetFunctionArguments()[0],
164 { fct->GetFunctionArguments()[1] },
171 GraphExport::Create(*fct->output(),
"f");
177 this->load_p = rvsdg::TryGetOwnerNode<rvsdg::Node>(*ld1[0]);
178 this->load_x = rvsdg::TryGetOwnerNode<rvsdg::Node>(*ld2[0]);
183 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
201 auto constantOne = &BitConstantOperation::create(*fct->subregion(), { 32, 1 });
210 std::vector<jlm::rvsdg::Output *>{ a[1], fct->GetFunctionArguments()[0] });
228 fct->finalize({ y_star_p[0] });
230 GraphExport::Create(*fct->output(),
"f");
236 this->
size = rvsdg::TryGetOwnerNode<rvsdg::Node>(*constantOne);
238 this->
alloca_a = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*a[0]);
239 this->
alloca_b = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*b[0]);
240 this->alloca_x = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*x[0]);
241 this->alloca_y = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*y[0]);
242 this->alloca_p = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*p[0]);
244 this->load_x = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*ld1[0]);
245 this->load_a = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*ld2[0]);
250 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
263 auto & rvsdg = rvsdgModule->Rvsdg();
266 rvsdg.GetRootRegion(),
272 { Lambda_->GetFunctionArguments()[0] },
276 Lambda_->finalize(loadResults);
277 GraphExport::Create(*Lambda_->output(),
"f");
282 UndefValueNode_ = rvsdg::TryGetOwnerNode<rvsdg::Node>(*undefValue);
287 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
308 auto zero = &BitConstantOperation::create(*fct->subregion(), { 32, 0 });
309 auto one = &BitConstantOperation::create(*fct->subregion(), { 32, 1 });
315 { fct->GetFunctionArguments()[1] },
325 fct->finalize({ sum, ldy[1] });
327 GraphExport::Create(*fct->output(),
"f");
334 this->getElementPtrX = rvsdg::TryGetOwnerNode<rvsdg::Node>(*gepx);
335 this->getElementPtrY = rvsdg::TryGetOwnerNode<rvsdg::Node>(*gepy);
340 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
358 fct->finalize({ cast });
360 GraphExport::Create(*fct->output(),
"f");
364 this->bitCast = rvsdg::TryGetOwnerNode<rvsdg::Node>(*cast);
369 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
378 auto setupBit2PtrFunction = [&]()
398 return std::make_tuple(
lambda, rvsdg::TryGetOwnerNode<rvsdg::Node>(*cast));
420 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*b2p).GetOperation().Type(),
421 { valueArgument, iOStateArgument, memoryStateArgument });
427 return std::make_tuple(
lambda, &call);
430 auto [lambdaBits2Ptr, bitsToPtrNode] = setupBit2PtrFunction();
431 auto [lambdaTest, callNode] = setupTestFunction(lambdaBits2Ptr->output());
434 this->LambdaBits2Ptr_ = lambdaBits2Ptr;
435 this->LambdaTest_ = lambdaTest;
437 this->BitsToPtrNode_ = bitsToPtrNode;
439 this->CallNode_ = callNode;
444 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
463 auto constantPointerNullResult =
466 fct->GetFunctionArguments()[0],
467 constantPointerNullResult,
468 { fct->GetFunctionArguments()[1] },
471 fct->finalize({ st[0] });
473 GraphExport::Create(*fct->output(),
"f");
479 this->constantPointerNullNode = rvsdg::TryGetOwnerNode<rvsdg::Node>(*constantPointerNullResult);
484 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
515 { memoryStateArgument },
553 { memoryStateArgument },
586 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
593 std::vector<jlm::rvsdg::Output *>({ x[1], memoryStateArgument }));
597 auto five = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 5 });
598 auto six = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 6 });
599 auto seven = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 7 });
608 { x[0], y[0], iOStateArgument, stz[0] });
611 g->GetOperation().Type(),
614 &CallOperation::GetIOStateOutput(callF),
615 &CallOperation::GetMemoryStateOutput(callF) });
624 auto allocaX = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*x[0]);
625 auto allocaY = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*y[0]);
626 auto allocaZ = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*z[0]);
628 return std::make_tuple(
lambda, allocaX, allocaY, allocaZ, &callF, &callG);
631 auto lambdaF = SetupF();
632 auto lambdaG = SetupG();
633 auto [lambdaH, allocaX, allocaY, allocaZ, callF, callG] = SetupH(lambdaF, lambdaG);
638 this->lambda_f = lambdaF;
639 this->lambda_g = lambdaG;
640 this->lambda_h = lambdaH;
642 this->alloca_x = allocaX;
643 this->alloca_y = allocaY;
644 this->alloca_z = allocaZ;
646 this->CallF_ = callF;
647 this->CallG_ = callG;
652 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
661 auto SetupCreate = [&]()
677 auto four = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 4 });
687 return std::make_tuple(
lambda, &mallocNode);
690 auto SetupDestroy = [&]()
711 auto freeNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*freeResults[0]);
712 return std::make_tuple(
lambda, freeNode);
732 auto six = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 6 });
733 auto seven = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 7 });
738 { six, iOStateArgument, memoryStateArgument });
743 &CallOperation::GetIOStateOutput(create1),
744 &CallOperation::GetMemoryStateOutput(create1) });
748 lambdaDestroy->GetOperation().Type(),
750 &CallOperation::GetIOStateOutput(create2),
751 &CallOperation::GetMemoryStateOutput(create2) });
754 lambdaDestroy->GetOperation().Type(),
756 &CallOperation::GetIOStateOutput(destroy1),
757 &CallOperation::GetMemoryStateOutput(destroy1) });
763 return std::make_tuple(
lambda, &create1, &create2, &destroy1, &destroy2);
766 auto [lambdaCreate, mallocNode] = SetupCreate();
767 auto [lambdaDestroy, freeNode] = SetupDestroy();
768 auto [lambdaTest, callCreate1, callCreate2, callDestroy1, callDestroy2] =
769 SetupTest(lambdaCreate, lambdaDestroy);
774 this->lambda_create = lambdaCreate;
775 this->lambda_destroy = lambdaDestroy;
776 this->lambda_test = lambdaTest;
778 this->malloc = mallocNode;
779 this->free = freeNode;
781 this->CallCreate1_ = callCreate1;
782 this->CallCreate2_ = callCreate2;
784 this->CallDestroy1_ = callCreate1;
785 this->CallDestroy2_ = callCreate2;
790 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
806 auto SetupConstantFunction = [&](ssize_t n,
const std::string & name)
814 auto constant = &BitConstantOperation::create(*
lambda->
subregion(), { 32, n });
816 return lambda->
finalize({ constant, iOStateArgument, memoryStateArgument });
819 auto SetupIndirectCallFunction = [&]()
831 auto functionOfPointer =
832 rvsdg::CreateOpNode<PointerToFunctionOperation>({ pointerArgument }, constantFunctionType)
839 constantFunctionType,
840 { iOStateArgument, memoryStateArgument });
844 return std::make_tuple(lambdaOutput, &call);
847 auto SetupTestFunction =
866 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*fctindcall).GetOperation().Type(),
867 { fctfour_cv, iOStateArgument, memoryStateArgument });
870 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*fctindcall).GetOperation().Type(),
872 &CallOperation::GetIOStateOutput(call_four),
873 &CallOperation::GetMemoryStateOutput(call_four) });
882 return std::make_tuple(lambdaOutput, &call_three, &call_four);
885 auto fctfour = SetupConstantFunction(4,
"four");
886 auto fctthree = SetupConstantFunction(3,
"three");
887 auto [fctindcall, callIndirectFunction] = SetupIndirectCallFunction();
888 auto [fcttest, callFunctionThree, callFunctionFour] = SetupTestFunction(
890 rvsdg::CreateOpNode<FunctionToPointerOperation>({ fctthree }, constantFunctionType).output(0),
891 rvsdg::CreateOpNode<FunctionToPointerOperation>({ fctfour }, constantFunctionType).output(0));
896 this->LambdaThree_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*fctthree);
897 this->LambdaFour_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*fctfour);
898 this->LambdaIndcall_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*fctindcall);
899 this->LambdaTest_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*fcttest);
901 this->CallIndcall_ = callIndirectFunction;
902 this->CallThree_ = callFunctionThree;
903 this->CallFour_ = callFunctionFour;
908 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
936 auto constant = &BitConstantOperation::create(*delta->subregion(), { 32, 1 });
938 return &delta->finalize(constant);
953 auto constant = &BitConstantOperation::create(*delta->subregion(), { 32, 2 });
955 return &delta->finalize(constant);
958 auto SetupConstantFunction = [&](ssize_t n,
const std::string & name)
966 auto constant = &BitConstantOperation::create(*
lambda->
subregion(), { 32, n });
968 return lambda->
finalize({ constant, iOStateArgument, memoryStateArgument });
988 rvsdg::CreateOpNode<PointerToFunctionOperation>({ pointerArgument }, constantFunctionType)
990 constantFunctionType,
991 { iOStateArgument, memoryStateArgument });
995 return std::make_tuple(lambdaOutput, &call);
998 auto SetupIndirectCallFunction = [&](ssize_t n,
999 const std::string & name,
1018 auto argumentFunctionPtr = rvsdg::CreateOpNode<FunctionToPointerOperation>(
1019 { argumentFunctionCv },
1020 constantFunctionType)
1023 auto five = &BitConstantOperation::create(*
lambda->
subregion(), { 32, n });
1030 { argumentFunctionPtr, iOStateArgument, storeNode[0] });
1034 return std::make_tuple(lambdaOutput, &call);
1057 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
1063 std::vector<jlm::rvsdg::Output *>{ pxAlloca[1], memoryStateArgument });
1065 std::vector<jlm::rvsdg::Output *>({ pyAlloca[1], pxMerge }));
1069 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(functionX).GetOperation().
Type(),
1070 { pxAlloca[0], iOStateArgument, pyMerge });
1074 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(functionY).GetOperation().
Type(),
1097 GraphExport::Create(*lambdaOutput,
"test");
1099 return std::make_tuple(
1103 jlm::util::assertedCast<rvsdg::SimpleNode>(
1104 rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*pxAlloca[0])),
1105 jlm::util::assertedCast<rvsdg::SimpleNode>(
1106 rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*pyAlloca[0])));
1121 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
1125 std::vector<jlm::rvsdg::Output *>{ pzAlloca[1], memoryStateArgument });
1131 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(functionX).GetOperation().
Type(),
1132 { pzAlloca[0], iOStateArgument, pzMerge });
1135 GraphExport::Create(*lambdaOutput,
"test2");
1137 return std::make_tuple(
1140 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
1141 rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*pzAlloca[0])));
1144 auto deltaG1 = SetupG1();
1145 auto deltaG2 = SetupG2();
1146 auto lambdaThree = SetupConstantFunction(3,
"three");
1147 auto lambdaFour = SetupConstantFunction(4,
"four");
1148 auto [lambdaI, indirectCall] = SetupI();
1149 auto [lambdaX, callIWithThree] = SetupIndirectCallFunction(5,
"x", *lambdaI, *lambdaThree);
1150 auto [lambdaY, callIWithFour] = SetupIndirectCallFunction(6,
"y", *lambdaI, *lambdaFour);
1151 auto [lambdaTest, testCallX, callY, allocaPx, allocaPy] =
1152 SetupTestFunction(*lambdaX, *lambdaY, *deltaG1, *deltaG2);
1153 auto [lambdaTest2, test2CallX, allocaPz] = SetupTest2Function(*lambdaX);
1158 this->DeltaG1_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaG1);
1159 this->DeltaG2_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaG2);
1160 this->LambdaThree_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaThree);
1161 this->LambdaFour_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaFour);
1162 this->LambdaI_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaI);
1163 this->LambdaX_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaX);
1164 this->LambdaY_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaY);
1165 this->LambdaTest_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaTest);
1166 this->LambdaTest2_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaTest2);
1168 this->IndirectCall_ = indirectCall;
1169 this->CallIWithThree_ = callIWithThree;
1170 this->CallIWithFour_ = callIWithFour;
1171 this->TestCallX_ = testCallX;
1172 this->Test2CallX_ = test2CallX;
1173 this->CallY_ = callY;
1175 this->AllocaPx_ = allocaPx;
1176 this->AllocaPy_ = allocaPy;
1177 this->AllocaPz_ = allocaPz;
1182 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1189 auto rvsdg = &rvsdgModule->Rvsdg();
1201 auto SetupFunctionGDeclaration = [&]()
1224 rvsdg->GetRootRegion(),
1233 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
1239 std::vector<jlm::rvsdg::Output *>{ allocaPath[1], memoryStateArgument });
1241 std::vector<jlm::rvsdg::Output *>({ allocaMode[1], mergePath }));
1255 { loadPath[0], loadMode[0], iOStateArgument, loadMode[1] });
1260 return std::make_tuple(
lambda, &callG);
1263 this->ExternalGArgument_ = SetupFunctionGDeclaration();
1264 auto [lambdaF, callG] = SetupFunctionF(ExternalGArgument_);
1266 this->LambdaF_ = lambdaF;
1267 this->CallG_ = callG;
1272 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1278 auto & rvsdg = rvsdgModule->Rvsdg();
1312 lambdaLlvmLifetimeStartType,
1313 "llvm.lifetime.start.p0",
1318 lambdaLlvmLifetimeEndType,
1319 "llvm.lifetime.end.p0",
1331 rvsdg.GetRootRegion(),
1333 auto iOStateArgument = LambdaG_->GetFunctionArguments()[0];
1334 auto memoryStateArgument = LambdaG_->GetFunctionArguments()[1];
1335 auto llvmLifetimeStartArgument = LambdaG_->AddContextVar(*llvmLifetimeStart).inner;
1336 auto llvmLifetimeEndArgument = LambdaG_->AddContextVar(*llvmLifetimeEnd).inner;
1337 auto lambdaFArgument = LambdaG_->AddContextVar(*ExternalFArgument_).inner;
1344 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
1347 llvmLifetimeStartArgument,
1348 lambdaLlvmLifetimeStartType,
1349 { twentyFour, allocaResults[0], iOStateArgument, memoryState });
1377 auto storeResults1 =
1382 auto storeResults2 =
1386 llvmLifetimeEndArgument,
1387 lambdaLlvmLifetimeEndType,
1391 storeResults2[0] });
1393 LambdaG_->finalize(
outputs(&callLLvmLifetimeEnd));
1398 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1422 auto zero = &BitConstantOperation::create(*fct->subregion(), { 32, 0 });
1424 auto & predicateNode = MatchOperation::CreateNode(*biteq, { { 0, 1 } }, 0, 2);
1426 auto gammanode = GammaNode::create(predicateNode.output(0), 2);
1427 auto p1ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[1]);
1428 auto p2ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[2]);
1429 auto p3ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[3]);
1430 auto p4ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[4]);
1432 auto tmp1 = gammanode->AddExitVar({ p1ev.branchArgument[0], p3ev.branchArgument[1] });
1433 auto tmp2 = gammanode->AddExitVar({ p2ev.branchArgument[0], p4ev.branchArgument[1] });
1437 { fct->GetFunctionArguments()[5] },
1444 fct->finalize({ sum, ld2[1] });
1446 GraphExport::Create(*fct->output(),
"f");
1452 this->gamma = gammanode;
1457 std::unique_ptr<llvm::LlvmRvsdgModule>
1464 auto rvsdg = &rvsdgModule->Rvsdg();
1466 auto SetupLambdaF = [&]()
1476 auto gammaInputX = gammaNode->AddEntryVar(xAddress);
1477 auto gammaInputY = gammaNode->AddEntryVar(yAddress);
1478 auto gammaInputZ = gammaNode->AddEntryVar(zAddress);
1479 auto gammaInputMemoryState = gammaNode->AddEntryVar(memoryState);
1483 gammaInputX.branchArgument[0],
1484 { gammaInputMemoryState.branchArgument[0] },
1488 auto one = &BitConstantOperation::create(*gammaNode->subregion(0), { 32, 1 });
1490 gammaInputZ.branchArgument[0],
1492 { loadXResults[1] },
1497 gammaInputY.branchArgument[1],
1498 { gammaInputMemoryState.branchArgument[1] },
1502 auto two = &BitConstantOperation::create(*gammaNode->subregion(1), { 32, 2 });
1504 gammaInputZ.branchArgument[1],
1506 { loadYResults[1] },
1510 auto gammaOutputA = gammaNode->AddExitVar({ loadXResults[0], loadYResults[0] });
1511 auto gammaOutputMemoryState =
1512 gammaNode->AddExitVar({ storeZRegion0Results[0], storeZRegion1Results[0] });
1514 return std::make_tuple(gammaOutputA.output, gammaOutputMemoryState.output);
1529 rvsdg->GetRootRegion(),
1537 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
1542 std::vector<jlm::rvsdg::Output *>{ allocaZResults[1], memoryStateArgument });
1545 auto storeZResults =
1548 auto zero = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 0 });
1550 auto & predicateNode = MatchOperation::CreateNode(*bitEq, { { 0, 1 } }, 0, 2);
1552 auto [gammaOutputA, gammaOutputMemoryState] =
1553 SetupGamma(predicateNode.output(0), xArgument, yArgument, allocaZResults[0], memoryState);
1557 { gammaOutputMemoryState },
1565 return std::make_tuple(
1567 &rvsdg::AssertGetOwnerNode<jlm::rvsdg::GammaNode>(*gammaOutputA),
1568 rvsdg::TryGetOwnerNode<rvsdg::Node>(*allocaZResults[0]));
1575 const char * functionName)
1585 rvsdg->GetRootRegion(),
1591 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 4 });
1597 std::vector<jlm::rvsdg::Output *>{ allocaXResults[1], memoryStateArgument });
1599 std::vector<jlm::rvsdg::Output *>({ allocaYResults[1], memoryState }));
1601 auto predicate = &BitConstantOperation::create(*
lambda->
subregion(), { 32, cValue });
1602 auto x = &BitConstantOperation::create(*
lambda->
subregion(), { 32, xValue });
1603 auto y = &BitConstantOperation::create(*
lambda->
subregion(), { 32, yValue });
1605 auto storeXResults =
1608 auto storeYResults =
1613 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(lambdaF).GetOperation().
Type(),
1614 { predicate, allocaXResults[0], allocaYResults[0], iOStateArgument, storeYResults[0] });
1619 return std::make_tuple(
1622 rvsdg::TryGetOwnerNode<rvsdg::Node>(*allocaXResults[0]),
1623 rvsdg::TryGetOwnerNode<rvsdg::Node>(*allocaYResults[1]));
1626 auto [lambdaF, gammaNode, allocaZ] = SetupLambdaF();
1627 auto [lambdaG, callFromG, allocaXFromG, allocaYFromG] = SetupLambdaGH(*lambdaF, 0, 1, 2,
"g");
1628 auto [lambdaH, callFromH, allocaXFromH, allocaYFromH] = SetupLambdaGH(*lambdaF, 1, 3, 4,
"h");
1631 this->LambdaF_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaF);
1632 this->LambdaG_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaG);
1633 this->LambdaH_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaH);
1635 this->Gamma_ = gammaNode;
1637 this->CallFromG_ = callFromG;
1638 this->CallFromH_ = callFromH;
1640 this->AllocaXFromG_ = allocaXFromG;
1641 this->AllocaYFromG_ = allocaYFromG;
1642 this->AllocaXFromH_ = allocaXFromH;
1643 this->AllocaYFromH_ = allocaYFromH;
1644 this->AllocaZ_ = allocaZ;
1649 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1671 auto zero = &BitConstantOperation::create(*fct->subregion(), { 32, 0 });
1675 auto n = thetanode->AddLoopVar(zero);
1676 auto l = thetanode->AddLoopVar(fct->GetFunctionArguments()[0]);
1677 auto a = thetanode->AddLoopVar(fct->GetFunctionArguments()[1]);
1678 auto c = thetanode->AddLoopVar(fct->GetFunctionArguments()[2]);
1679 auto s = thetanode->AddLoopVar(fct->GetFunctionArguments()[3]);
1684 auto one = &BitConstantOperation::create(*thetanode->subregion(), { 32, 1 });
1687 auto & predicateNode = MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);
1689 n.post->divert_to(sum);
1690 s.post->divert_to(store[0]);
1691 thetanode->set_predicate(predicateNode.output(0));
1693 fct->finalize({ s.output });
1694 GraphExport::Create(*fct->output(),
"f");
1700 this->theta = thetanode;
1701 this->gep = rvsdg::TryGetOwnerNode<rvsdg::Node>(*gepnode);
1706 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1715 auto SetupGlobalF = [&]()
1727 auto constant = &BitConstantOperation::create(*dfNode->subregion(), { 32, 0 });
1729 return &dfNode->finalize(constant);
1732 auto SetupFunctionG = [&]()
1750 { memoryStateArgument },
1774 auto five = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 5 });
1778 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*g).GetOperation().Type(),
1779 { cvf, iOStateArgument, st[0] });
1784 return std::make_tuple(lambdaOutput, &callG, rvsdg::TryGetOwnerNode<rvsdg::Node>(*five));
1787 auto f = SetupGlobalF();
1788 auto g = SetupFunctionG();
1789 auto [h, callFunctionG, constantFive] = SetupFunctionH(f, g);
1794 this->lambda_g = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*g);
1795 this->lambda_h = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*h);
1797 this->delta_f = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*f);
1799 this->CallG_ = callFunctionG;
1800 this->constantFive = constantFive;
1805 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1814 auto SetupD1 = [&]()
1826 auto constant = &BitConstantOperation::create(*delta->subregion(), { 32, 0 });
1828 return &delta->finalize(constant);
1831 auto SetupD2 = [&]()
1843 auto constant = &BitConstantOperation::create(*delta->subregion(), { 32, 0 });
1845 return &delta->finalize(constant);
1863 auto b2 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 2 });
1887 auto b5 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 5 });
1888 auto b42 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 42 });
1892 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*f1).GetOperation().Type(),
1893 { iOStateArgument, st[0] });
1901 GraphExport::Create(*lambdaOutput,
"f2");
1903 return std::make_tuple(lambdaOutput, &call);
1906 auto d1 = SetupD1();
1907 auto d2 = SetupD2();
1908 auto f1 = SetupF1(d1);
1909 auto [f2, callF1] = SetupF2(f1, d1, d2);
1912 this->lambda_f1 = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*f1);
1913 this->lambda_f2 = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*f2);
1915 this->delta_d1 = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*d1);
1916 this->delta_d2 = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*d2);
1918 this->CallF1_ = callF1;
1923 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1932 auto SetupG1 = [&]()
1944 auto constant = &BitConstantOperation::create(*delta->subregion(), { 32, 1 });
1946 return &delta->finalize(constant);
1963 auto ctxVar = delta->AddContextVar(g1);
1965 return &delta->finalize(ctxVar.inner);
1986 { memoryStateArgument },
1999 return lambda->
finalize({ truncResult, iOStateArgument, loadResults[1] });
2020 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(lambdaF).GetOperation().
Type(),
2021 { iOStateArgument, memoryStateArgument });
2025 GraphExport::Create(*lambdaOutput,
"test");
2027 return std::make_tuple(lambdaOutput, &call);
2030 auto g1 = SetupG1();
2031 auto g2 = SetupG2(*g1);
2032 auto f = SetupF(*g1, *g2);
2033 auto [test, callF] = SetupTest(*f);
2038 this->LambdaF_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*f);
2039 this->LambdaTest_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*test);
2041 this->DeltaG1_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*g1);
2042 this->DeltaG2_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*g2);
2044 this->CallF_ = callF;
2049 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2074 auto b5 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 5 });
2097 auto b2 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 2 });
2098 auto b21 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 21 });
2102 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*f1).GetOperation().Type(),
2103 { iOStateArgument, st[0] });
2113 return std::make_tuple(lambdaOutput, &call);
2118 BitType::Create(32),
2133 auto f1 = SetupF1(d1);
2134 auto [f2, callF1] = SetupF2(f1, d1, d2);
2137 this->lambda_f1 = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*f1);
2138 this->lambda_f2 = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*f2);
2140 this->CallF1_ = callF1;
2142 this->import_d1 = d1;
2143 this->import_d2 = d2;
2148 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2166 auto SetupFib = [&]()
2172 auto fibrv = pb.
AddFixVar(fibFunctionType);
2183 auto two = &BitConstantOperation::create(*
lambda->
subregion(), { 64, 2 });
2185 auto & predicateNode = MatchOperation::CreateNode(*bitult, { { 0, 1 } }, 0, 2);
2187 auto gammaNode = GammaNode::create(predicateNode.output(0), 2);
2188 auto nev = gammaNode->AddEntryVar(valueArgument);
2189 auto resultev = gammaNode->AddEntryVar(pointerArgument);
2190 auto fibev = gammaNode->AddEntryVar(ctxVarFib);
2191 auto gIIoState = gammaNode->AddEntryVar(iOStateArgument);
2192 auto gIMemoryState = gammaNode->AddEntryVar(memoryStateArgument);
2195 auto one = &BitConstantOperation::create(*gammaNode->subregion(0), { 64, 1 });
2198 fibev.branchArgument[0],
2201 resultev.branchArgument[0],
2202 gIIoState.branchArgument[0],
2203 gIMemoryState.branchArgument[0] });
2205 two = &BitConstantOperation::create(*gammaNode->subregion(0), { 64, 2 });
2208 fibev.branchArgument[0],
2211 resultev.branchArgument[0],
2212 &CallOperation::GetIOStateOutput(callFibm1),
2213 &CallOperation::GetMemoryStateOutput(callFibm1) });
2216 resultev.branchArgument[0],
2226 resultev.branchArgument[0],
2237 auto sumex = gammaNode->AddExitVar({ sum, nev.branchArgument[1] });
2238 auto gOIoState = gammaNode->AddExitVar(
2240 auto gOMemoryState = gammaNode->AddExitVar({ ldnm2[1], gIMemoryState.branchArgument[1] });
2248 auto lambdaOutput =
lambda->
finalize({ gOIoState.output, store[0] });
2250 fibrv.result->divert_to(lambdaOutput);
2251 auto phiNode = pb.
end();
2253 return std::make_tuple(phiNode, lambdaOutput, gammaNode, &callFibm1, &callFibm2);
2272 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 64, 1 });
2273 auto constantTen = &BitConstantOperation::create(*
lambda->
subregion(), { 64, 10 });
2277 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
2279 auto zero = &BitConstantOperation::create(*
lambda->
subregion(), { 64, 0 });
2285 { constantTen, gep, iOStateArgument, state });
2288 GraphExport::Create(*lambdaOutput,
"test");
2290 return std::make_tuple(
2293 rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*allocaResults[0]));
2296 auto [phiNode, fibfct, gammaNode, callFib1, callFib2] = SetupFib();
2297 auto [testfct, callFib, alloca] = SetupTestFunction(phiNode);
2300 this->lambda_fib = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*fibfct);
2301 this->lambda_test = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*testfct);
2303 this->gamma = gammaNode;
2304 this->phi = phiNode;
2306 this->CallFibm1_ = callFib1;
2307 this->CallFibm2_ = callFib2;
2309 this->CallFib_ = callFib;
2311 this->alloca = alloca;
2316 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2346 auto SetupEight = [&]()
2354 auto constant = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 8 });
2356 return lambda->
finalize({ constant, iOStateArgument, memoryStateArgument });
2365 auto functionArgument =
2366 rvsdg::CreateOpNode<PointerToFunctionOperation>({ pointerArgument }, constantFunctionType)
2373 constantFunctionType,
2374 { iOStateArgument, memoryStateArgument });
2378 return std::make_tuple(lambdaOutput, &call);
2399 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
2403 std::vector<jlm::rvsdg::Output *>({ paAlloca[1], storeNode[0] }));
2408 { paAlloca[0], iOStateArgument, paMerge });
2423 return std::make_tuple(
2427 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2428 rvsdg::TryGetOwnerNode<rvsdg::Node>(*paAlloca[0])));
2447 auto two = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 2 });
2451 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
2455 std::vector<jlm::rvsdg::Output *>({ pbAlloca[1], storeNode[0] }));
2460 { rvsdg::CreateOpNode<FunctionToPointerOperation>({ functionEightCv }, constantFunctionType)
2478 return std::make_tuple(
2482 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2483 rvsdg::TryGetOwnerNode<rvsdg::Node>(*pbAlloca[0])));
2497 auto three = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 3 });
2501 auto constanOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
2504 std::vector<jlm::rvsdg::Output *>({ pcAlloca[1], storeNode[0] }));
2509 { pcAlloca[0], iOStateArgument, pcMerge });
2522 return std::make_tuple(
2525 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2526 rvsdg::TryGetOwnerNode<rvsdg::Node>(*pcAlloca[0])));
2540 auto four = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 4 });
2543 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
2546 std::vector<jlm::rvsdg::Output *>({ pdAlloca[1], storeNode[0] }));
2551 { pdAlloca[0], iOStateArgument, pdMerge });
2555 return std::make_tuple(
2558 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2559 rvsdg::TryGetOwnerNode<rvsdg::Node>(*pdAlloca[0])));
2566 auto lambdaARv = phiBuilder.
AddFixVar(recFunctionType);
2567 auto lambdaBRv = phiBuilder.
AddFixVar(recFunctionType);
2568 auto lambdaCRv = phiBuilder.
AddFixVar(recFunctionType);
2569 auto lambdaDRv = phiBuilder.
AddFixVar(recFunctionType);
2573 auto [lambdaAOutput, callB, callD, paAlloca] =
2574 SetupA(*phiBuilder.
subregion(), *lambdaBRv.recref, *lambdaDRv.recref);
2576 auto [lambdaBOutput, callI, callC, pbAlloca] =
2577 SetupB(*phiBuilder.
subregion(), *lambdaICv.inner, *lambdaCRv.recref, *lambdaEightCv.inner);
2579 auto [lambdaCOutput, callAFromC, pcAlloca] = SetupC(*phiBuilder.
subregion(), *lambdaARv.recref);
2581 auto [lambdaDOutput, callAFromD, pdAlloca] = SetupD(*phiBuilder.
subregion(), *lambdaARv.recref);
2583 lambdaARv.result->divert_to(lambdaAOutput);
2584 lambdaBRv.result->divert_to(lambdaBOutput);
2585 lambdaCRv.result->divert_to(lambdaCOutput);
2586 lambdaDRv.result->divert_to(lambdaDOutput);
2590 return std::make_tuple(
2623 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
2626 std::vector<jlm::rvsdg::Output *>({ pTestAlloca[1], memoryStateArgument }));
2631 { pTestAlloca[0], iOStateArgument, pTestMerge });
2634 GraphExport::Create(*lambdaOutput,
"test");
2636 return std::make_tuple(
2639 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2640 rvsdg::TryGetOwnerNode<rvsdg::Node>(*pTestAlloca[0])));
2643 auto lambdaEight = SetupEight();
2644 auto [lambdaI, indirectCall] = SetupI();
2660 pdAlloca] = SetupPhi(*lambdaEight, *lambdaI);
2662 auto [lambdaTest, callAFromTest, pTestAlloca] = SetupTest(*lambdaA.output);
2667 this->LambdaEight_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaEight);
2668 this->LambdaI_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaI);
2669 this->LambdaA_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaA.result->origin());
2670 this->LambdaB_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaB.result->origin());
2671 this->LambdaC_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaC.result->origin());
2672 this->LambdaD_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaD.result->origin());
2673 this->LambdaTest_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaTest);
2675 this->CallAFromTest_ = callAFromTest;
2676 this->CallAFromC_ = callAFromC;
2677 this->CallAFromD_ = callAFromD;
2678 this->CallB_ = callB;
2679 this->CallC_ = callC;
2680 this->CallD_ = callD;
2681 this->CallI_ = callI;
2682 this->IndirectCall_ = indirectCall;
2684 this->PTestAlloca_ = pTestAlloca;
2685 this->PaAlloca_ = paAlloca;
2686 this->PbAlloca_ = pbAlloca;
2687 this->PcAlloca_ = pcAlloca;
2688 this->PdAlloca_ = pdAlloca;
2693 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2700 auto & rvsdg = rvsdgModule->Rvsdg();
2707 pb.
begin(&rvsdg.GetRootRegion());
2708 auto myArrayRecVar = pb.
AddFixVar(pointerType);
2719 auto myArrayArgument = delta->AddContextVar(*myArrayRecVar.recref).inner;
2722 auto & constantStruct =
2726 auto deltaOutput = &delta->finalize(constantArray);
2727 Delta_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaOutput);
2728 myArrayRecVar.result->divert_to(deltaOutput);
2730 auto phiNode = pb.
end();
2731 GraphExport::Create(*phiNode->output(0),
"myArray");
2736 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2757 auto x = LambdaF->GetFunctionArguments()[0];
2758 auto y = LambdaF->GetFunctionArguments()[1];
2759 auto state = LambdaF->GetFunctionArguments()[2];
2761 auto one = &BitConstantOperation::create(*LambdaF->subregion(), { 32, 1 });
2762 auto two = &BitConstantOperation::create(*LambdaF->subregion(), { 32, 2 });
2767 LambdaF->finalize(storeTwo);
2768 GraphExport::Create(*LambdaF->output(),
"f");
2773 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2780 auto rvsdg = &rvsdgModule->Rvsdg();
2782 auto SetupDeltaA = [&]()
2785 &rvsdg->GetRootRegion(),
2794 auto constant = &BitConstantOperation::create(*deltaNode->subregion(), { 32, 1 });
2796 return &deltaNode->finalize(constant);
2799 auto SetupDeltaB = [&]()
2802 &rvsdg->GetRootRegion(),
2811 auto constant = &BitConstantOperation::create(*deltaNode->subregion(), { 32, 2 });
2813 return &deltaNode->finalize(constant);
2821 &rvsdg->GetRootRegion(),
2830 auto contextVariableA = deltaNode->AddContextVar(deltaA).inner;
2832 return &deltaNode->finalize(contextVariableA);
2840 &rvsdg->GetRootRegion(),
2849 auto contextVariableX = deltaNode->AddContextVar(deltaX).inner;
2851 auto deltaOutput = &deltaNode->finalize(contextVariableX);
2852 GraphExport::Create(*deltaOutput,
"y");
2867 rvsdg->GetRootRegion(),
2879 { loadResults1[1] },
2883 auto five = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 5 });
2887 auto lambdaOutput =
lambda->
finalize({ loadResults2[0], iOStateArgument, storeResults[0] });
2889 GraphExport::Create(*lambdaOutput,
"test");
2891 return std::make_tuple(
2893 jlm::util::assertedCast<rvsdg::SimpleNode>(
2894 rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*loadResults1[0])));
2897 auto deltaA = SetupDeltaA();
2898 auto deltaB = SetupDeltaB();
2899 auto deltaX = SetupDeltaX(*deltaA);
2900 auto deltaY = SetupDeltaY(*deltaX);
2901 auto [lambdaTest, loadNode1] = SetupLambdaTest(*deltaB);
2906 this->LambdaTest = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaTest);
2908 this->DeltaA = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaA);
2909 this->DeltaB = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaB);
2910 this->DeltaX = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaX);
2911 this->DeltaY = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaY);
2913 this->LoadNode1 = loadNode1;
2918 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2925 auto rvsdg = &rvsdgModule->Rvsdg();
2939 auto SetupExternalFunction1Declaration = [&]()
2943 externalFunction1Type,
2944 "ExternalFunction1",
2949 auto SetupExternalFunction2Declaration = [&]()
2953 externalFunction2Type,
2954 "ExternalFunction2",
2959 auto SetupReturnAddressFunction = [&]()
2969 rvsdg->GetRootRegion(),
2974 auto eight = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 8 });
2984 GraphExport::Create(*lambdaOutput,
"ReturnAddress");
2986 return std::make_tuple(lambdaOutput, &mallocNode);
2998 rvsdg->GetRootRegion(),
3001 "CallExternalFunction1",
3008 auto eight = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 8 });
3016 externalFunction1Type,
3023 GraphExport::Create(*lambdaOutput,
"CallExternalFunction1");
3025 return std::make_tuple(lambdaOutput, &call, &mallocNode);
3037 rvsdg->GetRootRegion(),
3040 "CallExternalFunction2",
3049 externalFunction2Type,
3050 { iOStateArgument, memoryStateArgument });
3054 { &CallOperation::GetMemoryStateOutput(call) },
3061 GraphExport::Create(*lambdaOutput,
"CallExternalFunction2");
3063 return std::make_tuple(
3066 jlm::util::assertedCast<rvsdg::SimpleNode>(
3067 rvsdg::TryGetOwnerNode<rvsdg::Node>(*loadResults[0])));
3070 auto externalFunction1 = SetupExternalFunction1Declaration();
3071 auto externalFunction2 = SetupExternalFunction2Declaration();
3072 auto [returnAddressFunction, returnAddressMalloc] = SetupReturnAddressFunction();
3073 auto [callExternalFunction1, externalFunction1Call, callExternalFunction1Malloc] =
3074 SetupCallExternalFunction1(externalFunction1);
3075 auto [callExternalFunction2, externalFunction2Call, loadNode] =
3076 SetupCallExternalFunction2(externalFunction2);
3081 this->ReturnAddressFunction =
3082 &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*returnAddressFunction);
3083 this->CallExternalFunction1 =
3084 &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*callExternalFunction1);
3085 this->CallExternalFunction2 =
3086 &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*callExternalFunction2);
3088 this->ExternalFunction1Call = externalFunction1Call;
3089 this->ExternalFunction2Call = externalFunction2Call;
3091 this->ReturnAddressMalloc = returnAddressMalloc;
3092 this->CallExternalFunction1Malloc = callExternalFunction1Malloc;
3094 this->ExternalFunction1Import = externalFunction1;
3095 this->ExternalFunction2Import = externalFunction2;
3097 this->LoadNode = loadNode;
3102 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3109 auto rvsdg = &rvsdgModule->Rvsdg();
3118 auto SetupExternalFunctionDeclaration = [&]()
3122 externalFunctionType,
3128 auto SetupGlobal = [&]()
3131 &rvsdg->GetRootRegion(),
3140 auto constant = &BitConstantOperation::create(*delta->subregion(), { 32, 4 });
3142 auto deltaOutput = &delta->finalize(constant);
3144 GraphExport::Create(*deltaOutput,
"global");
3158 rvsdg->GetRootRegion(),
3167 externalFunctionType,
3168 { iOStateArgument, memoryStateArgument });
3172 { &CallOperation::GetMemoryStateOutput(call) },
3179 GraphExport::Create(*lambdaOutput,
"test");
3181 return std::make_tuple(
3184 jlm::util::assertedCast<rvsdg::SimpleNode>(
3185 rvsdg::TryGetOwnerNode<rvsdg::Node>(*loadResults[0])));
3188 auto importExternalFunction = SetupExternalFunctionDeclaration();
3189 auto deltaGlobal = SetupGlobal();
3190 auto [lambdaTest, callExternalFunction, loadNode] = SetupTestFunction(importExternalFunction);
3193 this->LambdaTest = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaTest);
3194 this->DeltaGlobal = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaGlobal);
3195 this->ImportExternalFunction = importExternalFunction;
3196 this->CallExternalFunction = callExternalFunction;
3197 this->LoadNode = loadNode;
3202 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3209 auto rvsdg = &rvsdgModule->Rvsdg();
3213 auto SetupLocalArray = [&]()
3216 &rvsdg->GetRootRegion(),
3225 auto zero = &BitConstantOperation::create(*delta->subregion(), { 32, 0 });
3226 auto one = &BitConstantOperation::create(*delta->subregion(), { 32, 1 });
3227 auto two = &BitConstantOperation::create(*delta->subregion(), { 32, 2 });
3228 auto three = &BitConstantOperation::create(*delta->subregion(), { 32, 3 });
3229 auto four = &BitConstantOperation::create(*delta->subregion(), { 32, 4 });
3233 auto deltaOutput = &delta->finalize(constantDataArray);
3235 GraphExport::Create(*deltaOutput,
"localArray");
3240 auto SetupGlobalArray = [&]()
3243 &rvsdg->GetRootRegion(),
3252 auto constantAggregateZero =
3255 auto deltaOutput = &delta->finalize(constantAggregateZero);
3257 GraphExport::Create(*deltaOutput,
"globalArray");
3271 rvsdg->GetRootRegion(),
3278 auto zero = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 0 });
3279 auto two = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 2 });
3280 auto six = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 6 });
3288 { storeResults[0] },
3292 auto lambdaOutput =
lambda->
finalize({ loadResults[0], iOStateArgument, loadResults[1] });
3294 GraphExport::Create(*lambdaOutput,
"f");
3296 return lambdaOutput;
3299 auto SetupFunctionG =
3309 rvsdg->GetRootRegion(),
3321 auto twenty = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 20 });
3327 { memoryStateArgument });
3331 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(lambdaF).GetOperation().
Type(),
3332 { iOStateArgument, memcpyResults[0] });
3336 GraphExport::Create(*lambdaOutput,
"g");
3338 return std::make_tuple(
3341 &rvsdg::AssertGetOwnerNode<rvsdg::SimpleNode>(*memcpyResults[0]));
3344 auto localArray = SetupLocalArray();
3345 auto globalArray = SetupGlobalArray();
3346 auto lambdaF = SetupFunctionF(*globalArray);
3347 auto [lambdaG, callF, memcpyNode] = SetupFunctionG(*localArray, *globalArray, *lambdaF);
3352 this->LambdaF_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaF);
3353 this->LambdaG_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaG);
3354 this->LocalArray_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*localArray);
3355 this->GlobalArray_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*globalArray);
3356 this->CallF_ = callF;
3357 this->Memcpy_ = memcpyNode;
3362 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3369 auto rvsdg = &rvsdgModule->Rvsdg();
3375 auto SetupFunctionG = [&]()
3387 rvsdg->GetRootRegion(),
3394 auto c0 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 0 });
3395 auto c128 = &BitConstantOperation::create(*
lambda->
subregion(), { 64, 128 });
3407 auto lambdaOutput =
lambda->
finalize({ iOStateArgument, memcpyResults[0] });
3409 return std::make_tuple(lambdaOutput, rvsdg::TryGetOwnerNode<rvsdg::Node>(*memcpyResults[0]));
3424 rvsdg->GetRootRegion(),
3433 auto c0 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 0 });
3443 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(functionF).GetOperation().
Type(),
3444 { ldS1[0], ldS2[0], iOStateArgument, ldS2[1] });
3448 GraphExport::Create(*lambdaOutput,
"f");
3450 return std::make_tuple(lambdaOutput, &call);
3453 auto [lambdaG, memcpyNode] = SetupFunctionG();
3454 auto [lambdaF, callG] = SetupFunctionF(*lambdaG);
3456 this->LambdaF_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaF);
3457 this->LambdaG_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaG);
3458 this->CallG_ = callG;
3459 this->Memcpy_ = memcpyNode;
3464 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3471 auto rvsdg = &rvsdgModule->Rvsdg();
3483 rvsdg->GetRootRegion(),
3485 auto pArgument = Lambda_->GetFunctionArguments()[0];
3486 auto iOStateArgument = Lambda_->GetFunctionArguments()[1];
3487 auto memoryStateArgument = Lambda_->GetFunctionArguments()[2];
3489 auto eight = &BitConstantOperation::create(*Lambda_->subregion(), { 64, 8 });
3490 auto zero = &BitConstantOperation::create(*Lambda_->subregion(), { 32, 0 });
3491 auto minusFive = &BitConstantOperation::create(*Lambda_->subregion(), { 64, -5 });
3492 auto three = &BitConstantOperation::create(*Lambda_->subregion(), { 64, 3 });
3494 auto constantOne = &BitConstantOperation::create(*Lambda_->subregion(), { 64, 1 });
3497 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
3499 auto memcpyResults =
3509 auto lambdaOutput = Lambda_->finalize({ iOStateArgument, memcpyResults[0] });
3511 GraphExport::Create(*lambdaOutput,
"f");
3513 Alloca_ = rvsdg::TryGetOwnerNode<rvsdg::Node>(*allocaResults[0]);
3514 Memcpy_ = rvsdg::TryGetOwnerNode<rvsdg::Node>(*memcpyResults[0]);
3519 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3526 auto & rvsdg = rvsdgModule->Rvsdg();
3531 auto SetupDeltaMyList = [&]()
3534 &rvsdg.GetRootRegion(),
3543 auto constantPointerNullResult =
3546 auto deltaOutput = &delta->finalize(constantPointerNullResult);
3547 GraphExport::Create(*deltaOutput,
"myList");
3561 rvsdg.GetRootRegion(),
3568 auto zero = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 0 });
3569 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
3573 std::vector<jlm::rvsdg::Output *>{ alloca[1], memoryStateArgument });
3587 auto lambdaOutput =
lambda->
finalize({ load4[0], iOStateArgument, load4[1] });
3588 GraphExport::Create(*lambdaOutput,
"next");
3590 return std::make_tuple(rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*alloca[0]), lambdaOutput);
3593 auto deltaMyList = SetupDeltaMyList();
3594 auto [alloca, lambdaNext] = SetupFunctionNext(*deltaMyList);
3599 this->DeltaMyList_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaMyList);
3600 this->LambdaNext_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaNext);
3601 this->Alloca_ = alloca;
3606 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3625 BitType::Create(32),
3642 auto constantPointerNullResult =
3644 Delta_->finalize(constantPointerNullResult);
3650 auto entryMemoryState = Lambda_->GetFunctionArguments()[0];
3651 auto ioStateArgument = Lambda_->GetFunctionArguments()[1];
3652 auto deltaContextVar = Lambda_->AddContextVar(Delta_->output()).inner;
3653 auto importContextVar = Lambda_->AddContextVar(*Import_).inner;
3656 auto allocaSize = &BitConstantOperation::create(*Lambda_->subregion(), { 32, 1 });
3658 Alloca_ = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*allocaOutputs[0]);
3661 std::vector<jlm::rvsdg::Output *>{ entryMemoryState, allocaOutputs[1] });
3664 auto mallocSize = &BitConstantOperation::create(*Lambda_->subregion(), { 32, 4 });
3674 { afterMallocMemoryState },
3678 auto loadAllocaOutputs =
3684 { loadAllocaOutputs[1] },
3691 loadAllocaOutputs[0],
3692 loadImportedOutputs[0],
3693 { loadImportedOutputs[1] },
3699 loadAllocaOutputs[0],
3700 { storeImportedOutputs[0] },
3705 GraphExport::Create(Delta_->output(),
"global");
3706 GraphExport::Create(*Lambda_->output(),
"f");
3711 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3729 auto constantOne = &BitConstantOperation::create(*Function_->subregion(), { 32, 1 });
3733 for (
size_t i = 0; i < NumAllocaNodes_; i++)
3736 auto allocaNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*allocaOutputs[0]);
3738 AllocaNodes_.push_back(allocaNode);
3745 Function_->finalize({ latestMemoryState });
3747 GraphExport::Create(*Function_->output(),
"f");
3752 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3780 const auto constantZero = &BitConstantOperation::create(*Global_->subregion(), { 32, 0 });
3781 const auto deltaOutput = &Global_->finalize(constantZero);
3787 LocalFuncParam_ = LocalFunc_->GetFunctionArguments()[0];
3789 const auto constantOne = &BitConstantOperation::create(*LocalFunc_->subregion(), { 32, 1 });
3791 LocalFuncParamAllocaNode_ = rvsdg::TryGetOwnerNode<rvsdg::Node>(*allocaOutputs[0]);
3795 std::vector<rvsdg::Output *>{ LocalFunc_->GetFunctionArguments()[1], allocaOutputs[1] });
3801 { mergedMemoryState },
3805 const auto deltaOutputCtxVar = LocalFunc_->AddContextVar(*deltaOutput).inner;
3808 LocalFunc_->finalize({ deltaOutputCtxVar, storeOutputs[0] });
3810 LocalFuncRegister_ =
3811 rvsdg::CreateOpNode<FunctionToPointerOperation>({ LocalFunc_->output() }, localFuncType)
3821 const auto localFuncCtxVar = ExportedFunc_->AddContextVar(*LocalFuncRegister_).inner;
3824 ExportedFunc_->finalize({ localFuncCtxVar, ExportedFunc_->GetFunctionArguments()[0] });
3826 GraphExport::Create(*ExportedFunc_->output(),
"exportedFunc");
3831 std::unique_ptr<llvm::LlvmRvsdgModule>
3847 auto iOStateArgument = LambdaMain_->GetFunctionArguments()[0];
3848 auto memoryStateArgument = LambdaMain_->GetFunctionArguments()[1];
3850 auto constantPointerNullResult =
3856 LambdaMain_->finalize({ FreeResults[1], FreeResults[0] });
3858 GraphExport::Create(*LambdaMain_->output(),
"main");
3863 std::unique_ptr<llvm::LlvmRvsdgModule>
3870 auto & rvsdg = rvsdgModule->Rvsdg();
3878 variableArgumentType,
3883 auto setupLambdaG = [&]()
3889 rvsdg.GetRootRegion(),
3894 auto five = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 5 });
3896 return lambda->
finalize({ five, iOStateArgument, memoryStateArgument });
3909 rvsdg.GetRootRegion(),
3916 auto six = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 6 });
3923 std::vector<rvsdg::Output *>{ memoryStateArgument, allocaResults[1] });
3937 { loadResults[0], vaList, iOStateArgument, loadResults[1] });
3941 GraphExport::Create(*lambdaOutput,
"main");
3943 return std::make_tuple(lambdaOutput, &call);
3946 LambdaG_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*setupLambdaG());
3952 jlm::rvsdg::CreateOpNode<FunctionToPointerOperation>({ LambdaG_->output() }, functionType)
3955 jlm::rvsdg::CreateOpNode<PointerToFunctionOperation>({ ptr }, functionTypeCall).output(0);
3956 auto [lambdaMainOutput, call] = setupLambdaMain(*fn);
3957 LambdaMain_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaMainOutput);
3963 std::unique_ptr<llvm::LlvmRvsdgModule>
3969 auto & rvsdg = rvsdgModule->Rvsdg();
3999 rvsdg.GetRootRegion(),
4001 auto iArgument = LambdaF_->GetFunctionArguments()[0];
4002 auto iOStateArgument = LambdaF_->GetFunctionArguments()[1];
4003 auto memoryStateArgument = LambdaF_->GetFunctionArguments()[2];
4004 auto lambdaHArgument = LambdaF_->AddContextVar(*ImportH_).inner;
4014 {
one, varArgList, iOStateArgument, memoryStateArgument });
4019 { &CallOperation::GetMemoryStateOutput(*CallH_) },
4028 rvsdg.GetRootRegion(),
4030 auto iOStateArgument = LambdaG_->GetFunctionArguments()[0];
4031 auto memoryStateArgument = LambdaG_->GetFunctionArguments()[1];
4032 auto lambdaFArgument = LambdaG_->AddContextVar(*LambdaF_->output()).inner;
4039 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
4040 AllocaNode_ = rvsdg::TryGetOwnerNode<rvsdg::Node>(*allocaResults[0]);
4047 { allocaResults[0], iOStateArgument, storeResults[0] });
4049 LambdaG_->finalize(
outputs(&callF));
4055 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
4061 auto & rvsdg = rvsdgModule->Rvsdg();
4065 "struct.__va_list_tag",
4102 lambdaLlvmLifetimeStartType,
4103 "llvm.lifetime.start.p0",
4108 lambdaLlvmLifetimeEndType,
4109 "llvm.lifetime.end.p0",
4128 rvsdg.GetRootRegion(),
4130 auto iOStateArgument = LambdaFst_->GetFunctionArguments()[2];
4131 auto memoryStateArgument = LambdaFst_->GetFunctionArguments()[3];
4132 auto llvmLifetimeStartArgument = LambdaFst_->AddContextVar(*llvmLifetimeStart).inner;
4133 auto llvmLifetimeEndArgument = LambdaFst_->AddContextVar(*llvmLifetimeEnd).inner;
4134 auto llvmVaStartArgument = LambdaFst_->AddContextVar(*llvmVaStart).inner;
4135 auto llvmVaEndArgument = LambdaFst_->AddContextVar(*llvmVaEnd).inner;
4143 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
4144 AllocaNode_ = rvsdg::TryGetOwnerNode<rvsdg::Node>(*allocaResults[0]);
4147 llvmLifetimeStartArgument,
4148 lambdaLlvmLifetimeStartType,
4149 { twentyFour, allocaResults[0], iOStateArgument, memoryState });
4151 llvmVaStartArgument,
4166 auto gammaVaAddress = gammaNode->AddEntryVar(allocaResults[0]);
4167 auto gammaLoadResult = gammaNode->AddEntryVar(loadResults[0]);
4168 auto gammaMemoryState = gammaNode->AddEntryVar(loadResults[1]);
4178 { gammaMemoryState.branchArgument[0] },
4183 auto storeResultsGamma0 =
4191 gammaVaAddress.branchArgument[1],
4196 { gammaMemoryState.branchArgument[1] },
4202 loadResultsGamma1[0],
4207 gammaVaAddress.branchArgument[1],
4209 { loadResultsGamma1[1] },
4212 auto gammaAddress = gammaNode->AddExitVar({ loadResultsGamma0[0], gepResult2 });
4213 auto gammaOutputMemoryState =
4214 gammaNode->AddExitVar({ storeResultsGamma0[0], storeResultsGamma1[0] });
4217 gammaAddress.output,
4218 { gammaOutputMemoryState.output },
4226 llvmLifetimeEndArgument,
4227 lambdaLlvmLifetimeEndType,
4233 LambdaFst_->finalize({ loadResults[0],
4241 rvsdg.GetRootRegion(),
4243 auto iOStateArgument = LambdaG_->GetFunctionArguments()[0];
4244 auto memoryStateArgument = LambdaG_->GetFunctionArguments()[1];
4245 auto lambdaFstArgument = LambdaG_->AddContextVar(*LambdaFst_->output()).inner;
4258 { three, vaListResult, iOStateArgument, memoryStateArgument });
4260 LambdaG_->finalize(
outputs(&callFst));
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
static std::vector< rvsdg::Output * > create(std::shared_ptr< const rvsdg::Type > allocatedType, rvsdg::Output *count, const size_t alignment)
static std::shared_ptr< const ArrayType > Create(std::shared_ptr< const Type > type, size_t nelements)
static std::unique_ptr< llvm::ThreeAddressCode > create(const Variable *operand, std::shared_ptr< const jlm::rvsdg::Type > type)
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
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
static rvsdg::Output & GetMemoryStateOutput(const rvsdg::Node &node) noexcept
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
static jlm::rvsdg::Output * Create(rvsdg::Region ®ion, std::shared_ptr< const jlm::rvsdg::Type > type)
static rvsdg::Output * Create(const std::vector< rvsdg::Output * > &operands)
static jlm::rvsdg::Output * Create(const std::vector< jlm::rvsdg::Output * > &elements)
static std::unique_ptr< llvm::ThreeAddressCode > Create(std::shared_ptr< const rvsdg::Type > type)
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
static rvsdg::Output & Create(rvsdg::Region &, const std::vector< rvsdg::Output * > &operands, std::shared_ptr< const rvsdg::Type > resultType)
static std::unique_ptr< DeltaOperation > Create(std::shared_ptr< const rvsdg::Type > type, const std::string &name, const Linkage &linkage, std::string section, bool constant, const size_t alignment)
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
static std::unique_ptr< llvm::ThreeAddressCode > Create(const Variable *pointer, const std::vector< const Variable * > &memoryStates, const Variable *iOState)
std::unique_ptr< llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
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 > pointeeType)
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
static std::shared_ptr< const IOStateType > Create()
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
static std::unique_ptr< llvm::ThreeAddressCode > create(const Variable *argument, std::shared_ptr< const jlm::rvsdg::Type > type)
std::unique_ptr< llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
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)
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)
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
static rvsdg::Output & ioStateOutput(const rvsdg::Node &node)
static rvsdg::SimpleNode & createNode(rvsdg::Output &size, rvsdg::Output &ioState)
static rvsdg::Output & addressOutput(const rvsdg::Node &node)
static rvsdg::Output & memoryStateOutput(const rvsdg::Node &node)
static std::unique_ptr< llvm::ThreeAddressCode > create(const Variable *destination, const Variable *source, const Variable *length, const std::vector< const Variable * > &memoryStates)
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
static rvsdg::Output * Create(const std::vector< rvsdg::Output * > &operands)
static std::shared_ptr< const MemoryStateType > Create()
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
static std::shared_ptr< const PointerType > Create()
const rvsdg::Graph & graph()
jlm::llvm::LlvmRvsdgModule & module()
static std::unique_ptr< llvm::ThreeAddressCode > Create(const Variable *address, const Variable *value, const Variable *state, size_t alignment)
rvsdg::SimpleNode * alloca_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
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
static std::shared_ptr< const StructType > CreateIdentified(const std::string &name, std::vector< std::shared_ptr< const Type >> types, bool isPacked)
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
static std::unique_ptr< llvm::ThreeAddressCode > create(const Variable *operand, const std::shared_ptr< const jlm::rvsdg::Type > &type)
static jlm::rvsdg::Output * Create(rvsdg::Region ®ion, std::shared_ptr< const jlm::rvsdg::Type > type)
static std::shared_ptr< const VariableArgumentType > Create()
static rvsdg::Output * Create(rvsdg::Region ®ion, const std::vector< rvsdg::Output * > &operands)
std::unique_ptr< llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
static rvsdg::Output & Create(rvsdg::Output &operand, const std::shared_ptr< const rvsdg::Type > &resultType)
static Output & create(Region ®ion, BitValueRepresentation value)
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
rvsdg::Region * subregion() const noexcept
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
LambdaOperation & GetOperation() const noexcept override
const std::shared_ptr< const FunctionType > & Type() const noexcept
std::unique_ptr< BitBinaryOperation > create(size_t nbits) const override
std::unique_ptr< BitCompareOperation > create(size_t nbits) const override
static Output * Create(Output &predicate, const std::unordered_map< uint64_t, uint64_t > &mapping, const uint64_t defaultAlternative, const size_t numAlternatives)
rvsdg::Region * subregion() 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)
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.
static std::vector< jlm::rvsdg::Output * > outputs(const Node *node)
rvsdg::Output * inner
Access to bound object in subregion.