14 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
31 auto constantOne = &BitConstantOperation::create(*fct->subregion(), { 32, 1 });
39 std::vector<jlm::rvsdg::Output *>{ d[1], fct->GetFunctionArguments()[0] });
51 fct->finalize({ c_amp_d[0] });
53 GraphExport::Create(*fct->output(),
"f");
59 this->
size = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*constantOne);
61 this->
alloca_a = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*a[0]);
62 this->
alloca_b = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*b[0]);
63 this->
alloca_c = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*c[0]);
64 this->
alloca_d = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*d[0]);
69 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
86 auto constantOne = &BitConstantOperation::create(*fct->subregion(), { 32, 1 });
95 std::vector<jlm::rvsdg::Output *>{ a[1], fct->GetFunctionArguments()[0] });
110 fct->finalize({ p_amp_y[0] });
112 GraphExport::Create(*fct->output(),
"f");
118 this->
size = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*constantOne);
120 this->
alloca_a = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*a[0]);
121 this->
alloca_b = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*b[0]);
122 this->alloca_x = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*x[0]);
123 this->alloca_y = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*y[0]);
124 this->alloca_p = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*p[0]);
129 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
137 auto intType = BitType::Create(32);
150 fct->GetFunctionArguments()[0],
151 { fct->GetFunctionArguments()[1] },
158 GraphExport::Create(*fct->output(),
"f");
164 this->load_p = rvsdg::TryGetOwnerNode<rvsdg::Node>(*ld1[0]);
165 this->load_x = rvsdg::TryGetOwnerNode<rvsdg::Node>(*ld2[0]);
170 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
188 auto constantOne = &BitConstantOperation::create(*fct->subregion(), { 32, 1 });
197 std::vector<jlm::rvsdg::Output *>{ a[1], fct->GetFunctionArguments()[0] });
215 fct->finalize({ y_star_p[0] });
217 GraphExport::Create(*fct->output(),
"f");
223 this->
size = rvsdg::TryGetOwnerNode<rvsdg::Node>(*constantOne);
225 this->
alloca_a = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*a[0]);
226 this->
alloca_b = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*b[0]);
227 this->alloca_x = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*x[0]);
228 this->alloca_y = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*y[0]);
229 this->alloca_p = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*p[0]);
231 this->load_x = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*ld1[0]);
232 this->load_a = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*ld2[0]);
237 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
250 auto & rvsdg = rvsdgModule->Rvsdg();
253 rvsdg.GetRootRegion(),
259 { Lambda_->GetFunctionArguments()[0] },
263 Lambda_->finalize(loadResults);
264 GraphExport::Create(*Lambda_->output(),
"f");
269 UndefValueNode_ = rvsdg::TryGetOwnerNode<rvsdg::Node>(*undefValue);
274 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
296 auto zero = &BitConstantOperation::create(*fct->subregion(), { 32, 0 });
297 auto one = &BitConstantOperation::create(*fct->subregion(), { 32, 1 });
300 fct->GetFunctionArguments()[0],
306 { fct->GetFunctionArguments()[1] },
311 fct->GetFunctionArguments()[0],
319 fct->finalize({ sum, ldy[1] });
321 GraphExport::Create(*fct->output(),
"f");
328 this->getElementPtrX = rvsdg::TryGetOwnerNode<rvsdg::Node>(*gepx);
329 this->getElementPtrY = rvsdg::TryGetOwnerNode<rvsdg::Node>(*gepy);
334 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
352 fct->finalize({ cast });
354 GraphExport::Create(*fct->output(),
"f");
358 this->bitCast = rvsdg::TryGetOwnerNode<rvsdg::Node>(*cast);
363 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
372 auto setupBit2PtrFunction = [&]()
392 return std::make_tuple(
lambda, rvsdg::TryGetOwnerNode<rvsdg::Node>(*cast));
414 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*b2p).GetOperation().Type(),
415 { valueArgument, iOStateArgument, memoryStateArgument });
421 return std::make_tuple(
lambda, &call);
424 auto [lambdaBits2Ptr, bitsToPtrNode] = setupBit2PtrFunction();
425 auto [lambdaTest, callNode] = setupTestFunction(lambdaBits2Ptr->output());
428 this->LambdaBits2Ptr_ = lambdaBits2Ptr;
429 this->LambdaTest_ = lambdaTest;
431 this->BitsToPtrNode_ = bitsToPtrNode;
433 this->CallNode_ = callNode;
438 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
457 auto constantPointerNullResult =
460 fct->GetFunctionArguments()[0],
461 constantPointerNullResult,
462 { fct->GetFunctionArguments()[1] },
465 fct->finalize({ st[0] });
467 GraphExport::Create(*fct->output(),
"f");
473 this->constantPointerNullNode = rvsdg::TryGetOwnerNode<rvsdg::Node>(*constantPointerNullResult);
478 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
509 { memoryStateArgument },
547 { memoryStateArgument },
580 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
587 std::vector<jlm::rvsdg::Output *>({ x[1], memoryStateArgument }));
591 auto five = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 5 });
592 auto six = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 6 });
593 auto seven = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 7 });
602 { x[0], y[0], iOStateArgument, stz[0] });
605 g->GetOperation().Type(),
608 &CallOperation::GetIOStateOutput(callF),
609 &CallOperation::GetMemoryStateOutput(callF) });
618 auto allocaX = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*x[0]);
619 auto allocaY = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*y[0]);
620 auto allocaZ = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*z[0]);
622 return std::make_tuple(
lambda, allocaX, allocaY, allocaZ, &callF, &callG);
625 auto lambdaF = SetupF();
626 auto lambdaG = SetupG();
627 auto [lambdaH, allocaX, allocaY, allocaZ, callF, callG] = SetupH(lambdaF, lambdaG);
632 this->lambda_f = lambdaF;
633 this->lambda_g = lambdaG;
634 this->lambda_h = lambdaH;
636 this->alloca_x = allocaX;
637 this->alloca_y = allocaY;
638 this->alloca_z = allocaZ;
640 this->CallF_ = callF;
641 this->CallG_ = callG;
646 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
655 auto SetupCreate = [&]()
671 auto four = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 4 });
681 return std::make_tuple(
lambda, &mallocNode);
684 auto SetupDestroy = [&]()
705 auto freeNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*freeResults[0]);
706 return std::make_tuple(
lambda, freeNode);
726 auto six = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 6 });
727 auto seven = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 7 });
732 { six, iOStateArgument, memoryStateArgument });
737 &CallOperation::GetIOStateOutput(create1),
738 &CallOperation::GetMemoryStateOutput(create1) });
742 lambdaDestroy->GetOperation().Type(),
744 &CallOperation::GetIOStateOutput(create2),
745 &CallOperation::GetMemoryStateOutput(create2) });
748 lambdaDestroy->GetOperation().Type(),
750 &CallOperation::GetIOStateOutput(destroy1),
751 &CallOperation::GetMemoryStateOutput(destroy1) });
757 return std::make_tuple(
lambda, &create1, &create2, &destroy1, &destroy2);
760 auto [lambdaCreate, mallocNode] = SetupCreate();
761 auto [lambdaDestroy, freeNode] = SetupDestroy();
762 auto [lambdaTest, callCreate1, callCreate2, callDestroy1, callDestroy2] =
763 SetupTest(lambdaCreate, lambdaDestroy);
768 this->lambda_create = lambdaCreate;
769 this->lambda_destroy = lambdaDestroy;
770 this->lambda_test = lambdaTest;
772 this->malloc = mallocNode;
773 this->free = freeNode;
775 this->CallCreate1_ = callCreate1;
776 this->CallCreate2_ = callCreate2;
778 this->CallDestroy1_ = callCreate1;
779 this->CallDestroy2_ = callCreate2;
784 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
800 auto SetupConstantFunction = [&](ssize_t n,
const std::string & name)
808 auto constant = &BitConstantOperation::create(*
lambda->
subregion(), { 32, n });
810 return lambda->
finalize({ constant, iOStateArgument, memoryStateArgument });
813 auto SetupIndirectCallFunction = [&]()
825 auto functionOfPointer =
826 rvsdg::CreateOpNode<PointerToFunctionOperation>({ pointerArgument }, constantFunctionType)
833 constantFunctionType,
834 { iOStateArgument, memoryStateArgument });
838 return std::make_tuple(lambdaOutput, &call);
841 auto SetupTestFunction =
860 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*fctindcall).GetOperation().Type(),
861 { fctfour_cv, iOStateArgument, memoryStateArgument });
864 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*fctindcall).GetOperation().Type(),
866 &CallOperation::GetIOStateOutput(call_four),
867 &CallOperation::GetMemoryStateOutput(call_four) });
876 return std::make_tuple(lambdaOutput, &call_three, &call_four);
879 auto fctfour = SetupConstantFunction(4,
"four");
880 auto fctthree = SetupConstantFunction(3,
"three");
881 auto [fctindcall, callIndirectFunction] = SetupIndirectCallFunction();
882 auto [fcttest, callFunctionThree, callFunctionFour] = SetupTestFunction(
884 rvsdg::CreateOpNode<FunctionToPointerOperation>({ fctthree }, constantFunctionType).output(0),
885 rvsdg::CreateOpNode<FunctionToPointerOperation>({ fctfour }, constantFunctionType).output(0));
890 this->LambdaThree_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*fctthree);
891 this->LambdaFour_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*fctfour);
892 this->LambdaIndcall_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*fctindcall);
893 this->LambdaTest_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*fcttest);
895 this->CallIndcall_ = callIndirectFunction;
896 this->CallThree_ = callFunctionThree;
897 this->CallFour_ = callFunctionFour;
902 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
929 auto constant = &BitConstantOperation::create(*delta->subregion(), { 32, 1 });
931 return &delta->finalize(constant);
945 auto constant = &BitConstantOperation::create(*delta->subregion(), { 32, 2 });
947 return &delta->finalize(constant);
950 auto SetupConstantFunction = [&](ssize_t n,
const std::string & name)
958 auto constant = &BitConstantOperation::create(*
lambda->
subregion(), { 32, n });
960 return lambda->
finalize({ constant, iOStateArgument, memoryStateArgument });
980 rvsdg::CreateOpNode<PointerToFunctionOperation>({ pointerArgument }, constantFunctionType)
982 constantFunctionType,
983 { iOStateArgument, memoryStateArgument });
987 return std::make_tuple(lambdaOutput, &call);
990 auto SetupIndirectCallFunction = [&](ssize_t n,
991 const std::string & name,
1010 auto argumentFunctionPtr = rvsdg::CreateOpNode<FunctionToPointerOperation>(
1011 { argumentFunctionCv },
1012 constantFunctionType)
1015 auto five = &BitConstantOperation::create(*
lambda->
subregion(), { 32, n });
1022 { argumentFunctionPtr, iOStateArgument, storeNode[0] });
1026 return std::make_tuple(lambdaOutput, &call);
1049 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
1055 std::vector<jlm::rvsdg::Output *>{ pxAlloca[1], memoryStateArgument });
1057 std::vector<jlm::rvsdg::Output *>({ pyAlloca[1], pxMerge }));
1061 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(functionX).GetOperation().
Type(),
1062 { pxAlloca[0], iOStateArgument, pyMerge });
1066 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(functionY).GetOperation().
Type(),
1089 GraphExport::Create(*lambdaOutput,
"test");
1091 return std::make_tuple(
1095 jlm::util::assertedCast<rvsdg::SimpleNode>(
1096 rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*pxAlloca[0])),
1097 jlm::util::assertedCast<rvsdg::SimpleNode>(
1098 rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*pyAlloca[0])));
1113 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
1117 std::vector<jlm::rvsdg::Output *>{ pzAlloca[1], memoryStateArgument });
1123 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(functionX).GetOperation().
Type(),
1124 { pzAlloca[0], iOStateArgument, pzMerge });
1127 GraphExport::Create(*lambdaOutput,
"test2");
1129 return std::make_tuple(
1132 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
1133 rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*pzAlloca[0])));
1136 auto deltaG1 = SetupG1();
1137 auto deltaG2 = SetupG2();
1138 auto lambdaThree = SetupConstantFunction(3,
"three");
1139 auto lambdaFour = SetupConstantFunction(4,
"four");
1140 auto [lambdaI, indirectCall] = SetupI();
1141 auto [lambdaX, callIWithThree] = SetupIndirectCallFunction(5,
"x", *lambdaI, *lambdaThree);
1142 auto [lambdaY, callIWithFour] = SetupIndirectCallFunction(6,
"y", *lambdaI, *lambdaFour);
1143 auto [lambdaTest, testCallX, callY, allocaPx, allocaPy] =
1144 SetupTestFunction(*lambdaX, *lambdaY, *deltaG1, *deltaG2);
1145 auto [lambdaTest2, test2CallX, allocaPz] = SetupTest2Function(*lambdaX);
1150 this->DeltaG1_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaG1);
1151 this->DeltaG2_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaG2);
1152 this->LambdaThree_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaThree);
1153 this->LambdaFour_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaFour);
1154 this->LambdaI_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaI);
1155 this->LambdaX_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaX);
1156 this->LambdaY_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaY);
1157 this->LambdaTest_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaTest);
1158 this->LambdaTest2_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaTest2);
1160 this->IndirectCall_ = indirectCall;
1161 this->CallIWithThree_ = callIWithThree;
1162 this->CallIWithFour_ = callIWithFour;
1163 this->TestCallX_ = testCallX;
1164 this->Test2CallX_ = test2CallX;
1165 this->CallY_ = callY;
1167 this->AllocaPx_ = allocaPx;
1168 this->AllocaPy_ = allocaPy;
1169 this->AllocaPz_ = allocaPz;
1174 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1181 auto rvsdg = &rvsdgModule->Rvsdg();
1193 auto SetupFunctionGDeclaration = [&]()
1217 rvsdg->GetRootRegion(),
1226 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
1232 std::vector<jlm::rvsdg::Output *>{ allocaPath[1], memoryStateArgument });
1234 std::vector<jlm::rvsdg::Output *>({ allocaMode[1], mergePath }));
1248 { loadPath[0], loadMode[0], iOStateArgument, loadMode[1] });
1253 return std::make_tuple(
lambda, &callG);
1256 this->ExternalGArgument_ = SetupFunctionGDeclaration();
1257 auto [lambdaF, callG] = SetupFunctionF(ExternalGArgument_);
1259 this->LambdaF_ = lambdaF;
1260 this->CallG_ = callG;
1265 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1271 auto & rvsdg = rvsdgModule->Rvsdg();
1305 lambdaLlvmLifetimeStartType,
1306 lambdaLlvmLifetimeStartType,
1307 "llvm.lifetime.start.p0",
1312 lambdaLlvmLifetimeEndType,
1313 lambdaLlvmLifetimeEndType,
1314 "llvm.lifetime.end.p0",
1327 rvsdg.GetRootRegion(),
1329 auto iOStateArgument = LambdaG_->GetFunctionArguments()[0];
1330 auto memoryStateArgument = LambdaG_->GetFunctionArguments()[1];
1331 auto llvmLifetimeStartArgument = LambdaG_->AddContextVar(*llvmLifetimeStart).inner;
1332 auto llvmLifetimeEndArgument = LambdaG_->AddContextVar(*llvmLifetimeEnd).inner;
1333 auto lambdaFArgument = LambdaG_->AddContextVar(*ExternalFArgument_).inner;
1340 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
1343 llvmLifetimeStartArgument,
1344 lambdaLlvmLifetimeStartType,
1345 { twentyFour, allocaResults[0], iOStateArgument, memoryState });
1375 auto storeResults1 =
1380 auto storeResults2 =
1384 llvmLifetimeEndArgument,
1385 lambdaLlvmLifetimeEndType,
1389 storeResults2[0] });
1391 LambdaG_->finalize(
outputs(&callLLvmLifetimeEnd));
1396 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1420 auto zero = &BitConstantOperation::create(*fct->subregion(), { 32, 0 });
1425 auto p1ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[1]);
1426 auto p2ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[2]);
1427 auto p3ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[3]);
1428 auto p4ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[4]);
1430 auto tmp1 = gammanode->AddExitVar({ p1ev.branchArgument[0], p3ev.branchArgument[1] });
1431 auto tmp2 = gammanode->AddExitVar({ p2ev.branchArgument[0], p4ev.branchArgument[1] });
1435 { fct->GetFunctionArguments()[5] },
1442 fct->finalize({ sum, ld2[1] });
1444 GraphExport::Create(*fct->output(),
"f");
1450 this->gamma = gammanode;
1455 std::unique_ptr<llvm::LlvmRvsdgModule>
1462 auto rvsdg = &rvsdgModule->Rvsdg();
1464 auto SetupLambdaF = [&]()
1474 auto gammaInputX = gammaNode->AddEntryVar(xAddress);
1475 auto gammaInputY = gammaNode->AddEntryVar(yAddress);
1476 auto gammaInputZ = gammaNode->AddEntryVar(zAddress);
1477 auto gammaInputMemoryState = gammaNode->AddEntryVar(memoryState);
1481 gammaInputX.branchArgument[0],
1482 { gammaInputMemoryState.branchArgument[0] },
1486 auto one = &BitConstantOperation::create(*gammaNode->subregion(0), { 32, 1 });
1488 gammaInputZ.branchArgument[0],
1490 { loadXResults[1] },
1495 gammaInputY.branchArgument[1],
1496 { gammaInputMemoryState.branchArgument[1] },
1500 auto two = &BitConstantOperation::create(*gammaNode->subregion(1), { 32, 2 });
1502 gammaInputZ.branchArgument[1],
1504 { loadYResults[1] },
1508 auto gammaOutputA = gammaNode->AddExitVar({ loadXResults[0], loadYResults[0] });
1509 auto gammaOutputMemoryState =
1510 gammaNode->AddExitVar({ storeZRegion0Results[0], storeZRegion1Results[0] });
1512 return std::make_tuple(gammaOutputA.output, gammaOutputMemoryState.output);
1527 rvsdg->GetRootRegion(),
1535 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
1540 std::vector<jlm::rvsdg::Output *>{ allocaZResults[1], memoryStateArgument });
1543 auto storeZResults =
1546 auto zero = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 0 });
1548 auto predicate =
rvsdg::match(1, { { 0, 1 } }, 0, 2, bitEq);
1550 auto [gammaOutputA, gammaOutputMemoryState] =
1551 SetupGamma(predicate, xArgument, yArgument, allocaZResults[0], memoryState);
1555 { gammaOutputMemoryState },
1563 return std::make_tuple(
1565 &rvsdg::AssertGetOwnerNode<jlm::rvsdg::GammaNode>(*gammaOutputA),
1566 rvsdg::TryGetOwnerNode<rvsdg::Node>(*allocaZResults[0]));
1573 const char * functionName)
1583 rvsdg->GetRootRegion(),
1589 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 4 });
1595 std::vector<jlm::rvsdg::Output *>{ allocaXResults[1], memoryStateArgument });
1597 std::vector<jlm::rvsdg::Output *>({ allocaYResults[1], memoryState }));
1599 auto predicate = &BitConstantOperation::create(*
lambda->
subregion(), { 32, cValue });
1600 auto x = &BitConstantOperation::create(*
lambda->
subregion(), { 32, xValue });
1601 auto y = &BitConstantOperation::create(*
lambda->
subregion(), { 32, yValue });
1603 auto storeXResults =
1606 auto storeYResults =
1611 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(lambdaF).GetOperation().
Type(),
1612 { predicate, allocaXResults[0], allocaYResults[0], iOStateArgument, storeYResults[0] });
1617 return std::make_tuple(
1620 rvsdg::TryGetOwnerNode<rvsdg::Node>(*allocaXResults[0]),
1621 rvsdg::TryGetOwnerNode<rvsdg::Node>(*allocaYResults[1]));
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");
1629 this->LambdaF_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaF);
1630 this->LambdaG_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaG);
1631 this->LambdaH_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaH);
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;
1647 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1669 auto zero = &BitConstantOperation::create(*fct->subregion(), { 32, 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]);
1686 auto one = &BitConstantOperation::create(*thetanode->subregion(), { 32, 1 });
1691 n.post->divert_to(sum);
1692 s.post->divert_to(store[0]);
1693 thetanode->set_predicate(predicate);
1695 fct->finalize({ s.output });
1696 GraphExport::Create(*fct->output(),
"f");
1702 this->theta = thetanode;
1703 this->gep = rvsdg::TryGetOwnerNode<rvsdg::Node>(*gepnode);
1708 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1717 auto SetupGlobalF = [&]()
1728 auto constant = &BitConstantOperation::create(*dfNode->subregion(), { 32, 0 });
1730 return &dfNode->finalize(constant);
1733 auto SetupFunctionG = [&]()
1751 { memoryStateArgument },
1775 auto five = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 5 });
1779 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*g).GetOperation().Type(),
1780 { cvf, iOStateArgument, st[0] });
1785 return std::make_tuple(lambdaOutput, &callG, rvsdg::TryGetOwnerNode<rvsdg::Node>(*five));
1788 auto f = SetupGlobalF();
1789 auto g = SetupFunctionG();
1790 auto [h, callFunctionG, constantFive] = SetupFunctionH(f, g);
1795 this->lambda_g = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*g);
1796 this->lambda_h = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*h);
1798 this->delta_f = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*f);
1800 this->CallG_ = callFunctionG;
1801 this->constantFive = constantFive;
1806 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1815 auto SetupD1 = [&]()
1826 auto constant = &BitConstantOperation::create(*delta->subregion(), { 32, 0 });
1828 return &delta->finalize(constant);
1831 auto SetupD2 = [&]()
1842 auto constant = &BitConstantOperation::create(*delta->subregion(), { 32, 0 });
1844 return &delta->finalize(constant);
1862 auto b2 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 2 });
1886 auto b5 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 5 });
1887 auto b42 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 42 });
1891 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*f1).GetOperation().Type(),
1892 { iOStateArgument, st[0] });
1900 GraphExport::Create(*lambdaOutput,
"f2");
1902 return std::make_tuple(lambdaOutput, &call);
1905 auto d1 = SetupD1();
1906 auto d2 = SetupD2();
1907 auto f1 = SetupF1(d1);
1908 auto [f2, callF1] = SetupF2(f1, d1, d2);
1911 this->lambda_f1 = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*f1);
1912 this->lambda_f2 = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*f2);
1914 this->delta_d1 = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*d1);
1915 this->delta_d2 = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*d2);
1917 this->CallF1_ = callF1;
1922 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
1931 auto SetupG1 = [&]()
1942 auto constant = &BitConstantOperation::create(*delta->subregion(), { 32, 1 });
1944 return &delta->finalize(constant);
1955 auto ctxVar = delta->AddContextVar(g1);
1957 return &delta->finalize(ctxVar.inner);
1978 { memoryStateArgument },
1991 return lambda->
finalize({ truncResult, iOStateArgument, loadResults[1] });
2012 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(lambdaF).GetOperation().
Type(),
2013 { iOStateArgument, memoryStateArgument });
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);
2030 this->LambdaF_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*f);
2031 this->LambdaTest_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*test);
2033 this->DeltaG1_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*g1);
2034 this->DeltaG2_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*g2);
2036 this->CallF_ = callF;
2041 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2066 auto b5 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 5 });
2089 auto b2 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 2 });
2090 auto b21 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 21 });
2094 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*f1).GetOperation().Type(),
2095 { iOStateArgument, st[0] });
2105 return std::make_tuple(lambdaOutput, &call);
2121 auto f1 = SetupF1(d1);
2122 auto [f2, callF1] = SetupF2(f1, d1, d2);
2125 this->lambda_f1 = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*f1);
2126 this->lambda_f2 = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*f2);
2128 this->CallF1_ = callF1;
2130 this->import_d1 = d1;
2131 this->import_d2 = d2;
2136 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2155 auto SetupFib = [&]()
2161 auto fibrv = pb.
AddFixVar(fibFunctionType);
2172 auto two = &BitConstantOperation::create(*
lambda->
subregion(), { 64, 2 });
2177 auto nev = gammaNode->AddEntryVar(valueArgument);
2178 auto resultev = gammaNode->AddEntryVar(pointerArgument);
2179 auto fibev = gammaNode->AddEntryVar(ctxVarFib);
2180 auto gIIoState = gammaNode->AddEntryVar(iOStateArgument);
2181 auto gIMemoryState = gammaNode->AddEntryVar(memoryStateArgument);
2184 auto one = &BitConstantOperation::create(*gammaNode->subregion(0), { 64, 1 });
2187 fibev.branchArgument[0],
2190 resultev.branchArgument[0],
2191 gIIoState.branchArgument[0],
2192 gIMemoryState.branchArgument[0] });
2194 two = &BitConstantOperation::create(*gammaNode->subregion(0), { 64, 2 });
2197 fibev.branchArgument[0],
2200 resultev.branchArgument[0],
2201 &CallOperation::GetIOStateOutput(callFibm1),
2202 &CallOperation::GetMemoryStateOutput(callFibm1) });
2205 resultev.branchArgument[0],
2216 resultev.branchArgument[0],
2228 auto sumex = gammaNode->AddExitVar({ sum, nev.branchArgument[1] });
2229 auto gOIoState = gammaNode->AddExitVar(
2231 auto gOMemoryState = gammaNode->AddExitVar({ ldnm2[1], gIMemoryState.branchArgument[1] });
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);
2265 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 64, 1 });
2266 auto constantTen = &BitConstantOperation::create(*
lambda->
subregion(), { 64, 10 });
2270 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
2272 auto zero = &BitConstantOperation::create(*
lambda->
subregion(), { 64, 0 });
2278 { constantTen, gep, iOStateArgument, state });
2281 GraphExport::Create(*lambdaOutput,
"test");
2283 return std::make_tuple(
2286 rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*allocaResults[0]));
2289 auto [phiNode, fibfct, gammaNode, callFib1, callFib2] = SetupFib();
2290 auto [testfct, callFib, alloca] = SetupTestFunction(phiNode);
2293 this->lambda_fib = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*fibfct);
2294 this->lambda_test = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*testfct);
2296 this->gamma = gammaNode;
2297 this->phi = phiNode;
2299 this->CallFibm1_ = callFib1;
2300 this->CallFibm2_ = callFib2;
2302 this->CallFib_ = callFib;
2304 this->alloca = alloca;
2309 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2339 auto SetupEight = [&]()
2347 auto constant = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 8 });
2349 return lambda->
finalize({ constant, iOStateArgument, memoryStateArgument });
2358 auto functionArgument =
2359 rvsdg::CreateOpNode<PointerToFunctionOperation>({ pointerArgument }, constantFunctionType)
2366 constantFunctionType,
2367 { iOStateArgument, memoryStateArgument });
2371 return std::make_tuple(lambdaOutput, &call);
2392 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
2396 std::vector<jlm::rvsdg::Output *>({ paAlloca[1], storeNode[0] }));
2401 { paAlloca[0], iOStateArgument, paMerge });
2416 return std::make_tuple(
2420 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2421 rvsdg::TryGetOwnerNode<rvsdg::Node>(*paAlloca[0])));
2440 auto two = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 2 });
2444 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
2448 std::vector<jlm::rvsdg::Output *>({ pbAlloca[1], storeNode[0] }));
2453 { rvsdg::CreateOpNode<FunctionToPointerOperation>({ functionEightCv }, constantFunctionType)
2471 return std::make_tuple(
2475 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2476 rvsdg::TryGetOwnerNode<rvsdg::Node>(*pbAlloca[0])));
2490 auto three = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 3 });
2494 auto constanOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
2497 std::vector<jlm::rvsdg::Output *>({ pcAlloca[1], storeNode[0] }));
2502 { pcAlloca[0], iOStateArgument, pcMerge });
2515 return std::make_tuple(
2518 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2519 rvsdg::TryGetOwnerNode<rvsdg::Node>(*pcAlloca[0])));
2533 auto four = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 4 });
2536 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
2539 std::vector<jlm::rvsdg::Output *>({ pdAlloca[1], storeNode[0] }));
2544 { pdAlloca[0], iOStateArgument, pdMerge });
2548 return std::make_tuple(
2551 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2552 rvsdg::TryGetOwnerNode<rvsdg::Node>(*pdAlloca[0])));
2559 auto lambdaARv = phiBuilder.
AddFixVar(recFunctionType);
2560 auto lambdaBRv = phiBuilder.
AddFixVar(recFunctionType);
2561 auto lambdaCRv = phiBuilder.
AddFixVar(recFunctionType);
2562 auto lambdaDRv = phiBuilder.
AddFixVar(recFunctionType);
2566 auto [lambdaAOutput, callB, callD, paAlloca] =
2567 SetupA(*phiBuilder.
subregion(), *lambdaBRv.recref, *lambdaDRv.recref);
2569 auto [lambdaBOutput, callI, callC, pbAlloca] =
2570 SetupB(*phiBuilder.
subregion(), *lambdaICv.inner, *lambdaCRv.recref, *lambdaEightCv.inner);
2572 auto [lambdaCOutput, callAFromC, pcAlloca] = SetupC(*phiBuilder.
subregion(), *lambdaARv.recref);
2574 auto [lambdaDOutput, callAFromD, pdAlloca] = SetupD(*phiBuilder.
subregion(), *lambdaARv.recref);
2576 lambdaARv.result->divert_to(lambdaAOutput);
2577 lambdaBRv.result->divert_to(lambdaBOutput);
2578 lambdaCRv.result->divert_to(lambdaCOutput);
2579 lambdaDRv.result->divert_to(lambdaDOutput);
2583 return std::make_tuple(
2616 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
2619 std::vector<jlm::rvsdg::Output *>({ pTestAlloca[1], memoryStateArgument }));
2624 { pTestAlloca[0], iOStateArgument, pTestMerge });
2627 GraphExport::Create(*lambdaOutput,
"test");
2629 return std::make_tuple(
2632 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(
2633 rvsdg::TryGetOwnerNode<rvsdg::Node>(*pTestAlloca[0])));
2636 auto lambdaEight = SetupEight();
2637 auto [lambdaI, indirectCall] = SetupI();
2653 pdAlloca] = SetupPhi(*lambdaEight, *lambdaI);
2655 auto [lambdaTest, callAFromTest, pTestAlloca] = SetupTest(*lambdaA.output);
2660 this->LambdaEight_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaEight);
2661 this->LambdaI_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaI);
2662 this->LambdaA_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaA.result->origin());
2663 this->LambdaB_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaB.result->origin());
2664 this->LambdaC_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaC.result->origin());
2665 this->LambdaD_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaD.result->origin());
2666 this->LambdaTest_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaTest);
2668 this->CallAFromTest_ = callAFromTest;
2669 this->CallAFromC_ = callAFromC;
2670 this->CallAFromD_ = callAFromD;
2671 this->CallB_ = callB;
2672 this->CallC_ = callC;
2673 this->CallD_ = callD;
2674 this->CallI_ = callI;
2675 this->IndirectCall_ = indirectCall;
2677 this->PTestAlloca_ = pTestAlloca;
2678 this->PaAlloca_ = paAlloca;
2679 this->PbAlloca_ = pbAlloca;
2680 this->PcAlloca_ = pcAlloca;
2681 this->PdAlloca_ = pdAlloca;
2686 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2693 auto & rvsdg = rvsdgModule->Rvsdg();
2700 pb.
begin(&rvsdg.GetRootRegion());
2701 auto myArrayRecVar = pb.
AddFixVar(pointerType);
2706 auto myArrayArgument = delta->AddContextVar(*myArrayRecVar.recref).inner;
2709 auto & constantStruct =
2713 auto deltaOutput = &delta->finalize(constantArray);
2714 Delta_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaOutput);
2715 myArrayRecVar.result->divert_to(deltaOutput);
2717 auto phiNode = pb.
end();
2718 GraphExport::Create(*phiNode->output(0),
"myArray");
2723 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2744 auto x = LambdaF->GetFunctionArguments()[0];
2745 auto y = LambdaF->GetFunctionArguments()[1];
2746 auto state = LambdaF->GetFunctionArguments()[2];
2748 auto one = &BitConstantOperation::create(*LambdaF->subregion(), { 32, 1 });
2749 auto two = &BitConstantOperation::create(*LambdaF->subregion(), { 32, 2 });
2754 LambdaF->finalize(storeTwo);
2755 GraphExport::Create(*LambdaF->output(),
"f");
2760 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2767 auto rvsdg = &rvsdgModule->Rvsdg();
2769 auto SetupDeltaA = [&]()
2772 &rvsdg->GetRootRegion(),
2780 auto constant = &BitConstantOperation::create(*deltaNode->subregion(), { 32, 1 });
2782 return &deltaNode->finalize(constant);
2785 auto SetupDeltaB = [&]()
2788 &rvsdg->GetRootRegion(),
2796 auto constant = &BitConstantOperation::create(*deltaNode->subregion(), { 32, 2 });
2798 return &deltaNode->finalize(constant);
2806 &rvsdg->GetRootRegion(),
2809 auto contextVariableA = deltaNode->AddContextVar(deltaA).inner;
2811 return &deltaNode->finalize(contextVariableA);
2819 &rvsdg->GetRootRegion(),
2822 auto contextVariableX = deltaNode->AddContextVar(deltaX).inner;
2824 auto deltaOutput = &deltaNode->finalize(contextVariableX);
2825 GraphExport::Create(*deltaOutput,
"y");
2840 rvsdg->GetRootRegion(),
2852 { loadResults1[1] },
2856 auto five = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 5 });
2860 auto lambdaOutput =
lambda->
finalize({ loadResults2[0], iOStateArgument, storeResults[0] });
2862 GraphExport::Create(*lambdaOutput,
"test");
2864 return std::make_tuple(
2866 jlm::util::assertedCast<rvsdg::SimpleNode>(
2867 rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*loadResults1[0])));
2870 auto deltaA = SetupDeltaA();
2871 auto deltaB = SetupDeltaB();
2872 auto deltaX = SetupDeltaX(*deltaA);
2873 auto deltaY = SetupDeltaY(*deltaX);
2874 auto [lambdaTest, loadNode1] = SetupLambdaTest(*deltaB);
2879 this->LambdaTest = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaTest);
2881 this->DeltaA = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaA);
2882 this->DeltaB = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaB);
2883 this->DeltaX = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaX);
2884 this->DeltaY = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaY);
2886 this->LoadNode1 = loadNode1;
2891 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
2898 auto rvsdg = &rvsdgModule->Rvsdg();
2912 auto SetupExternalFunction1Declaration = [&]()
2916 externalFunction1Type,
2917 externalFunction1Type,
2918 "ExternalFunction1",
2923 auto SetupExternalFunction2Declaration = [&]()
2927 externalFunction2Type,
2928 externalFunction2Type,
2929 "ExternalFunction2",
2934 auto SetupReturnAddressFunction = [&]()
2944 rvsdg->GetRootRegion(),
2949 auto eight = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 8 });
2959 GraphExport::Create(*lambdaOutput,
"ReturnAddress");
2961 return std::make_tuple(lambdaOutput, &mallocNode);
2973 rvsdg->GetRootRegion(),
2976 "CallExternalFunction1",
2983 auto eight = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 8 });
2991 externalFunction1Type,
2998 GraphExport::Create(*lambdaOutput,
"CallExternalFunction1");
3000 return std::make_tuple(lambdaOutput, &call, &mallocNode);
3012 rvsdg->GetRootRegion(),
3015 "CallExternalFunction2",
3024 externalFunction2Type,
3025 { iOStateArgument, memoryStateArgument });
3029 { &CallOperation::GetMemoryStateOutput(call) },
3036 GraphExport::Create(*lambdaOutput,
"CallExternalFunction2");
3038 return std::make_tuple(
3041 jlm::util::assertedCast<rvsdg::SimpleNode>(
3042 rvsdg::TryGetOwnerNode<rvsdg::Node>(*loadResults[0])));
3045 auto externalFunction1 = SetupExternalFunction1Declaration();
3046 auto externalFunction2 = SetupExternalFunction2Declaration();
3047 auto [returnAddressFunction, returnAddressMalloc] = SetupReturnAddressFunction();
3048 auto [callExternalFunction1, externalFunction1Call, callExternalFunction1Malloc] =
3049 SetupCallExternalFunction1(externalFunction1);
3050 auto [callExternalFunction2, externalFunction2Call, loadNode] =
3051 SetupCallExternalFunction2(externalFunction2);
3056 this->ReturnAddressFunction =
3057 &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*returnAddressFunction);
3058 this->CallExternalFunction1 =
3059 &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*callExternalFunction1);
3060 this->CallExternalFunction2 =
3061 &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*callExternalFunction2);
3063 this->ExternalFunction1Call = externalFunction1Call;
3064 this->ExternalFunction2Call = externalFunction2Call;
3066 this->ReturnAddressMalloc = returnAddressMalloc;
3067 this->CallExternalFunction1Malloc = callExternalFunction1Malloc;
3069 this->ExternalFunction1Import = externalFunction1;
3070 this->ExternalFunction2Import = externalFunction2;
3072 this->LoadNode = loadNode;
3077 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3084 auto rvsdg = &rvsdgModule->Rvsdg();
3093 auto SetupExternalFunctionDeclaration = [&]()
3097 externalFunctionType,
3098 externalFunctionType,
3104 auto SetupGlobal = [&]()
3107 &rvsdg->GetRootRegion(),
3115 auto constant = &BitConstantOperation::create(*delta->subregion(), { 32, 4 });
3117 auto deltaOutput = &delta->finalize(constant);
3119 GraphExport::Create(*deltaOutput,
"global");
3133 rvsdg->GetRootRegion(),
3142 externalFunctionType,
3143 { iOStateArgument, memoryStateArgument });
3147 { &CallOperation::GetMemoryStateOutput(call) },
3154 GraphExport::Create(*lambdaOutput,
"test");
3156 return std::make_tuple(
3159 jlm::util::assertedCast<rvsdg::SimpleNode>(
3160 rvsdg::TryGetOwnerNode<rvsdg::Node>(*loadResults[0])));
3163 auto importExternalFunction = SetupExternalFunctionDeclaration();
3164 auto deltaGlobal = SetupGlobal();
3165 auto [lambdaTest, callExternalFunction, loadNode] = SetupTestFunction(importExternalFunction);
3168 this->LambdaTest = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaTest);
3169 this->DeltaGlobal = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaGlobal);
3170 this->ImportExternalFunction = importExternalFunction;
3171 this->CallExternalFunction = callExternalFunction;
3172 this->LoadNode = loadNode;
3177 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3184 auto rvsdg = &rvsdgModule->Rvsdg();
3188 auto SetupLocalArray = [&]()
3191 &rvsdg->GetRootRegion(),
3199 auto zero = &BitConstantOperation::create(*delta->subregion(), { 32, 0 });
3200 auto one = &BitConstantOperation::create(*delta->subregion(), { 32, 1 });
3201 auto two = &BitConstantOperation::create(*delta->subregion(), { 32, 2 });
3202 auto three = &BitConstantOperation::create(*delta->subregion(), { 32, 3 });
3203 auto four = &BitConstantOperation::create(*delta->subregion(), { 32, 4 });
3207 auto deltaOutput = &delta->finalize(constantDataArray);
3209 GraphExport::Create(*deltaOutput,
"localArray");
3214 auto SetupGlobalArray = [&]()
3217 &rvsdg->GetRootRegion(),
3225 auto constantAggregateZero =
3228 auto deltaOutput = &delta->finalize(constantAggregateZero);
3230 GraphExport::Create(*deltaOutput,
"globalArray");
3244 rvsdg->GetRootRegion(),
3251 auto zero = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 0 });
3252 auto two = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 2 });
3253 auto six = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 6 });
3256 globalArrayArgument,
3265 { storeResults[0] },
3269 auto lambdaOutput =
lambda->
finalize({ loadResults[0], iOStateArgument, loadResults[1] });
3271 GraphExport::Create(*lambdaOutput,
"f");
3273 return lambdaOutput;
3276 auto SetupFunctionG =
3286 rvsdg->GetRootRegion(),
3298 auto twenty = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 20 });
3304 { memoryStateArgument });
3308 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(lambdaF).GetOperation().
Type(),
3309 { iOStateArgument, memcpyResults[0] });
3313 GraphExport::Create(*lambdaOutput,
"g");
3315 return std::make_tuple(
3318 &rvsdg::AssertGetOwnerNode<rvsdg::SimpleNode>(*memcpyResults[0]));
3321 auto localArray = SetupLocalArray();
3322 auto globalArray = SetupGlobalArray();
3323 auto lambdaF = SetupFunctionF(*globalArray);
3324 auto [lambdaG, callF, memcpyNode] = SetupFunctionG(*localArray, *globalArray, *lambdaF);
3329 this->LambdaF_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaF);
3330 this->LambdaG_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaG);
3331 this->LocalArray_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*localArray);
3332 this->GlobalArray_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*globalArray);
3333 this->CallF_ = callF;
3334 this->Memcpy_ = memcpyNode;
3339 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3346 auto rvsdg = &rvsdgModule->Rvsdg();
3352 auto SetupFunctionG = [&]()
3364 rvsdg->GetRootRegion(),
3371 auto c0 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 0 });
3372 auto c128 = &BitConstantOperation::create(*
lambda->
subregion(), { 64, 128 });
3384 auto lambdaOutput =
lambda->
finalize({ iOStateArgument, memcpyResults[0] });
3386 return std::make_tuple(lambdaOutput, rvsdg::TryGetOwnerNode<rvsdg::Node>(*memcpyResults[0]));
3401 rvsdg->GetRootRegion(),
3410 auto c0 = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 0 });
3420 rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(functionF).GetOperation().
Type(),
3421 { ldS1[0], ldS2[0], iOStateArgument, ldS2[1] });
3425 GraphExport::Create(*lambdaOutput,
"f");
3427 return std::make_tuple(lambdaOutput, &call);
3430 auto [lambdaG, memcpyNode] = SetupFunctionG();
3431 auto [lambdaF, callG] = SetupFunctionF(*lambdaG);
3433 this->LambdaF_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaF);
3434 this->LambdaG_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaG);
3435 this->CallG_ = callG;
3436 this->Memcpy_ = memcpyNode;
3441 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3448 auto rvsdg = &rvsdgModule->Rvsdg();
3460 rvsdg->GetRootRegion(),
3462 auto pArgument = Lambda_->GetFunctionArguments()[0];
3463 auto iOStateArgument = Lambda_->GetFunctionArguments()[1];
3464 auto memoryStateArgument = Lambda_->GetFunctionArguments()[2];
3466 auto eight = &BitConstantOperation::create(*Lambda_->subregion(), { 64, 8 });
3467 auto zero = &BitConstantOperation::create(*Lambda_->subregion(), { 32, 0 });
3468 auto minusFive = &BitConstantOperation::create(*Lambda_->subregion(), { 64, -5 });
3469 auto three = &BitConstantOperation::create(*Lambda_->subregion(), { 64, 3 });
3471 auto constantOne = &BitConstantOperation::create(*Lambda_->subregion(), { 64, 1 });
3474 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
3476 auto memcpyResults =
3488 auto lambdaOutput = Lambda_->finalize({ iOStateArgument, memcpyResults[0] });
3490 GraphExport::Create(*lambdaOutput,
"f");
3492 Alloca_ = rvsdg::TryGetOwnerNode<rvsdg::Node>(*allocaResults[0]);
3493 Memcpy_ = rvsdg::TryGetOwnerNode<rvsdg::Node>(*memcpyResults[0]);
3498 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3505 auto & rvsdg = rvsdgModule->Rvsdg();
3510 auto SetupDeltaMyList = [&]()
3513 &rvsdg.GetRootRegion(),
3521 auto constantPointerNullResult =
3524 auto deltaOutput = &delta->finalize(constantPointerNullResult);
3525 GraphExport::Create(*deltaOutput,
"myList");
3539 rvsdg.GetRootRegion(),
3546 auto zero = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 0 });
3547 auto constantOne = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 1 });
3551 std::vector<jlm::rvsdg::Output *>{ alloca[1], memoryStateArgument });
3565 auto lambdaOutput =
lambda->
finalize({ load4[0], iOStateArgument, load4[1] });
3566 GraphExport::Create(*lambdaOutput,
"next");
3568 return std::make_tuple(rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*alloca[0]), lambdaOutput);
3571 auto deltaMyList = SetupDeltaMyList();
3572 auto [alloca, lambdaNext] = SetupFunctionNext(*deltaMyList);
3577 this->DeltaMyList_ = &rvsdg::AssertGetOwnerNode<rvsdg::DeltaNode>(*deltaMyList);
3578 this->LambdaNext_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaNext);
3579 this->Alloca_ = alloca;
3584 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3618 auto constantPointerNullResult =
3620 Delta_->finalize(constantPointerNullResult);
3626 auto entryMemoryState = Lambda_->GetFunctionArguments()[0];
3627 auto ioStateArgument = Lambda_->GetFunctionArguments()[1];
3628 auto deltaContextVar = Lambda_->AddContextVar(Delta_->output()).inner;
3629 auto importContextVar = Lambda_->AddContextVar(*Import_).inner;
3632 auto allocaSize = &BitConstantOperation::create(*Lambda_->subregion(), { 32, 1 });
3634 Alloca_ = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*allocaOutputs[0]);
3637 std::vector<jlm::rvsdg::Output *>{ entryMemoryState, allocaOutputs[1] });
3640 auto mallocSize = &BitConstantOperation::create(*Lambda_->subregion(), { 32, 4 });
3650 { afterMallocMemoryState },
3654 auto loadAllocaOutputs =
3660 { loadAllocaOutputs[1] },
3667 loadAllocaOutputs[0],
3668 loadImportedOutputs[0],
3669 { loadImportedOutputs[1] },
3675 loadAllocaOutputs[0],
3676 { storeImportedOutputs[0] },
3681 GraphExport::Create(Delta_->output(),
"global");
3682 GraphExport::Create(*Lambda_->output(),
"f");
3687 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3705 auto constantOne = &BitConstantOperation::create(*Function_->subregion(), { 32, 1 });
3709 for (
size_t i = 0; i < NumAllocaNodes_; i++)
3712 auto allocaNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*allocaOutputs[0]);
3714 AllocaNodes_.push_back(allocaNode);
3721 Function_->finalize({ latestMemoryState });
3723 GraphExport::Create(*Function_->output(),
"f");
3728 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
3750 const auto constantZero = &BitConstantOperation::create(*Global_->subregion(), { 32, 0 });
3751 const auto deltaOutput = &Global_->finalize(constantZero);
3757 LocalFuncParam_ = LocalFunc_->GetFunctionArguments()[0];
3759 const auto constantOne = &BitConstantOperation::create(*LocalFunc_->subregion(), { 32, 1 });
3761 LocalFuncParamAllocaNode_ = rvsdg::TryGetOwnerNode<rvsdg::Node>(*allocaOutputs[0]);
3765 std::vector<rvsdg::Output *>{ LocalFunc_->GetFunctionArguments()[1], allocaOutputs[1] });
3771 { mergedMemoryState },
3775 const auto deltaOutputCtxVar = LocalFunc_->AddContextVar(*deltaOutput).inner;
3778 LocalFunc_->finalize({ deltaOutputCtxVar, storeOutputs[0] });
3780 LocalFuncRegister_ =
3781 rvsdg::CreateOpNode<FunctionToPointerOperation>({ LocalFunc_->output() }, localFuncType)
3791 const auto localFuncCtxVar = ExportedFunc_->AddContextVar(*LocalFuncRegister_).inner;
3794 ExportedFunc_->finalize({ localFuncCtxVar, ExportedFunc_->GetFunctionArguments()[0] });
3796 GraphExport::Create(*ExportedFunc_->output(),
"exportedFunc");
3801 std::unique_ptr<llvm::LlvmRvsdgModule>
3817 auto iOStateArgument = LambdaMain_->GetFunctionArguments()[0];
3818 auto memoryStateArgument = LambdaMain_->GetFunctionArguments()[1];
3820 auto constantPointerNullResult =
3826 LambdaMain_->finalize({ FreeResults[1], FreeResults[0] });
3828 GraphExport::Create(*LambdaMain_->output(),
"main");
3833 std::unique_ptr<llvm::LlvmRvsdgModule>
3840 auto & rvsdg = rvsdgModule->Rvsdg();
3848 variableArgumentType,
3853 auto setupLambdaG = [&]()
3859 rvsdg.GetRootRegion(),
3864 auto five = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 5 });
3866 return lambda->
finalize({ five, iOStateArgument, memoryStateArgument });
3879 rvsdg.GetRootRegion(),
3886 auto six = &BitConstantOperation::create(*
lambda->
subregion(), { 32, 6 });
3893 std::vector<rvsdg::Output *>{ memoryStateArgument, allocaResults[1] });
3907 { loadResults[0], vaList, iOStateArgument, loadResults[1] });
3911 GraphExport::Create(*lambdaOutput,
"main");
3913 return std::make_tuple(lambdaOutput, &call);
3916 LambdaG_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*setupLambdaG());
3922 jlm::rvsdg::CreateOpNode<FunctionToPointerOperation>({ LambdaG_->output() }, functionType)
3925 jlm::rvsdg::CreateOpNode<PointerToFunctionOperation>({ ptr }, functionTypeCall).output(0);
3926 auto [lambdaMainOutput, call] = setupLambdaMain(*fn);
3927 LambdaMain_ = &rvsdg::AssertGetOwnerNode<rvsdg::LambdaNode>(*lambdaMainOutput);
3933 std::unique_ptr<llvm::LlvmRvsdgModule>
3939 auto & rvsdg = rvsdgModule->Rvsdg();
3970 rvsdg.GetRootRegion(),
3972 auto iArgument = LambdaF_->GetFunctionArguments()[0];
3973 auto iOStateArgument = LambdaF_->GetFunctionArguments()[1];
3974 auto memoryStateArgument = LambdaF_->GetFunctionArguments()[2];
3975 auto lambdaHArgument = LambdaF_->AddContextVar(*ImportH_).inner;
3985 {
one, varArgList, iOStateArgument, memoryStateArgument });
3990 { &CallOperation::GetMemoryStateOutput(*CallH_) },
3999 rvsdg.GetRootRegion(),
4001 auto iOStateArgument = LambdaG_->GetFunctionArguments()[0];
4002 auto memoryStateArgument = LambdaG_->GetFunctionArguments()[1];
4003 auto lambdaFArgument = LambdaG_->AddContextVar(*LambdaF_->output()).inner;
4010 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
4011 AllocaNode_ = rvsdg::TryGetOwnerNode<rvsdg::Node>(*allocaResults[0]);
4018 { allocaResults[0], iOStateArgument, storeResults[0] });
4020 LambdaG_->finalize(
outputs(&callF));
4026 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
4032 auto & rvsdg = rvsdgModule->Rvsdg();
4036 "struct.__va_list_tag",
4073 lambdaLlvmLifetimeStartType,
4074 lambdaLlvmLifetimeStartType,
4075 "llvm.lifetime.start.p0",
4080 lambdaLlvmLifetimeEndType,
4081 lambdaLlvmLifetimeEndType,
4082 "llvm.lifetime.end.p0",
4103 rvsdg.GetRootRegion(),
4105 auto iOStateArgument = LambdaFst_->GetFunctionArguments()[2];
4106 auto memoryStateArgument = LambdaFst_->GetFunctionArguments()[3];
4107 auto llvmLifetimeStartArgument = LambdaFst_->AddContextVar(*llvmLifetimeStart).inner;
4108 auto llvmLifetimeEndArgument = LambdaFst_->AddContextVar(*llvmLifetimeEnd).inner;
4109 auto llvmVaStartArgument = LambdaFst_->AddContextVar(*llvmVaStart).inner;
4110 auto llvmVaEndArgument = LambdaFst_->AddContextVar(*llvmVaEnd).inner;
4118 std::vector<jlm::rvsdg::Output *>{ allocaResults[1], memoryStateArgument });
4119 AllocaNode_ = rvsdg::TryGetOwnerNode<rvsdg::Node>(*allocaResults[0]);
4122 llvmLifetimeStartArgument,
4123 lambdaLlvmLifetimeStartType,
4124 { twentyFour, allocaResults[0], iOStateArgument, memoryState });
4126 llvmVaStartArgument,
4141 auto gammaVaAddress = gammaNode->AddEntryVar(allocaResults[0]);
4142 auto gammaLoadResult = gammaNode->AddEntryVar(loadResults[0]);
4143 auto gammaMemoryState = gammaNode->AddEntryVar(loadResults[1]);
4150 gammaVaAddress.branchArgument[0],
4156 { gammaMemoryState.branchArgument[0] },
4160 loadResultsGamma0[0],
4164 auto storeResultsGamma0 =
4172 gammaVaAddress.branchArgument[1],
4178 { gammaMemoryState.branchArgument[1] },
4184 loadResultsGamma1[0],
4190 gammaVaAddress.branchArgument[1],
4192 { loadResultsGamma1[1] },
4195 auto gammaAddress = gammaNode->AddExitVar({ loadResultsGamma0[0], gepResult2 });
4196 auto gammaOutputMemoryState =
4197 gammaNode->AddExitVar({ storeResultsGamma0[0], storeResultsGamma1[0] });
4200 gammaAddress.output,
4201 { gammaOutputMemoryState.output },
4209 llvmLifetimeEndArgument,
4210 lambdaLlvmLifetimeEndType,
4216 LambdaFst_->finalize({ loadResults[0],
4224 rvsdg.GetRootRegion(),
4226 auto iOStateArgument = LambdaG_->GetFunctionArguments()[0];
4227 auto memoryStateArgument = LambdaG_->GetFunctionArguments()[1];
4228 auto lambdaFstArgument = LambdaG_->AddContextVar(*LambdaFst_->output()).inner;
4241 { three, vaListResult, iOStateArgument, memoryStateArgument });
4243 LambdaG_->finalize(
outputs(&callFst));
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
static std::unique_ptr< llvm::ThreeAddressCode > create(std::shared_ptr< const rvsdg::Type > allocatedType, const Variable *size, 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 llvm::Linkage &linkage, std::string section, bool constant)
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 std::unique_ptr< llvm::ThreeAddressCode > Create(const Variable *baseAddress, const std::vector< const Variable * > &offsets, std::shared_ptr< const rvsdg::Type > pointeeType, std::shared_ptr< const rvsdg::Type > resultType)
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 & Create(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::Type > valueType, std::shared_ptr< const rvsdg::Type > importedType, std::string name, Linkage linkage, bool isConstant=false)
static std::unique_ptr< LlvmLambdaOperation > Create(std::shared_ptr< const jlm::rvsdg::FunctionType > type, std::string name, const jlm::llvm::Linkage &linkage, 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.
jlm::rvsdg::Output * match(size_t nbits, const std::unordered_map< uint64_t, uint64_t > &mapping, uint64_t default_alternative, size_t nalternatives, jlm::rvsdg::Output *operand)
static std::vector< jlm::rvsdg::Output * > outputs(const Node *node)
rvsdg::Output * inner
Access to bound object in subregion.