24std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
31 { MemoryStateType::Create(), PointerType::Create() },
34 auto module = LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
35 auto graph = &
module->Rvsdg();
40 auto memoryStateArgument = fct->GetFunctionArguments()[0];
41 auto pointerArgument = fct->GetFunctionArguments()[1];
43 auto load = LoadNonVolatileOperation::Create(
45 { memoryStateArgument },
51 GraphExport::Create(*fct->output(),
"f");
59std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
66 { IOStateType::Create(), MemoryStateType::Create(), PointerType::Create() },
69 auto module = LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
70 auto graph = &
module->Rvsdg();
75 auto iOStateArgument = fct->GetFunctionArguments()[0];
76 auto memoryStateArgument = fct->GetFunctionArguments()[1];
77 auto pointerArgument = fct->GetFunctionArguments()[2];
79 auto & loadNode = LoadVolatileOperation::CreateNode(
82 { memoryStateArgument },
86 fct->finalize({ loadNode.output(0), loadNode.output(1), loadNode.output(2) });
88 GraphExport::Create(*fct->output(),
"f");
91 this->
load = &loadNode;
96std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
104 { MemoryStateType::Create() });
106 auto module = LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
107 auto graph = &
module->Rvsdg();
112 auto memoryStateArgument = fct->GetFunctionArguments()[0];
113 auto pointerArgument = fct->GetFunctionArguments()[1];
114 auto valueArgument = fct->GetFunctionArguments()[2];
117 StoreNonVolatileOperation::Create(pointerArgument, valueArgument, { memoryStateArgument }, 4);
119 fct->finalize({
store[0] });
121 GraphExport::Create(*fct->output(),
"f");
129std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
136 { IOStateType::Create(),
137 MemoryStateType::Create(),
138 PointerType::Create(),
140 { IOStateType::Create(), MemoryStateType::Create() });
142 auto module = LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
143 auto graph = &
module->Rvsdg();
148 auto iOStateArgument = fct->GetFunctionArguments()[0];
149 auto memoryStateArgument = fct->GetFunctionArguments()[1];
150 auto pointerArgument = fct->GetFunctionArguments()[2];
151 auto valueArgument = fct->GetFunctionArguments()[3];
153 auto & storeNode = StoreVolatileOperation::CreateNode(
157 { memoryStateArgument },
160 fct->finalize({ storeNode.output(0), storeNode.output(1) });
162 GraphExport::Create(*fct->output(),
"f");
165 this->
store = &storeNode;
170std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
177 { IOStateType::Create(), MemoryStateType::Create(), PointerType::Create() },
178 { BitType::Create(32), IOStateType::Create(), MemoryStateType::Create() });
180 auto module = LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
181 auto graph = &
module->Rvsdg();
186 auto iOStateArgument = fct->GetFunctionArguments()[0];
187 auto memoryStateArgument = fct->GetFunctionArguments()[1];
188 auto pointerArgument = fct->GetFunctionArguments()[2];
191 auto & memoryHoistBarrierNode =
192 MemoryHoistBarrierOperation::createNode(*pointerArgument, *iOStateArgument, 4);
194 auto load = LoadNonVolatileOperation::Create(
195 memoryHoistBarrierNode.output(0),
196 { memoryStateArgument },
200 fct->finalize({ load[0], iOStateArgument, load[1] });
202 GraphExport::Create(*fct->output(),
"f");
210std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
216 auto bitType64 = BitType::Create(64);
217 auto bitType32 = BitType::Create(32);
218 auto functionType = FunctionType::Create({ bitType32 }, { bitType32 });
220 auto module = LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
221 auto graph = &
module->Rvsdg();
226 auto valueArgument = fct->GetFunctionArguments()[0];
228 auto & sextNode = SExtOperation::createNode(64, *valueArgument);
229 auto & truncNode = TruncOperation::createNode(*sextNode.output(0), bitType32);
231 fct->finalize({ truncNode.output(0) });
233 GraphExport::Create(*fct->output(),
"f");
236 this->
sext = &sextNode;
237 this->
trunc = &truncNode;
242std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
248 auto floatType = FloatingPointType::Create(fpsize::dbl);
250 FunctionType::Create({ floatType, floatType }, { floatType, floatType, floatType });
252 auto module = LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
253 auto graph = &
module->Rvsdg();
258 auto lhsArgument = fct->GetFunctionArguments()[0];
259 auto rhsArgument = fct->GetFunctionArguments()[1];
261 auto & sum = CreateOpNode<FBinaryOperation>({ lhsArgument, rhsArgument }, fpop::add, floatType);
263 CreateOpNode<FBinaryOperation>({ lhsArgument, rhsArgument }, fpop::sub, floatType);
265 CreateOpNode<FBinaryOperation>({ lhsArgument, rhsArgument }, fpop::mul, floatType);
267 CreateOpNode<FBinaryOperation>({ sum.output(0), difference.output(0) }, fpop::div, floatType);
269 CreateOpNode<FBinaryOperation>({ product.output(0), sum.output(0) }, fpop::mod, floatType);
272 CreateOpNode<FBinaryOperation>({ sum.output(0), difference.output(0) }, fpop::add, floatType);
273 auto & second = CreateOpNode<FBinaryOperation>(
274 { product.output(0), quotient.output(0) },
277 auto & third = CreateOpNode<FBinaryOperation>(
278 { second.output(0), remainder.output(0) },
282 fct->finalize({ first.output(0), second.output(0), third.output(0) });
284 GraphExport::Create(*fct->output(),
"f");
291std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
297 auto doubleType = FloatingPointType::Create(fpsize::dbl);
298 auto floatType = FloatingPointType::Create(fpsize::flt);
299 auto bitType64 = BitType::Create(64);
301 FunctionType::Create({ doubleType, floatType, bitType64 }, { doubleType, doubleType });
303 auto module = LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
304 auto graph = &
module->Rvsdg();
309 auto doubleArgument = fct->GetFunctionArguments()[0];
310 auto floatArgument = fct->GetFunctionArguments()[1];
311 auto integerArgument = fct->GetFunctionArguments()[2];
313 auto & constant = CreateOpNode<ConstantFP>(*fct->subregion(), fpsize::dbl, ::llvm::APFloat(2.0));
315 auto & extended = CreateOpNode<FPExtOperation>({ floatArgument }, floatType, doubleType);
317 auto & sum = CreateOpNode<FBinaryOperation>(
318 { extended.output(0), constant.output(0) },
322 auto & negated = CreateOpNode<FNegOperation>({ sum.output(0) }, doubleType);
324 auto & converted = CreateOpNode<SIToFPOperation>({ integerArgument }, bitType64, doubleType);
326 auto & fused = CreateOpNode<FMulAddIntrinsicOperation>(
327 { doubleArgument, doubleArgument, converted.output(0) },
330 auto & first = CreateOpNode<FBinaryOperation>(
331 { negated.output(0), converted.output(0) },
334 auto & second = CreateOpNode<FBinaryOperation>(
335 { converted.output(0), fused.output(0) },
339 fct->finalize({ first.output(0), second.output(0) });
341 GraphExport::Create(*fct->output(),
"f");
348std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
354 auto doubleType = FloatingPointType::Create(fpsize::dbl);
355 auto pointerType = PointerType::Create();
356 auto bitType32 = BitType::Create(32);
357 auto functionType = FunctionType::Create(
358 { doubleType, doubleType, pointerType, pointerType },
359 { bitType32, bitType32 });
361 auto module = LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
362 auto graph = &
module->Rvsdg();
367 auto lhsArgument = fct->GetFunctionArguments()[0];
368 auto rhsArgument = fct->GetFunctionArguments()[1];
369 auto lhsPointerArgument = fct->GetFunctionArguments()[2];
370 auto rhsPointerArgument = fct->GetFunctionArguments()[3];
372 auto & floatCompareNode =
373 CreateOpNode<FCmpOperation>({ lhsArgument, rhsArgument }, fpcmp::olt, fpsize::dbl);
375 auto zero = &IntegerConstantOperation::Create(*fct->subregion(), { 32, 0 });
376 auto one = &IntegerConstantOperation::Create(*fct->subregion(), { 32, 1 });
378 auto & firstSelect = CreateOpNode<SelectOperation>(
379 { floatCompareNode.output(0), one->output(0), zero->output(0) },
382 auto & pointerCompareNode = CreateOpNode<PtrCmpOperation>(
383 { lhsPointerArgument, rhsPointerArgument },
387 auto & secondSelect = CreateOpNode<SelectOperation>(
388 { pointerCompareNode.output(0), one->output(0), zero->output(0) },
391 fct->finalize({ firstSelect.output(0), secondSelect.output(0) });
393 GraphExport::Create(*fct->output(),
"f");
396 this->
fcmp = &floatCompareNode;
397 this->
ptrcmp = &pointerCompareNode;
402std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
408 auto bitType32 = BitType::Create(32);
409 auto functionType = FunctionType::Create(
410 { IOStateType::Create(), bitType32 },
411 { IOStateType::Create(), bitType32 });
413 auto module = LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
414 auto graph = &
module->Rvsdg();
419 auto iOStateArgument = fct->GetFunctionArguments()[0];
420 auto valueArgument = fct->GetFunctionArguments()[1];
422 auto & barrierNode = IOBarrierOperation::createNode(*valueArgument, *iOStateArgument);
424 auto constant = &IntegerConstantOperation::Create(*fct->subregion(), { 32, 1 });
426 IntegerAddOperation::createNode(32, *barrierNode.output(0), *constant->output(0));
428 fct->finalize({ iOStateArgument, addNode.output(0) });
430 GraphExport::Create(*fct->output(),
"f");
439std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
445 auto bitType32 = BitType::Create(32);
447 auto module = LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
448 auto graph = &
module->Rvsdg();
452 LlvmDeltaOperation::Create(
455 Linkage::externalLinkage,
459 auto mutableConstant =
462 GraphExport::Create(mutableOutput,
"mutableGlobal");
466 LlvmDeltaOperation::Create(
469 Linkage::externalLinkage,
473 auto constantConstant =
476 GraphExport::Create(constantOutput,
"constantGlobal");
484std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
490 auto bitType32 = BitType::Create(32);
491 auto arrayType = ArrayType::Create(bitType32, 2);
493 auto module = LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
494 auto graph = &
module->Rvsdg();
498 LlvmDeltaOperation::Create(arrayType,
"initArray", Linkage::externalLinkage,
"",
false, 4));
501 auto constantDataArray = ConstantDataArrayOperation::Create({ one->output(0), two->output(0) });
503 GraphExport::Create(initOutput,
"initArray");
507 LlvmDeltaOperation::Create(arrayType,
"zeroArray", Linkage::externalLinkage,
"",
false, 4));
511 GraphExport::Create(zeroOutput,
"zeroArray");
521std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
527 auto bitType64 = BitType::Create(64);
528 auto pointerType = PointerType::Create();
529 auto functionType = FunctionType::Create(
530 { IOStateType::Create(), MemoryStateType::Create() },
531 { pointerType, pointerType, IOStateType::Create(), MemoryStateType::Create() });
533 auto module = LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
534 auto graph = &
module->Rvsdg();
539 auto iOStateArgument = fct->GetFunctionArguments()[0];
540 auto memoryStateArgument = fct->GetFunctionArguments()[1];
542 auto size = &IntegerConstantOperation::Create(*fct->subregion(), { 64, 128 });
543 auto & mallocNode = MallocOperation::createNode(*size->output(0), *iOStateArgument);
545 auto count = &IntegerConstantOperation::Create(*fct->subregion(), { 32, 1 });
546 auto & allocaNode = AllocaOperation::createNode(bitType64, *count->output(0), 8);
548 auto memoryState = MemoryStateMergeOperation::Create(
549 std::vector<jlm::rvsdg::Output *>{ memoryStateArgument,
550 &MallocOperation::memoryStateOutput(mallocNode),
551 &AllocaOperation::getMemoryStateOutput(allocaNode) });
553 fct->finalize({ &MallocOperation::addressOutput(mallocNode),
554 allocaNode.output(0),
555 &MallocOperation::ioStateOutput(mallocNode),
558 GraphExport::Create(*fct->output(),
"f");
561 this->
malloc = &mallocNode;
562 this->
alloca = &allocaNode;
567std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
573 auto module = LlvmRvsdgModule::Create(jlm::util::FilePath(""), "", "");
574 auto graph = &
module->Rvsdg();
583 { first->output(0), second->output(0) });
static std::unique_ptr< LlvmLambdaOperation > Create(std::shared_ptr< const jlm::rvsdg::FunctionType > type, std::string name, const jlm::llvm::Linkage &linkage, jlm::llvm::CallingConvention callingConvention, jlm::llvm::AttributeSet attributes)
const rvsdg::Graph & graph()
jlm::rvsdg::SimpleNode * fcmp
jlm::rvsdg::LambdaNode * lambda
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::SimpleNode * ptrcmp
jlm::rvsdg::DeltaNode * constantDelta
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::DeltaNode * mutableDelta
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::LambdaNode * lambda
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::DeltaNode * initDelta
jlm::rvsdg::SimpleNode * constantAggregateZero
jlm::rvsdg::DeltaNode * zeroDelta
jlm::rvsdg::SimpleNode * constantDataArray
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.
jlm::rvsdg::SimpleNode * add
jlm::rvsdg::SimpleNode * barrier
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::SimpleNode * sext
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::SimpleNode * trunc
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.
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::SimpleNode * load
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::SimpleNode * load
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::LambdaNode * lambda
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::SimpleNode * memoryHoistBarrier
jlm::rvsdg::SimpleNode * variadicArgumentList
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::SimpleNode * constant
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::SimpleNode * store
jlm::rvsdg::LambdaNode * lambda
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::SimpleNode * store
jlm::rvsdg::SimpleNode * alloca
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::SimpleNode * malloc
static std::shared_ptr< const BitType > Create(std::size_t nbits)
Creates bit type of specified width.
rvsdg::Region * subregion() const noexcept
rvsdg::Output & finalize(rvsdg::Output *result)
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)
Region & GetRootRegion() const noexcept
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
NodeOutput * output(size_t index) const noexcept
Global memory state passed between functions.
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.