18TEST(MlirToJlmConverterTests, TestLambda)
21 using namespace mlir::rvsdg;
22 using namespace mlir::jlm;
25 std::cout <<
"Creating MLIR context" << std::endl;
26 auto context = std::make_unique<mlir::MLIRContext>();
27 context->getOrLoadDialect<RVSDGDialect>();
28 context->getOrLoadDialect<JLMDialect>();
29 context->getOrLoadDialect<mlir::arith::ArithDialect>();
30 context->getOrLoadDialect<mlir::LLVM::LLVMDialect>();
31 auto Builder_ = std::make_unique<mlir::OpBuilder>(context.get());
33 auto omega = Builder_->create<OmegaNode>(Builder_->getUnknownLoc());
34 auto & omegaRegion = omega.getRegion();
35 auto * omegaBlock =
new mlir::Block;
36 omegaRegion.push_back(omegaBlock);
39 std::cout <<
"Creating function arguments" << std::endl;
40 ::llvm::SmallVector<mlir::Type>
arguments;
41 arguments.push_back(Builder_->getType<IOStateEdgeType>());
42 arguments.push_back(Builder_->getType<MemStateEdgeType>());
43 ::llvm::ArrayRef argumentsArray(
arguments);
46 std::cout <<
"Creating function results" << std::endl;
47 ::llvm::SmallVector<mlir::Type> results;
48 results.push_back(Builder_->getIntegerType(32));
49 results.push_back(Builder_->getType<IOStateEdgeType>());
50 results.push_back(Builder_->getType<MemStateEdgeType>());
51 ::llvm::ArrayRef resultsArray(results);
54 std::cout <<
"Creating function attributes" << std::endl;
55 ::llvm::SmallVector<mlir::NamedAttribute> attributes;
56 auto attributeName = Builder_->getStringAttr(
"sym_name");
57 auto attributeValue = Builder_->getStringAttr(
"test");
58 auto symbolName = Builder_->getNamedAttr(attributeName, attributeValue);
59 attributes.push_back(symbolName);
60 ::llvm::ArrayRef<::mlir::NamedAttribute> attributesRef(attributes);
63 ::llvm::SmallVector<mlir::Value> inputs;
66 std::cout <<
"Creating LambdaNode" << std::endl;
67 auto lambda = Builder_->create<LambdaNode>(
68 Builder_->getUnknownLoc(),
69 Builder_->getType<mlir::FunctionType>(
arguments, results),
72 omegaBlock->push_back(lambda);
73 auto & lambdaRegion = lambda.getRegion();
74 auto * lambdaBlock =
new mlir::Block;
75 lambdaRegion.push_back(lambdaBlock);
78 std::cout <<
"Adding arguments to the region" << std::endl;
79 lambdaBlock->addArgument(Builder_->getType<IOStateEdgeType>(), Builder_->getUnknownLoc());
80 lambdaBlock->addArgument(Builder_->getType<MemStateEdgeType>(), Builder_->getUnknownLoc());
82 auto constOp = Builder_->create<mlir::arith::ConstantIntOp>(Builder_->getUnknownLoc(), 1, 32);
83 lambdaBlock->push_back(constOp);
85 ::llvm::SmallVector<mlir::Value> regionResults;
86 regionResults.push_back(constOp);
87 regionResults.push_back(lambdaBlock->getArgument(0));
88 regionResults.push_back(lambdaBlock->getArgument(1));
91 std::cout <<
"Creating LambdaResult" << std::endl;
92 auto lambdaResult = Builder_->create<LambdaResult>(Builder_->getUnknownLoc(), regionResults);
93 lambdaBlock->push_back(lambdaResult);
96 std::cout <<
"Creating OmegaResult" << std::endl;
97 ::llvm::SmallVector<mlir::Value> omegaRegionResults;
98 omegaRegionResults.push_back(lambda.getResult());
99 ::llvm::SmallVector<mlir::Type> omegaResultTypes;
100 omegaResultTypes.push_back(lambda.getResult().getType());
103 ::llvm::SmallVector<::mlir::Attribute> exportNamesList;
104 exportNamesList.push_back(Builder_->getStringAttr(
"test"));
105 auto exportNamesAttr = ::mlir::ArrayAttr::get(Builder_->getContext(), exportNamesList);
106 ::llvm::SmallVector<::mlir::NamedAttribute> namedAttrs;
107 namedAttrs.push_back({ Builder_->getStringAttr(
"exportNames"), exportNamesAttr });
109 auto omegaResult = Builder_->create<OmegaResult>(
110 Builder_->getUnknownLoc(),
114 omegaBlock->push_back(omegaResult);
116 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
117 rootBlock->push_back(omega);
120 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
122 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
125 std::cout <<
"Checking the result" << std::endl;
127 EXPECT_EQ(region->numNodes(), 1u);
128 auto convertedLambda =
129 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
130 EXPECT_TRUE(is<jlm::llvm::LlvmLambdaOperation>(convertedLambda->GetOperation()));
132 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1u);
133 EXPECT_TRUE(is<jlm::llvm::IntegerConstantOperation>(
134 convertedLambda->subregion()->Nodes().begin().ptr()));
145TEST(MlirToJlmConverterTests, TestDivOperation)
148 using namespace mlir::rvsdg;
149 using namespace mlir::jlm;
152 std::cout <<
"Creating MLIR context" << std::endl;
153 auto context = std::make_unique<mlir::MLIRContext>();
154 context->getOrLoadDialect<RVSDGDialect>();
155 context->getOrLoadDialect<JLMDialect>();
156 context->getOrLoadDialect<mlir::arith::ArithDialect>();
157 context->getOrLoadDialect<mlir::LLVM::LLVMDialect>();
158 auto Builder_ = std::make_unique<mlir::OpBuilder>(context.get());
160 auto omega = Builder_->create<OmegaNode>(Builder_->getUnknownLoc());
161 auto & omegaRegion = omega.getRegion();
162 auto * omegaBlock =
new mlir::Block;
163 omegaRegion.push_back(omegaBlock);
166 std::cout <<
"Creating function arguments" << std::endl;
167 ::llvm::SmallVector<mlir::Type>
arguments;
168 arguments.push_back(Builder_->getIntegerType(32));
169 arguments.push_back(Builder_->getType<IOStateEdgeType>());
170 arguments.push_back(Builder_->getType<MemStateEdgeType>());
171 ::llvm::ArrayRef argumentsArray(
arguments);
174 std::cout <<
"Creating function results" << std::endl;
175 ::llvm::SmallVector<mlir::Type> results;
176 results.push_back(Builder_->getIntegerType(32));
177 results.push_back(Builder_->getType<IOStateEdgeType>());
178 results.push_back(Builder_->getType<MemStateEdgeType>());
179 ::llvm::ArrayRef resultsArray(results);
182 std::cout <<
"Creating function attributes" << std::endl;
183 ::llvm::SmallVector<mlir::NamedAttribute> attributes;
184 auto attributeName = Builder_->getStringAttr(
"sym_name");
185 auto attributeValue = Builder_->getStringAttr(
"test");
186 auto symbolName = Builder_->getNamedAttr(attributeName, attributeValue);
187 attributes.push_back(symbolName);
188 ::llvm::ArrayRef<::mlir::NamedAttribute> attributesRef(attributes);
191 ::llvm::SmallVector<mlir::Value> inputs;
194 std::cout <<
"Creating LambdaNode" << std::endl;
196 Builder_->getUnknownLoc(),
197 Builder_->getType<mlir::FunctionType>(
arguments, results),
200 omegaBlock->push_back(lambda);
201 auto & lambdaRegion = lambda.getRegion();
202 auto * lambdaBlock =
new mlir::Block;
203 lambdaRegion.push_back(lambdaBlock);
206 std::cout <<
"Adding arguments to the region" << std::endl;
207 lambdaBlock->addArgument(Builder_->getIntegerType(32), Builder_->getUnknownLoc());
208 lambdaBlock->addArgument(Builder_->getType<IOStateEdgeType>(), Builder_->getUnknownLoc());
209 lambdaBlock->addArgument(Builder_->getType<MemStateEdgeType>(), Builder_->getUnknownLoc());
212 auto constOp1 = Builder_->create<mlir::arith::ConstantIntOp>(Builder_->getUnknownLoc(), 20, 32);
213 lambdaBlock->push_back(constOp1);
216 auto constOp2 = Builder_->create<mlir::arith::ConstantIntOp>(Builder_->getUnknownLoc(), 5, 32);
217 lambdaBlock->push_back(constOp2);
220 for (
unsigned int i = 0; i < lambdaBlock->getNumArguments(); ++i)
222 auto arg = lambdaBlock->getArgument(i);
223 if (arg.getType().isa<IOStateEdgeType>())
225 std::cout <<
"Argument " << i <<
" is an IOStateEdgeType" << std::endl;
227 else if (arg.getType().isa<MemStateEdgeType>())
229 std::cout <<
"Argument " << i <<
" is a MemStateEdgeType" << std::endl;
231 else if (arg.getType().isa<mlir::IntegerType>())
233 std::cout <<
"Argument " << i <<
" is an IntegerType" << std::endl;
239 auto divideOp = Builder_->create<mlir::arith::DivUIOp>(
240 Builder_->getUnknownLoc(),
241 lambdaBlock->getArgument(0),
243 lambdaBlock->push_back(divideOp);
245 ::llvm::SmallVector<mlir::Value> regionResults;
246 regionResults.push_back(divideOp->getResult(0));
247 regionResults.push_back(lambdaBlock->getArgument(1));
248 regionResults.push_back(lambdaBlock->getArgument(2));
251 std::cout <<
"Creating LambdaResult" << std::endl;
252 auto lambdaResult = Builder_->create<LambdaResult>(Builder_->getUnknownLoc(), regionResults);
253 lambdaBlock->push_back(lambdaResult);
256 std::cout <<
"Creating OmegaResult" << std::endl;
257 ::llvm::SmallVector<mlir::Value> omegaRegionResults;
258 omegaRegionResults.push_back(lambda.getResult());
259 ::llvm::SmallVector<mlir::Type> omegaResultTypes;
260 omegaResultTypes.push_back(lambda.getResult().getType());
263 ::llvm::SmallVector<::mlir::Attribute> exportNamesList;
264 exportNamesList.push_back(Builder_->getStringAttr(
"test"));
265 auto exportNamesAttr = ::mlir::ArrayAttr::get(Builder_->getContext(), exportNamesList);
266 ::llvm::SmallVector<::mlir::NamedAttribute> namedAttrs;
267 namedAttrs.push_back({ Builder_->getStringAttr(
"exportNames"), exportNamesAttr });
269 auto omegaResult = Builder_->create<OmegaResult>(
270 Builder_->getUnknownLoc(),
274 omegaBlock->push_back(omegaResult);
276 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
277 rootBlock->push_back(omega);
280 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
282 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
289 EXPECT_EQ(region->numNodes(), 1u);
292 auto convertedLambda =
293 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
294 EXPECT_TRUE(is<jlm::llvm::LlvmLambdaOperation>(convertedLambda));
297 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 3u);
302 EXPECT_NE(lambdaResultOriginNodeOutput,
nullptr);
303 Node * lambdaResultOriginNode = lambdaResultOriginNodeOutput->
node();
304 EXPECT_TRUE(is<jlm::llvm::IntegerUDivOperation>(lambdaResultOriginNode->
GetOperation()));
305 EXPECT_EQ(lambdaResultOriginNode->
ninputs(), 2u);
310 EXPECT_NE(DivInput0,
nullptr);
312 EXPECT_EQ(std::dynamic_pointer_cast<const BitType>(DivInput0->
Type())->nbits(), 32u);
317 EXPECT_NE(DivInput1Node,
nullptr);
318 EXPECT_TRUE(is<jlm::llvm::IntegerConstantOperation>(DivInput1Node->GetOperation()));
319 auto DivInput1Constant =
321 EXPECT_EQ(DivInput1Constant->Representation().to_int(), 5u);
322 EXPECT_TRUE(is<const BitType>(DivInput1Constant->result(0)));
324 std::dynamic_pointer_cast<const BitType>(DivInput1Constant->result(0))->nbits(),
337TEST(MlirToJlmConverterTests, TestCompZeroExt)
340 using namespace mlir::rvsdg;
341 using namespace mlir::jlm;
344 std::cout <<
"Creating MLIR context" << std::endl;
345 auto context = std::make_unique<mlir::MLIRContext>();
346 context->getOrLoadDialect<RVSDGDialect>();
347 context->getOrLoadDialect<JLMDialect>();
348 context->getOrLoadDialect<mlir::arith::ArithDialect>();
349 context->getOrLoadDialect<mlir::LLVM::LLVMDialect>();
350 auto Builder_ = std::make_unique<mlir::OpBuilder>(context.get());
352 auto omega = Builder_->create<OmegaNode>(Builder_->getUnknownLoc());
353 auto & omegaRegion = omega.getRegion();
354 auto * omegaBlock =
new mlir::Block;
355 omegaRegion.push_back(omegaBlock);
358 std::cout <<
"Creating function arguments" << std::endl;
359 ::llvm::SmallVector<mlir::Type>
arguments;
360 arguments.push_back(Builder_->getIntegerType(32));
361 arguments.push_back(Builder_->getType<IOStateEdgeType>());
362 arguments.push_back(Builder_->getType<MemStateEdgeType>());
363 ::llvm::ArrayRef argumentsArray(
arguments);
366 std::cout <<
"Creating function results" << std::endl;
367 ::llvm::SmallVector<mlir::Type> results;
368 results.push_back(Builder_->getIntegerType(32));
369 results.push_back(Builder_->getType<IOStateEdgeType>());
370 results.push_back(Builder_->getType<MemStateEdgeType>());
371 ::llvm::ArrayRef resultsArray(results);
374 std::cout <<
"Creating function attributes" << std::endl;
375 ::llvm::SmallVector<mlir::NamedAttribute> attributes;
376 auto attributeName = Builder_->getStringAttr(
"sym_name");
377 auto attributeValue = Builder_->getStringAttr(
"test");
378 auto symbolName = Builder_->getNamedAttr(attributeName, attributeValue);
379 attributes.push_back(symbolName);
380 ::llvm::ArrayRef<::mlir::NamedAttribute> attributesRef(attributes);
383 ::llvm::SmallVector<mlir::Value> inputs;
386 std::cout <<
"Creating LambdaNode" << std::endl;
388 Builder_->getUnknownLoc(),
389 Builder_->getType<mlir::FunctionType>(
arguments, results),
392 omegaBlock->push_back(lambda);
393 auto & lambdaRegion = lambda.getRegion();
394 auto * lambdaBlock =
new mlir::Block;
395 lambdaRegion.push_back(lambdaBlock);
398 std::cout <<
"Adding arguments to the region" << std::endl;
399 lambdaBlock->addArgument(Builder_->getIntegerType(32), Builder_->getUnknownLoc());
400 lambdaBlock->addArgument(Builder_->getType<IOStateEdgeType>(), Builder_->getUnknownLoc());
401 lambdaBlock->addArgument(Builder_->getType<MemStateEdgeType>(), Builder_->getUnknownLoc());
404 auto constOp1 = Builder_->create<mlir::arith::ConstantIntOp>(Builder_->getUnknownLoc(), 20, 32);
405 lambdaBlock->push_back(constOp1);
408 auto constOp2 = Builder_->create<mlir::arith::ConstantIntOp>(Builder_->getUnknownLoc(), 5, 32);
409 lambdaBlock->push_back(constOp2);
413 auto AddOp = Builder_->create<mlir::arith::AddIOp>(
414 Builder_->getUnknownLoc(),
415 lambdaBlock->getArgument(0),
417 lambdaBlock->push_back(AddOp);
419 auto compOp = Builder_->create<mlir::arith::CmpIOp>(
420 Builder_->getUnknownLoc(),
421 mlir::arith::CmpIPredicate::eq,
424 lambdaBlock->push_back(compOp);
426 auto zeroExtOp = Builder_->create<mlir::arith::ExtUIOp>(
427 Builder_->getUnknownLoc(),
428 Builder_->getIntegerType(32),
430 lambdaBlock->push_back(zeroExtOp);
433 ::llvm::SmallVector<mlir::Value> regionResults;
434 regionResults.push_back(zeroExtOp->getResult(0));
435 regionResults.push_back(lambdaBlock->getArgument(1));
436 regionResults.push_back(lambdaBlock->getArgument(2));
437 std::cout <<
"Creating LambdaResult" << std::endl;
438 auto lambdaResult = Builder_->create<LambdaResult>(Builder_->getUnknownLoc(), regionResults);
439 lambdaBlock->push_back(lambdaResult);
442 std::cout <<
"Creating OmegaResult" << std::endl;
443 ::llvm::SmallVector<mlir::Value> omegaRegionResults;
444 omegaRegionResults.push_back(lambda.getResult());
445 ::llvm::SmallVector<mlir::Type> omegaResultTypes;
446 omegaResultTypes.push_back(lambda.getResult().getType());
449 ::llvm::SmallVector<::mlir::Attribute> exportNamesList;
450 exportNamesList.push_back(Builder_->getStringAttr(
"test"));
451 auto exportNamesAttr = ::mlir::ArrayAttr::get(Builder_->getContext(), exportNamesList);
452 ::llvm::SmallVector<::mlir::NamedAttribute> namedAttrs;
453 namedAttrs.push_back({ Builder_->getStringAttr(
"exportNames"), exportNamesAttr });
455 auto omegaResult = Builder_->create<OmegaResult>(
456 Builder_->getUnknownLoc(),
460 omegaBlock->push_back(omegaResult);
462 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
463 rootBlock->push_back(omega);
466 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
468 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
473 std::cout <<
"Checking the result" << std::endl;
475 EXPECT_EQ(region->numNodes(), 1u);
478 auto convertedLambda =
479 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
480 EXPECT_TRUE(is<jlm::llvm::LlvmLambdaOperation>(convertedLambda));
483 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 5u);
486 std::cout <<
"Testing lambdaResultOriginNodeOuput\n";
488 *convertedLambda->subregion()->result(0)->origin());
489 EXPECT_NE(ZExtNode,
nullptr);
490 EXPECT_TRUE(is<jlm::llvm::ZExtOperation>(ZExtNode->GetOperation()));
491 EXPECT_EQ(ZExtNode->ninputs(), 1u);
495 EXPECT_EQ(ZExtOp->nsrcbits(), 1u);
496 EXPECT_EQ(ZExtOp->ndstbits(), 32u);
499 std::cout <<
"Testing input 0\n";
502 EXPECT_TRUE(is<jlm::llvm::IntegerEqOperation>(BitEqNode->GetOperation()));
510 EXPECT_EQ(BitEqNode->ninputs(), 2u);
515 EXPECT_TRUE(is<jlm::llvm::IntegerAddOperation>(AddNode->GetOperation()));
516 EXPECT_EQ(AddNode->ninputs(), 2u);
521 EXPECT_TRUE(is<jlm::llvm::IntegerConstantOperation>(Const2Node->GetOperation()));
526 EXPECT_EQ(Const2Op->Representation().to_int(), 5u);
527 EXPECT_TRUE(is<const BitType>(Const2Op->result(0)));
528 EXPECT_EQ(std::dynamic_pointer_cast<const BitType>(Const2Op->result(0))->nbits(), 32u);
532 EXPECT_EQ(AddOp->Type().nbits(), 32u);
537 EXPECT_NE(AddInput0,
nullptr);
539 EXPECT_EQ(std::dynamic_pointer_cast<const BitType>(AddInput0->
Type())->nbits(), 32u);
544 EXPECT_TRUE(is<jlm::llvm::IntegerConstantOperation>(Const1Node->GetOperation()));
549 EXPECT_EQ(Const1Op->Representation().to_int(), 20u);
550 EXPECT_TRUE(is<const BitType>(Const1Op->result(0)));
551 EXPECT_EQ(std::dynamic_pointer_cast<const BitType>(Const1Op->result(0))->nbits(), 32u);
561TEST(MlirToJlmConverterTests, TestMatchOp)
564 using namespace mlir::rvsdg;
565 using namespace mlir::jlm;
568 std::cout <<
"Creating MLIR context" << std::endl;
569 auto context = std::make_unique<mlir::MLIRContext>();
570 context->getOrLoadDialect<RVSDGDialect>();
571 context->getOrLoadDialect<JLMDialect>();
572 context->getOrLoadDialect<mlir::arith::ArithDialect>();
573 context->getOrLoadDialect<mlir::LLVM::LLVMDialect>();
574 auto Builder_ = std::make_unique<mlir::OpBuilder>(context.get());
576 auto omega = Builder_->create<OmegaNode>(Builder_->getUnknownLoc());
577 auto & omegaRegion = omega.getRegion();
578 auto * omegaBlock =
new mlir::Block;
579 omegaRegion.push_back(omegaBlock);
582 std::cout <<
"Creating function arguments" << std::endl;
583 ::llvm::SmallVector<mlir::Type>
arguments;
584 arguments.push_back(Builder_->getIntegerType(32));
585 arguments.push_back(Builder_->getType<IOStateEdgeType>());
586 arguments.push_back(Builder_->getType<MemStateEdgeType>());
587 ::llvm::ArrayRef argumentsArray(
arguments);
590 std::cout <<
"Creating function results" << std::endl;
591 ::llvm::SmallVector<mlir::Type> results;
592 results.push_back(::mlir::rvsdg::RVSDG_CTRLType::get(Builder_->getContext(), 4));
593 results.push_back(Builder_->getType<IOStateEdgeType>());
594 results.push_back(Builder_->getType<MemStateEdgeType>());
595 ::llvm::ArrayRef resultsArray(results);
598 std::cout <<
"Creating function attributes" << std::endl;
599 ::llvm::SmallVector<mlir::NamedAttribute> attributes;
600 auto attributeName = Builder_->getStringAttr(
"sym_name");
601 auto attributeValue = Builder_->getStringAttr(
"test");
602 auto symbolName = Builder_->getNamedAttr(attributeName, attributeValue);
603 attributes.push_back(symbolName);
604 ::llvm::ArrayRef<::mlir::NamedAttribute> attributesRef(attributes);
607 ::llvm::SmallVector<mlir::Value> inputs;
610 std::cout <<
"Creating LambdaNode" << std::endl;
612 Builder_->getUnknownLoc(),
613 Builder_->getType<mlir::FunctionType>(
arguments, results),
616 omegaBlock->push_back(lambda);
617 auto & lambdaRegion = lambda.getRegion();
618 auto * lambdaBlock =
new mlir::Block;
619 lambdaRegion.push_back(lambdaBlock);
622 std::cout <<
"Adding arguments to the region" << std::endl;
623 lambdaBlock->addArgument(Builder_->getIntegerType(32), Builder_->getUnknownLoc());
624 lambdaBlock->addArgument(Builder_->getType<IOStateEdgeType>(), Builder_->getUnknownLoc());
625 lambdaBlock->addArgument(Builder_->getType<MemStateEdgeType>(), Builder_->getUnknownLoc());
627 ::llvm::SmallVector<::mlir::Attribute> mappingVector;
629 mappingVector.push_back(::mlir::rvsdg::MatchRuleAttr::get(
630 Builder_->getContext(),
631 ::llvm::ArrayRef(
static_cast<int64_t
>(0)),
633 mappingVector.push_back(::mlir::rvsdg::MatchRuleAttr::get(
634 Builder_->getContext(),
635 ::llvm::ArrayRef(
static_cast<int64_t
>(1)),
637 mappingVector.push_back(::mlir::rvsdg::MatchRuleAttr::get(
638 Builder_->getContext(),
639 ::llvm::ArrayRef(
static_cast<int64_t
>(1)),
642 mappingVector.push_back(
643 ::mlir::rvsdg::MatchRuleAttr::get(Builder_->getContext(), ::llvm::ArrayRef<int64_t>(), 2));
645 auto Match = Builder_->create<::mlir::rvsdg::Match>(
646 Builder_->getUnknownLoc(),
647 ::mlir::rvsdg::RVSDG_CTRLType::get(
648 Builder_->getContext(),
649 mappingVector.size()),
651 lambdaBlock->getArgument(0),
652 ::mlir::ArrayAttr::get(Builder_->getContext(), ::llvm::ArrayRef(mappingVector)));
653 lambdaBlock->push_back(Match);
656 ::llvm::SmallVector<mlir::Value> regionResults;
657 regionResults.push_back(Match->getResult(0));
658 regionResults.push_back(lambdaBlock->getArgument(1));
659 regionResults.push_back(lambdaBlock->getArgument(2));
660 std::cout <<
"Creating LambdaResult" << std::endl;
661 auto lambdaResult = Builder_->create<LambdaResult>(Builder_->getUnknownLoc(), regionResults);
662 lambdaBlock->push_back(lambdaResult);
665 std::cout <<
"Creating OmegaResult" << std::endl;
666 ::llvm::SmallVector<mlir::Value> omegaRegionResults;
667 omegaRegionResults.push_back(lambda.getResult());
668 ::llvm::SmallVector<mlir::Type> omegaResultTypes;
669 omegaResultTypes.push_back(lambda.getResult().getType());
672 ::llvm::SmallVector<::mlir::Attribute> exportNamesList;
673 exportNamesList.push_back(Builder_->getStringAttr(
"test"));
674 auto exportNamesAttr = ::mlir::ArrayAttr::get(Builder_->getContext(), exportNamesList);
675 ::llvm::SmallVector<::mlir::NamedAttribute> namedAttrs;
676 namedAttrs.push_back({ Builder_->getStringAttr(
"exportNames"), exportNamesAttr });
678 auto omegaResult = Builder_->create<OmegaResult>(
679 Builder_->getUnknownLoc(),
683 omegaBlock->push_back(omegaResult);
686 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
687 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
688 rootBlock->push_back(omega);
690 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
696 auto convertedLambda =
697 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
698 EXPECT_TRUE(is<jlm::llvm::LlvmLambdaOperation>(convertedLambda));
700 auto lambdaRegion = convertedLambda->subregion();
704 EXPECT_TRUE(is<MatchOperation>(matchNode->GetOperation()));
706 auto matchOp =
dynamic_cast<const MatchOperation *
>(&matchNode->GetOperation());
707 EXPECT_EQ(matchOp->narguments(), 1u);
708 EXPECT_TRUE(is<const BitType>(matchOp->argument(0)));
709 EXPECT_EQ(std::dynamic_pointer_cast<const BitType>(matchOp->argument(0))->nbits(), 32u);
712 EXPECT_EQ(matchOp->nalternatives(), 4u);
714 EXPECT_EQ(matchOp->default_alternative(), 2u);
716 for (
auto mapping : *matchOp)
719 (mapping.first == 0 && mapping.second == 4)
720 || (mapping.first == 1 && mapping.second == 5)
721 || (mapping.first == 1 && mapping.second == 6));
732TEST(MlirToJlmConverterTests, TestGammaOp)
735 using namespace mlir::rvsdg;
736 using namespace mlir::jlm;
739 std::cout <<
"Creating MLIR context" << std::endl;
740 auto context = std::make_unique<mlir::MLIRContext>();
741 context->getOrLoadDialect<RVSDGDialect>();
742 context->getOrLoadDialect<JLMDialect>();
743 context->getOrLoadDialect<mlir::arith::ArithDialect>();
744 context->getOrLoadDialect<mlir::LLVM::LLVMDialect>();
745 auto Builder_ = std::make_unique<mlir::OpBuilder>(context.get());
747 auto omega = Builder_->create<OmegaNode>(Builder_->getUnknownLoc());
748 auto & omegaRegion = omega.getRegion();
749 auto * omegaBlock =
new mlir::Block;
750 omegaRegion.push_back(omegaBlock);
753 std::cout <<
"Creating function arguments" << std::endl;
754 ::llvm::SmallVector<mlir::Type>
arguments;
755 arguments.push_back(::mlir::rvsdg::RVSDG_CTRLType::get(Builder_->getContext(), 3));
756 arguments.push_back(Builder_->getType<IOStateEdgeType>());
757 arguments.push_back(Builder_->getType<MemStateEdgeType>());
758 ::llvm::ArrayRef argumentsArray(
arguments);
761 std::cout <<
"Creating function results" << std::endl;
762 ::llvm::SmallVector<mlir::Type> results;
763 results.push_back(Builder_->getIntegerType(32));
764 results.push_back(Builder_->getIntegerType(32));
765 results.push_back(Builder_->getType<IOStateEdgeType>());
766 results.push_back(Builder_->getType<MemStateEdgeType>());
767 ::llvm::ArrayRef resultsArray(results);
770 std::cout <<
"Creating function attributes" << std::endl;
771 ::llvm::SmallVector<mlir::NamedAttribute> attributes;
772 auto attributeName = Builder_->getStringAttr(
"sym_name");
773 auto attributeValue = Builder_->getStringAttr(
"test");
774 auto symbolName = Builder_->getNamedAttr(attributeName, attributeValue);
775 attributes.push_back(symbolName);
776 ::llvm::ArrayRef<::mlir::NamedAttribute> attributesRef(attributes);
779 ::llvm::SmallVector<mlir::Value> inputs;
782 std::cout <<
"Creating LambdaNode" << std::endl;
784 Builder_->getUnknownLoc(),
785 Builder_->getType<mlir::FunctionType>(
arguments, results),
788 omegaBlock->push_back(lambda);
789 auto & lambdaRegion = lambda.getRegion();
790 auto * lambdaBlock =
new mlir::Block;
791 lambdaRegion.push_back(lambdaBlock);
794 std::cout <<
"Adding arguments to the region" << std::endl;
795 lambdaBlock->addArgument(
796 ::mlir::rvsdg::RVSDG_CTRLType::get(Builder_->getContext(), 3),
797 Builder_->getUnknownLoc());
798 lambdaBlock->addArgument(Builder_->getType<IOStateEdgeType>(), Builder_->getUnknownLoc());
799 lambdaBlock->addArgument(Builder_->getType<MemStateEdgeType>(), Builder_->getUnknownLoc());
801 auto entryVar1 = Builder_->create<mlir::arith::ConstantIntOp>(Builder_->getUnknownLoc(), 5, 32);
802 lambdaBlock->push_back(entryVar1);
803 auto entryVar2 = Builder_->create<mlir::arith::ConstantIntOp>(Builder_->getUnknownLoc(), 6, 32);
804 lambdaBlock->push_back(entryVar2);
806 ::llvm::SmallVector<::mlir::Type> typeRangeOuput;
807 typeRangeOuput.push_back(::mlir::IntegerType::get(Builder_->getContext(), 32));
808 typeRangeOuput.push_back(::mlir::IntegerType::get(Builder_->getContext(), 32));
809 ::mlir::rvsdg::GammaNode gamma = Builder_->create<::mlir::rvsdg::GammaNode>(
810 Builder_->getUnknownLoc(),
811 ::mlir::TypeRange(::llvm::ArrayRef(typeRangeOuput)),
812 lambdaBlock->getArgument(0),
813 ::mlir::ValueRange(::llvm::ArrayRef<::mlir::Value>({ entryVar1, entryVar2 })),
814 static_cast<unsigned>(3)
816 lambdaBlock->push_back(gamma);
818 for (
size_t i = 0; i < gamma.getNumRegions(); ++i)
820 auto & gammaBlock = gamma.getRegion(i).emplaceBlock();
822 Builder_->create<mlir::arith::ConstantIntOp>(Builder_->getUnknownLoc(), i + 1, 32);
823 gammaBlock.push_back(exitvar1);
825 Builder_->create<mlir::arith::ConstantIntOp>(Builder_->getUnknownLoc(), 10 * (i + 1), 32);
826 gammaBlock.push_back(exitvar2);
827 auto gammaResult = Builder_->create<::mlir::rvsdg::GammaResult>(
828 Builder_->getUnknownLoc(),
829 ::llvm::SmallVector<mlir::Value>({ exitvar1, exitvar2 }));
830 gammaBlock.push_back(gammaResult);
834 ::llvm::SmallVector<mlir::Value> regionResults;
835 regionResults.push_back(gamma->getResult(0));
836 regionResults.push_back(gamma->getResult(1));
837 regionResults.push_back(lambdaBlock->getArgument(1));
838 regionResults.push_back(lambdaBlock->getArgument(2));
839 std::cout <<
"Creating LambdaResult" << std::endl;
840 auto lambdaResult = Builder_->create<LambdaResult>(Builder_->getUnknownLoc(), regionResults);
841 lambdaBlock->push_back(lambdaResult);
844 std::cout <<
"Creating OmegaResult" << std::endl;
845 ::llvm::SmallVector<mlir::Value> omegaRegionResults;
846 omegaRegionResults.push_back(lambda.getResult());
847 ::llvm::SmallVector<mlir::Type> omegaResultTypes;
848 omegaResultTypes.push_back(lambda.getResult().getType());
851 ::llvm::SmallVector<::mlir::Attribute> exportNamesList;
852 exportNamesList.push_back(Builder_->getStringAttr(
"test"));
853 auto exportNamesAttr = ::mlir::ArrayAttr::get(Builder_->getContext(), exportNamesList);
854 ::llvm::SmallVector<::mlir::NamedAttribute> namedAttrs;
855 namedAttrs.push_back({ Builder_->getStringAttr(
"exportNames"), exportNamesAttr });
857 auto omegaResult = Builder_->create<OmegaResult>(
858 Builder_->getUnknownLoc(),
862 omegaBlock->push_back(omegaResult);
865 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
866 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
867 rootBlock->push_back(omega);
869 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
874 EXPECT_EQ(region->numNodes(), 1u);
877 auto convertedLambda =
878 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
879 EXPECT_TRUE(is<jlm::llvm::LlvmLambdaOperation>(convertedLambda->GetOperation()));
881 auto lambdaRegion = convertedLambda->subregion();
884 EXPECT_EQ(lambdaRegion->numNodes(), 3u);
887 *lambdaRegion->result(0)->origin());
889 std::cout <<
"Checking gamma operation" << std::endl;
890 auto gammaOp =
dynamic_cast<const GammaOperation *
>(&gammaNode->GetOperation());
891 EXPECT_EQ(gammaNode->ninputs(), 3u);
892 EXPECT_EQ(gammaOp->nalternatives(), 3u);
893 EXPECT_EQ(gammaNode->noutputs(), 2u);
903TEST(MlirToJlmConverterTests, TestThetaOp)
906 using namespace mlir::rvsdg;
907 using namespace mlir::jlm;
910 std::cout <<
"Creating MLIR context" << std::endl;
911 auto context = std::make_unique<mlir::MLIRContext>();
912 context->getOrLoadDialect<RVSDGDialect>();
913 context->getOrLoadDialect<JLMDialect>();
914 context->getOrLoadDialect<mlir::arith::ArithDialect>();
915 context->getOrLoadDialect<mlir::LLVM::LLVMDialect>();
916 auto Builder_ = std::make_unique<mlir::OpBuilder>(context.get());
918 auto omega = Builder_->create<OmegaNode>(Builder_->getUnknownLoc());
919 auto & omegaRegion = omega.getRegion();
920 auto * omegaBlock =
new mlir::Block;
921 omegaRegion.push_back(omegaBlock);
924 std::cout <<
"Creating function attributes" << std::endl;
925 auto attributeName = Builder_->getStringAttr(
"sym_name");
926 auto attributeValue = Builder_->getStringAttr(
"test");
927 auto symbolName = Builder_->getNamedAttr(attributeName, attributeValue);
929 auto iotype = Builder_->getType<IOStateEdgeType>();
930 auto memtype = Builder_->getType<MemStateEdgeType>();
933 std::cout <<
"Creating LambdaNode" << std::endl;
935 Builder_->getUnknownLoc(),
936 Builder_->getType<mlir::FunctionType>(
937 ::mlir::TypeRange({ iotype, memtype }),
938 ::mlir::TypeRange({ iotype, memtype })),
939 ::llvm::SmallVector<mlir::Value>(),
940 ::llvm::ArrayRef<::mlir::NamedAttribute>({ symbolName }));
941 omegaBlock->push_back(lambda);
942 auto & lambdaRegion = lambda.getRegion();
943 auto * lambdaBlock =
new mlir::Block;
944 lambdaRegion.push_back(lambdaBlock);
947 std::cout <<
"Adding arguments to the region" << std::endl;
948 lambdaBlock->addArgument(iotype, Builder_->getUnknownLoc());
949 lambdaBlock->addArgument(memtype, Builder_->getUnknownLoc());
951 auto theta = Builder_->create<::mlir::rvsdg::ThetaNode>(
952 Builder_->getUnknownLoc(),
953 ::mlir::TypeRange({ iotype, memtype }),
954 ::mlir::ValueRange({ lambdaBlock->getArgument(0), lambdaBlock->getArgument(1) }),
955 ::llvm::SmallVector<::mlir::NamedAttribute>({}));
956 lambdaBlock->push_back(theta);
958 auto & thetaBlock = theta.getRegion().emplaceBlock();
959 thetaBlock.addArgument(iotype, Builder_->getUnknownLoc());
960 thetaBlock.addArgument(memtype, Builder_->getUnknownLoc());
961 auto predicate = Builder_->create<mlir::rvsdg::ConstantCtrl>(
962 Builder_->getUnknownLoc(),
963 Builder_->getType<::mlir::rvsdg::RVSDG_CTRLType>(2),
965 thetaBlock.push_back(predicate);
967 auto thetaResult = Builder_->create<::mlir::rvsdg::ThetaResult>(
968 Builder_->getUnknownLoc(),
970 ::llvm::SmallVector<mlir::Value>(thetaBlock.getArguments()));
971 thetaBlock.push_back(thetaResult);
974 ::llvm::SmallVector<mlir::Value> regionResults;
975 regionResults.push_back(theta->getResult(0));
976 regionResults.push_back(theta->getResult(1));
977 std::cout <<
"Creating LambdaResult" << std::endl;
978 auto lambdaResult = Builder_->create<LambdaResult>(Builder_->getUnknownLoc(), regionResults);
979 lambdaBlock->push_back(lambdaResult);
982 std::cout <<
"Creating OmegaResult" << std::endl;
983 ::llvm::SmallVector<mlir::Value> omegaRegionResults;
984 omegaRegionResults.push_back(lambda.getResult());
985 ::llvm::SmallVector<mlir::Type> omegaResultTypes;
986 omegaResultTypes.push_back(lambda.getResult().getType());
989 ::llvm::SmallVector<::mlir::Attribute> exportNamesList;
990 exportNamesList.push_back(Builder_->getStringAttr(
"test"));
991 auto exportNamesAttr = ::mlir::ArrayAttr::get(Builder_->getContext(), exportNamesList);
992 ::llvm::SmallVector<::mlir::NamedAttribute> namedAttrs;
993 namedAttrs.push_back({ Builder_->getStringAttr(
"exportNames"), exportNamesAttr });
995 auto omegaResult = Builder_->create<OmegaResult>(
996 Builder_->getUnknownLoc(),
1000 omegaBlock->push_back(omegaResult);
1003 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1004 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1005 rootBlock->push_back(omega);
1007 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1012 EXPECT_EQ(region->numNodes(), 1u);
1015 auto convertedLambda =
1016 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
1017 EXPECT_TRUE(is<jlm::llvm::LlvmLambdaOperation>(convertedLambda->GetOperation()));
1019 auto lambdaRegion = convertedLambda->subregion();
1022 EXPECT_EQ(lambdaRegion->numNodes(), 1u);
1025 *lambdaRegion->result(0)->origin());
1027 std::cout <<
"Checking theta node" << std::endl;
1028 EXPECT_EQ(thetaNode->ninputs(), 2u);
1029 EXPECT_EQ(thetaNode->GetLoopVars().size(), 2u);
1030 EXPECT_EQ(thetaNode->noutputs(), 2u);
1031 EXPECT_EQ(thetaNode->nsubregions(), 1u);
1032 EXPECT_TRUE(is<jlm::rvsdg::ControlType>(thetaNode->predicate()->Type()));
1033 auto predicateType =
1034 std::dynamic_pointer_cast<const ControlType>(thetaNode->predicate()->Type());
1035 EXPECT_EQ(predicateType->nalternatives(), 2u);
1036 std::cout << predicate.getValue() << std::endl;