19TEST(JlmToMlirToJlmTests, TestUndef)
22 using namespace mlir::rvsdg;
25 auto graph = &rvsdgModule->Rvsdg();
29 std::cout <<
"Undef Operation" << std::endl;
33 std::cout <<
"Convert to MLIR" << std::endl;
37 std::cout <<
"Checking blocks and operations count" << std::endl;
38 auto & omegaRegion = omega.getRegion();
39 EXPECT_EQ(omegaRegion.getBlocks().size(), 1u);
40 auto & omegaBlock = omegaRegion.front();
42 EXPECT_EQ(omegaBlock.getOperations().size(), 2u);
43 EXPECT_TRUE(mlir::isa<mlir::jlm::Undef>(omegaBlock.front()));
44 auto mlirUndefOp = mlir::dyn_cast<::mlir::jlm::Undef>(&omegaBlock.front());
48 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
49 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
50 rootBlock->push_back(omega);
52 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
57 EXPECT_EQ(region->numNodes(), 1u);
63 EXPECT_NE(convertedUndef,
nullptr);
65 auto outputType = convertedUndef->result(0);
67 EXPECT_EQ(std::dynamic_pointer_cast<const jlm::rvsdg::BitType>(outputType)->nbits(), 32u);
72TEST(JlmToMlirToJlmTests, TestAlloca)
75 using namespace mlir::rvsdg;
78 auto graph = &rvsdgModule->Rvsdg();
82 std::cout <<
"Bit Constanr" << std::endl;
86 std::cout <<
"Alloca Operation" << std::endl;
94 std::cout <<
"Convert to MLIR" << std::endl;
98 std::cout <<
"Checking blocks and operations count" << std::endl;
99 auto & omegaRegion = omega.getRegion();
100 EXPECT_EQ(omegaRegion.getBlocks().size(), 1u);
101 auto & omegaBlock = omegaRegion.front();
104 EXPECT_EQ(omegaBlock.getOperations().size(), 3u);
106 bool foundAlloca =
false;
107 for (
auto & op : omegaBlock)
109 if (mlir::isa<mlir::jlm::Alloca>(op))
111 auto mlirAllocaOp = mlir::cast<mlir::jlm::Alloca>(op);
112 EXPECT_EQ(mlirAllocaOp.getAlignment(), 4u);
113 EXPECT_EQ(mlirAllocaOp.getNumResults(), 2u);
115 auto valueType = mlir::cast<mlir::IntegerType>(mlirAllocaOp.getValueType());
116 EXPECT_NE(valueType,
nullptr);
117 EXPECT_EQ(valueType.getWidth(), 64u);
121 EXPECT_TRUE(foundAlloca);
124 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
125 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
126 rootBlock->push_back(omega);
128 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
133 EXPECT_EQ(region->numNodes(), 2u);
135 bool foundAlloca =
false;
136 for (
auto & node : region->Nodes())
138 if (
auto allocaOp =
dynamic_cast<const AllocaOperation *
>(&node.GetOperation()))
140 EXPECT_EQ(allocaOp->alignment(), 4u);
145 EXPECT_EQ(valueBitType->nbits(), 64u);
147 EXPECT_EQ(allocaOp->narguments(), 1u);
152 EXPECT_EQ(inputBitType->nbits(), 32u);
154 EXPECT_EQ(allocaOp->nresults(), 2u);
162 EXPECT_TRUE(foundAlloca);
167TEST(JlmToMlirToJlmTests, TestLoad)
170 using namespace mlir::rvsdg;
173 auto graph = &rvsdgModule->Rvsdg();
177 { IOStateType::Create(), MemoryStateType::Create(), PointerType::Create() },
178 { IOStateType::Create(), MemoryStateType::Create() });
180 graph->GetRootRegion(),
181 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
182 auto iOStateArgument = lambda->GetFunctionArguments().at(0);
183 auto memoryStateArgument = lambda->GetFunctionArguments().at(1);
184 auto pointerArgument = lambda->GetFunctionArguments().at(2);
189 auto & subregion = *(lambda->subregion());
190 LoadNonVolatileOperation::Create(
192 std::make_unique<LoadNonVolatileOperation>(loadOp),
193 { pointerArgument, memoryStateArgument });
195 lambda->finalize({ iOStateArgument, memoryStateArgument });
198 std::cout <<
"Convert to MLIR" << std::endl;
203 std::cout <<
"Validate MLIR" << std::endl;
204 auto & omegaRegion = omega.getRegion();
205 auto & omegaBlock = omegaRegion.front();
206 auto & mlirLambda = omegaBlock.front();
207 auto & mlirLambdaRegion = mlirLambda.getRegion(0);
208 auto & mlirLambdaBlock = mlirLambdaRegion.front();
209 auto & mlirOp = mlirLambdaBlock.front();
211 EXPECT_TRUE(mlir::isa<mlir::jlm::Load>(mlirOp));
213 auto mlirLoad = mlir::cast<mlir::jlm::Load>(mlirOp);
214 EXPECT_EQ(mlirLoad.getAlignment(), 4u);
215 EXPECT_EQ(mlirLoad.getInputMemStates().size(), 1u);
216 EXPECT_EQ(mlirLoad.getNumOperands(), 2u);
217 EXPECT_EQ(mlirLoad.getNumResults(), 2u);
219 auto outputType = mlirLoad.getOutput().getType();
220 EXPECT_TRUE(mlir::isa<mlir::IntegerType>(outputType));
221 auto integerType = mlir::cast<mlir::IntegerType>(outputType);
222 EXPECT_EQ(integerType.getWidth(), 32u);
225 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
226 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
227 rootBlock->push_back(omega);
229 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
234 EXPECT_EQ(region->numNodes(), 1u);
235 auto convertedLambda =
236 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
237 EXPECT_TRUE(is<jlm::rvsdg::LambdaOperation>(convertedLambda));
239 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1u);
240 EXPECT_TRUE(is<LoadNonVolatileOperation>(
241 convertedLambda->subregion()->Nodes().begin()->GetOperation()));
242 auto convertedLoad = convertedLambda->subregion()->Nodes().begin().ptr();
246 EXPECT_EQ(loadOperation->GetAlignment(), 4u);
247 EXPECT_EQ(loadOperation->NumMemoryStates(), 1u);
249 EXPECT_TRUE(is<jlm::llvm::PointerType>(convertedLoad->input(0)->Type()));
250 EXPECT_TRUE(is<jlm::llvm::MemoryStateType>(convertedLoad->input(1)->Type()));
252 EXPECT_TRUE(is<jlm::rvsdg::BitType>(convertedLoad->output(0)->Type()));
253 EXPECT_TRUE(is<jlm::llvm::MemoryStateType>(convertedLoad->output(1)->Type()));
256 std::dynamic_pointer_cast<const jlm::rvsdg::BitType>(convertedLoad->output(0)->Type());
257 EXPECT_EQ(outputBitType->nbits(), 32u);
262TEST(JlmToMlirToJlmTests, TestStore)
265 using namespace mlir::rvsdg;
268 auto graph = &rvsdgModule->Rvsdg();
273 { IOStateType::Create(), MemoryStateType::Create(), PointerType::Create(), bitsType },
274 { IOStateType::Create(), MemoryStateType::Create() });
276 graph->GetRootRegion(),
277 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
278 auto iOStateArgument = lambda->GetFunctionArguments().at(0);
279 auto memoryStateArgument = lambda->GetFunctionArguments().at(1);
280 auto pointerArgument = lambda->GetFunctionArguments().at(2);
281 auto bitsArgument = lambda->GetFunctionArguments().at(3);
286 *lambda->subregion(),
287 std::make_unique<StoreNonVolatileOperation>(storeOp),
288 { pointerArgument, bitsArgument, memoryStateArgument });
290 lambda->finalize({ iOStateArgument, memoryStateArgument });
293 std::cout <<
"Convert to MLIR" << std::endl;
298 std::cout <<
"Validate MLIR" << std::endl;
299 auto & omegaRegion = omega.getRegion();
300 auto & omegaBlock = omegaRegion.front();
301 auto & mlirLambda = omegaBlock.front();
302 auto & mlirLambdaRegion = mlirLambda.getRegion(0);
303 auto & mlirLambdaBlock = mlirLambdaRegion.front();
304 auto & mlirOp = mlirLambdaBlock.front();
306 EXPECT_TRUE(mlir::isa<mlir::jlm::Store>(mlirOp));
308 auto mlirStore = mlir::cast<mlir::jlm::Store>(mlirOp);
309 EXPECT_EQ(mlirStore.getAlignment(), 4u);
310 EXPECT_EQ(mlirStore.getInputMemStates().size(), 1u);
311 EXPECT_EQ(mlirStore.getNumOperands(), 3u);
313 auto inputType = mlirStore.getValue().getType();
314 EXPECT_TRUE(mlir::isa<mlir::IntegerType>(inputType));
315 auto integerType = mlir::cast<mlir::IntegerType>(inputType);
316 EXPECT_EQ(integerType.getWidth(), 32u);
319 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
320 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
321 rootBlock->push_back(omega);
323 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
328 EXPECT_EQ(region->numNodes(), 1u);
329 auto convertedLambda =
330 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
331 EXPECT_TRUE(is<jlm::rvsdg::LambdaOperation>(convertedLambda));
333 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1u);
334 EXPECT_TRUE(is<StoreNonVolatileOperation>(
335 convertedLambda->subregion()->Nodes().begin()->GetOperation()));
336 auto convertedStore = convertedLambda->subregion()->Nodes().begin().ptr();
337 auto convertedStoreOperation =
340 EXPECT_EQ(convertedStoreOperation->GetAlignment(), 4u);
341 EXPECT_EQ(convertedStoreOperation->NumMemoryStates(), 1u);
343 EXPECT_TRUE(is<jlm::llvm::PointerType>(convertedStore->input(0)->Type()));
344 EXPECT_TRUE(is<jlm::rvsdg::BitType>(convertedStore->input(1)->Type()));
345 EXPECT_TRUE(is<jlm::llvm::MemoryStateType>(convertedStore->input(2)->Type()));
347 EXPECT_TRUE(is<jlm::llvm::MemoryStateType>(convertedStore->output(0)->Type()));
350 std::dynamic_pointer_cast<const jlm::rvsdg::BitType>(convertedStore->input(1)->Type());
351 EXPECT_EQ(inputBitType->nbits(), 32u);
356TEST(JlmToMlirToJlmTests, TestSext)
359 using namespace mlir::rvsdg;
362 auto graph = &rvsdgModule->Rvsdg();
368 graph->GetRootRegion(),
369 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
370 auto bitsArgument = lambda->GetFunctionArguments().at(0);
375 EXPECT_NE(node,
nullptr);
377 lambda->finalize({});
380 std::cout <<
"Convert to MLIR" << std::endl;
385 std::cout <<
"Validate MLIR" << std::endl;
386 auto & omegaRegion = omega.getRegion();
387 auto & omegaBlock = omegaRegion.front();
388 auto & mlirLambda = omegaBlock.front();
389 auto & mlirLambdaRegion = mlirLambda.getRegion(0);
390 auto & mlirLambdaBlock = mlirLambdaRegion.front();
391 auto & mlirOp = mlirLambdaBlock.front();
393 EXPECT_TRUE(mlir::isa<mlir::arith::ExtSIOp>(mlirOp));
395 auto mlirSext = mlir::cast<mlir::arith::ExtSIOp>(mlirOp);
396 auto inputType = mlirSext.getOperand().getType();
397 auto outputType = mlirSext.getType();
398 EXPECT_TRUE(mlir::isa<mlir::IntegerType>(inputType));
399 EXPECT_TRUE(mlir::isa<mlir::IntegerType>(outputType));
400 EXPECT_TRUE(mlir::cast<mlir::IntegerType>(inputType).getWidth() == 32);
401 EXPECT_TRUE(mlir::cast<mlir::IntegerType>(outputType).getWidth() == 64);
404 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
405 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
406 rootBlock->push_back(omega);
408 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
412 EXPECT_EQ(region->numNodes(), 1u);
413 auto convertedLambda =
414 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
415 EXPECT_TRUE(is<jlm::rvsdg::LambdaOperation>(convertedLambda));
417 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1u);
418 EXPECT_TRUE(is<SExtOperation>(convertedLambda->subregion()->Nodes().begin()->GetOperation()));
420 &convertedLambda->subregion()->Nodes().begin()->GetOperation());
422 EXPECT_EQ(convertedSext->ndstbits(), 64u);
423 EXPECT_EQ(convertedSext->nsrcbits(), 32u);
424 EXPECT_EQ(convertedSext->nresults(), 1u);
429TEST(JlmToMlirToJlmTests, TestSitofp)
432 using namespace mlir::rvsdg;
435 auto graph = &rvsdgModule->Rvsdg();
442 graph->GetRootRegion(),
443 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
444 auto bitsArgument = lambda->GetFunctionArguments().at(0);
449 lambda->finalize({});
452 std::cout <<
"Convert to MLIR" << std::endl;
457 std::cout <<
"Validate MLIR" << std::endl;
458 auto & omegaRegion = omega.getRegion();
459 auto & omegaBlock = omegaRegion.front();
460 auto & mlirLambda = omegaBlock.front();
461 auto & mlirLambdaRegion = mlirLambda.getRegion(0);
462 auto & mlirLambdaBlock = mlirLambdaRegion.front();
463 auto & mlirOp = mlirLambdaBlock.front();
465 EXPECT_TRUE(mlir::isa<mlir::arith::SIToFPOp>(mlirOp));
467 auto mlirSitofp = mlir::cast<mlir::arith::SIToFPOp>(mlirOp);
468 auto inputType = mlirSitofp.getOperand().getType();
469 auto outputType = mlirSitofp.getType();
470 EXPECT_TRUE(mlir::isa<mlir::IntegerType>(inputType));
471 EXPECT_TRUE(mlir::cast<mlir::IntegerType>(inputType).getWidth() == 32);
472 EXPECT_TRUE(mlir::isa<mlir::Float64Type>(outputType));
475 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
476 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
477 rootBlock->push_back(omega);
479 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
483 EXPECT_EQ(region->numNodes(), 1u);
484 auto convertedLambda =
485 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
486 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1u);
488 is<SIToFPOperation>(convertedLambda->subregion()->Nodes().begin()->GetOperation()));
490 &convertedLambda->subregion()->Nodes().begin()->GetOperation());
498TEST(JlmToMlirToJlmTests, TestConstantFP)
501 using namespace mlir::rvsdg;
504 auto graph = &rvsdgModule->Rvsdg();
508 graph->GetRootRegion(),
509 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
514 lambda->finalize({});
517 std::cout <<
"Convert to MLIR" << std::endl;
522 std::cout <<
"Validate MLIR" << std::endl;
523 auto & mlirOp = omega.getRegion().front().front().getRegion(0).front().front();
525 EXPECT_TRUE(mlir::isa<mlir::arith::ConstantFloatOp>(mlirOp));
527 auto mlirConst = mlir::cast<mlir::arith::ConstantFloatOp>(mlirOp);
528 EXPECT_TRUE(mlirConst.value().isExactlyValue(2.0));
531 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
532 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
533 rootBlock->push_back(omega);
535 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
539 EXPECT_EQ(region->numNodes(), 1u);
540 auto convertedLambda =
541 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
542 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1u);
543 EXPECT_TRUE(is<ConstantFP>(convertedLambda->subregion()->Nodes().begin()->GetOperation()));
544 auto convertedConst =
dynamic_cast<const ConstantFP *
>(
545 &convertedLambda->subregion()->Nodes().begin()->GetOperation());
548 EXPECT_TRUE(convertedConst->constant().isExactlyValue(2.0));
553TEST(JlmToMlirToJlmTests, TestFpBinary)
556 using namespace mlir::rvsdg;
557 auto binOps = std::vector<fpop>{ fpop::add, fpop::sub, fpop::mul, fpop::div, fpop::mod };
558 for (
auto binOp : binOps)
561 auto graph = &rvsdgModule->Rvsdg();
566 graph->GetRootRegion(),
567 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
569 auto floatArgument1 = lambda->GetFunctionArguments().at(0);
570 auto floatArgument2 = lambda->GetFunctionArguments().at(1);
573 { floatArgument1, floatArgument2 },
577 lambda->finalize({});
580 std::cout <<
"Convert to MLIR" << std::endl;
585 std::cout <<
"Validate MLIR" << std::endl;
586 auto & mlirOp = omega.getRegion().front().front().getRegion(0).front().front();
590 EXPECT_TRUE(mlir::isa<mlir::arith::AddFOp>(mlirOp));
593 EXPECT_TRUE(mlir::isa<mlir::arith::SubFOp>(mlirOp));
596 EXPECT_TRUE(mlir::isa<mlir::arith::MulFOp>(mlirOp));
599 EXPECT_TRUE(mlir::isa<mlir::arith::DivFOp>(mlirOp));
602 EXPECT_TRUE(mlir::isa<mlir::arith::RemFOp>(mlirOp));
609 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
610 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
611 rootBlock->push_back(omega);
613 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
617 EXPECT_EQ(region->numNodes(), 1u);
618 auto convertedLambda =
619 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
620 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1u);
622 auto node = convertedLambda->subregion()->Nodes().begin().ptr();
623 auto convertedFpbin =
624 jlm::util::assertedCast<const FBinaryOperation>(&node->GetOperation());
625 EXPECT_EQ(convertedFpbin->fpop(), binOp);
626 EXPECT_EQ(convertedFpbin->nresults(), 1u);
627 EXPECT_EQ(convertedFpbin->narguments(), 2u);
633TEST(JlmToMlirToJlmTests, TestFMulAddOp)
636 using namespace mlir::rvsdg;
639 auto graph = &rvsdgModule->Rvsdg();
645 graph->GetRootRegion(),
646 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
648 auto floatArgument1 = lambda->GetFunctionArguments().at(0);
649 auto floatArgument2 = lambda->GetFunctionArguments().at(1);
650 auto floatArgument3 = lambda->GetFunctionArguments().at(2);
653 { floatArgument1, floatArgument2, floatArgument3 },
656 lambda->finalize({ node.output(0) });
659 std::cout <<
"Convert to MLIR" << std::endl;
664 std::cout <<
"Validate MLIR" << std::endl;
665 auto & mlirOp = omega.getRegion().front().front().getRegion(0).front().front();
666 EXPECT_TRUE(mlir::isa<mlir::LLVM::FMulAddOp>(mlirOp));
669 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
670 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
671 rootBlock->push_back(omega);
675 auto region = &roundTripModule->Rvsdg().GetRootRegion();
676 EXPECT_EQ(region->numNodes(), 1u);
677 auto convertedLambda =
678 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
679 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1u);
680 const auto arguments = convertedLambda->GetFunctionArguments();
681 const auto results = convertedLambda->GetFunctionResults();
683 EXPECT_EQ(results.size(), 1u);
685 auto & convertedNode = *convertedLambda->subregion()->Nodes().begin();
686 EXPECT_TRUE(is<jlm::llvm::FMulAddIntrinsicOperation>(&convertedNode));
687 EXPECT_EQ(convertedNode.input(0)->origin(),
arguments[0]);
688 EXPECT_EQ(convertedNode.input(1)->origin(),
arguments[1]);
689 EXPECT_EQ(convertedNode.input(2)->origin(),
arguments[2]);
690 EXPECT_EQ(results[0]->origin(), convertedNode.output(0));
694TEST(JlmToMlirToJlmTests, TestGetElementPtr)
697 using namespace mlir::rvsdg;
700 auto graph = &rvsdgModule->Rvsdg();
702 auto pointerType = PointerType::Create();
707 graph->GetRootRegion(),
708 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
710 auto pointerArgument = lambda->GetFunctionArguments().at(0);
711 auto bitArgument = lambda->GetFunctionArguments().at(1);
713 auto arrayType = ArrayType::Create(bitType, 2);
715 GetElementPtrOperation::create(pointerArgument, { bitArgument, bitArgument }, arrayType);
717 lambda->finalize({});
720 std::cout <<
"Convert to MLIR" << std::endl;
725 std::cout <<
"Validate MLIR" << std::endl;
726 auto & op = omega.getRegion().front().front().getRegion(0).front().front();
728 EXPECT_TRUE(mlir::isa<mlir::LLVM::GEPOp>(op));
730 auto mlirGep = mlir::cast<mlir::LLVM::GEPOp>(op);
731 EXPECT_TRUE(mlir::isa<mlir::LLVM::LLVMPointerType>(mlirGep.getBase().getType()));
732 EXPECT_TRUE(mlir::isa<mlir::LLVM::LLVMPointerType>(mlirGep.getType()));
734 EXPECT_TRUE(mlir::isa<mlir::LLVM::LLVMArrayType>(mlirGep.getElemType()));
735 auto mlirArrayType = mlir::cast<mlir::LLVM::LLVMArrayType>(mlirGep.getElemType());
737 EXPECT_TRUE(mlir::isa<mlir::IntegerType>(mlirArrayType.getElementType()));
738 EXPECT_EQ(mlirArrayType.getNumElements(), 2u);
740 auto indices = mlirGep.getIndices();
741 EXPECT_EQ(indices.size(), 2u);
742 auto index0 = indices[0].dyn_cast<mlir::Value>();
743 auto index1 = indices[1].dyn_cast<mlir::Value>();
744 EXPECT_NE(index0,
nullptr);
745 EXPECT_NE(index1,
nullptr);
746 EXPECT_TRUE(index0.getType().isa<mlir::IntegerType>());
747 EXPECT_TRUE(index1.getType().isa<mlir::IntegerType>());
748 EXPECT_EQ(index0.getType().getIntOrFloatBitWidth(), 32u);
749 EXPECT_EQ(index1.getType().getIntOrFloatBitWidth(), 32u);
752 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
753 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
754 rootBlock->push_back(omega);
756 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
761 EXPECT_EQ(region->numNodes(), 1u);
762 auto convertedLambda =
763 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
764 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1u);
766 auto op = convertedLambda->subregion()->Nodes().begin();
767 EXPECT_TRUE(is<GetElementPtrOperation>(op->GetOperation()));
770 EXPECT_TRUE(is<ArrayType>(convertedGep->getPointeeType()));
771 EXPECT_TRUE(is<PointerType>(convertedGep->result(0)));
772 EXPECT_TRUE(is<jlm::rvsdg::BitType>(convertedGep->argument(1)));
773 EXPECT_TRUE(is<jlm::rvsdg::BitType>(convertedGep->argument(2)));
778TEST(JlmToMlirToJlmTests, TestDelta)
781 using namespace mlir::rvsdg;
784 auto graph = &rvsdgModule->Rvsdg();
789 &graph->GetRootRegion(),
790 LlvmDeltaOperation::Create(
792 "non-constant-delta",
793 Linkage::externalLinkage,
799 delta1->finalize(bitConstant);
802 &graph->GetRootRegion(),
803 LlvmDeltaOperation::Create(
806 Linkage::externalLinkage,
811 delta2->finalize(bitConstant2);
814 std::cout <<
"Convert to MLIR" << std::endl;
819 std::cout <<
"Validate MLIR" << std::endl;
821 auto & omegaBlock = omega.getRegion().front();
822 EXPECT_EQ(omegaBlock.getOperations().size(), 3u);
823 for (
auto & op : omegaBlock.getOperations())
825 auto mlirDeltaNode = ::mlir::dyn_cast<::mlir::rvsdg::DeltaNode>(&op);
826 auto mlirOmegaResult = ::mlir::dyn_cast<::mlir::rvsdg::OmegaResult>(&op);
828 EXPECT_TRUE(mlirDeltaNode || mlirOmegaResult);
835 if (mlirDeltaNode.getConstant())
837 EXPECT_EQ(mlirDeltaNode.getName().str(),
"constant-delta");
841 EXPECT_EQ(mlirDeltaNode.getName().str(),
"non-constant-delta");
844 EXPECT_EQ(mlirDeltaNode.getSection(),
"section");
845 EXPECT_EQ(mlirDeltaNode.getLinkage(),
"external_linkage");
846 EXPECT_TRUE(mlirDeltaNode.getType().isa<mlir::LLVM::LLVMPointerType>());
847 auto terminator = mlirDeltaNode.getRegion().front().getTerminator();
848 EXPECT_NE(terminator,
nullptr);
849 EXPECT_EQ(terminator->getNumOperands(), 1u);
850 EXPECT_TRUE(terminator->getOperand(0).getType().isa<mlir::IntegerType>());
854 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
855 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
856 rootBlock->push_back(omega);
858 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
863 EXPECT_EQ(region->numNodes(), 2u);
864 for (
auto & node : region->Nodes())
866 auto convertedDelta = jlm::util::assertedCast<jlm::rvsdg::DeltaNode>(&node);
867 EXPECT_EQ(convertedDelta->subregion()->numNodes(), 1u);
868 auto dop = jlm::util::assertedCast<const LlvmDeltaOperation>(&node.GetOperation());
870 if (convertedDelta->constant())
872 EXPECT_EQ(dop->name(),
"constant-delta");
876 EXPECT_EQ(dop->name(),
"non-constant-delta");
879 EXPECT_TRUE(is<jlm::rvsdg::BitType>(*dop->Type()));
880 EXPECT_EQ(dop->linkage(), Linkage::externalLinkage);
881 EXPECT_EQ(dop->Section(),
"section");
883 auto op = convertedDelta->subregion()->Nodes().begin();
884 EXPECT_TRUE(is<jlm::llvm::IntegerConstantOperation>(op->GetOperation()));
890TEST(JlmToMlirToJlmTests, TestConstantDataArray)
893 using namespace mlir::rvsdg;
896 auto graph = &rvsdgModule->Rvsdg();
907 std::cout <<
"Convert to MLIR" << std::endl;
912 std::cout <<
"Validate MLIR" << std::endl;
913 auto & omegaRegion = omega.getRegion();
914 auto & omegaBlock = omegaRegion.front();
915 bool foundConstantDataArray =
false;
916 for (
auto & op : omegaBlock.getOperations())
918 auto mlirConstantDataArray = ::mlir::dyn_cast<::mlir::jlm::ConstantDataArray>(&op);
919 if (mlirConstantDataArray)
921 EXPECT_EQ(mlirConstantDataArray.getNumOperands(), 2u);
922 EXPECT_TRUE(mlirConstantDataArray.getOperand(0).getType().isa<mlir::IntegerType>());
923 EXPECT_TRUE(mlirConstantDataArray.getOperand(1).getType().isa<mlir::IntegerType>());
924 auto mlirConstantDataArrayResultType =
925 mlirConstantDataArray.getResult().getType().dyn_cast<mlir::LLVM::LLVMArrayType>();
926 EXPECT_NE(mlirConstantDataArrayResultType,
nullptr);
927 EXPECT_TRUE(mlirConstantDataArrayResultType.getElementType().isa<mlir::IntegerType>());
928 EXPECT_EQ(mlirConstantDataArrayResultType.getNumElements(), 2u);
929 foundConstantDataArray =
true;
932 EXPECT_TRUE(foundConstantDataArray);
935 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
936 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
937 rootBlock->push_back(omega);
939 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
944 EXPECT_EQ(region->numNodes(), 3u);
945 bool foundConstantDataArray =
false;
946 for (
auto & node : region->Nodes())
948 if (
auto constantDataArray =
951 foundConstantDataArray =
true;
952 EXPECT_EQ(constantDataArray->nresults(), 1u);
953 EXPECT_EQ(constantDataArray->narguments(), 2u);
954 auto resultType = constantDataArray->result(0);
956 EXPECT_NE(arrayType,
nullptr);
957 EXPECT_TRUE(is<jlm::rvsdg::BitType>(arrayType->element_type()));
958 EXPECT_EQ(arrayType->nelements(), 2u);
959 EXPECT_TRUE(is<jlm::rvsdg::BitType>(constantDataArray->argument(0)));
960 EXPECT_TRUE(is<jlm::rvsdg::BitType>(constantDataArray->argument(1)));
963 EXPECT_TRUE(foundConstantDataArray);
968TEST(JlmToMlirToJlmTests, TestConstantAggregateZero)
971 using namespace mlir::rvsdg;
974 auto graph = &rvsdgModule->Rvsdg();
979 ConstantAggregateZeroOperation::Create(graph->GetRootRegion(), arrayType);
982 std::cout <<
"Convert to MLIR" << std::endl;
987 std::cout <<
"Validate MLIR" << std::endl;
988 auto & omegaRegion = omega.getRegion();
989 auto & omegaBlock = omegaRegion.front();
990 auto mlirConstantAggregateZero = ::mlir::dyn_cast<::mlir::LLVM::ZeroOp>(&omegaBlock.front());
991 EXPECT_NE(mlirConstantAggregateZero,
nullptr);
992 auto mlirConstantAggregateZeroResultType =
993 mlirConstantAggregateZero.getType().dyn_cast<mlir::LLVM::LLVMArrayType>();
994 EXPECT_NE(mlirConstantAggregateZeroResultType,
nullptr);
995 EXPECT_TRUE(mlirConstantAggregateZeroResultType.getElementType().isa<mlir::IntegerType>());
996 EXPECT_EQ(mlirConstantAggregateZeroResultType.getNumElements(), 2u);
999 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1000 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1001 rootBlock->push_back(omega);
1003 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1008 EXPECT_EQ(region->numNodes(), 1u);
1009 auto const convertedConstantAggregateZero =
1010 jlm::util::assertedCast<const ConstantAggregateZeroOperation>(
1011 ®ion->Nodes().begin().ptr()->GetOperation());
1012 EXPECT_EQ(convertedConstantAggregateZero->nresults(), 1u);
1013 EXPECT_EQ(convertedConstantAggregateZero->narguments(), 0u);
1014 auto resultType = convertedConstantAggregateZero->result(0);
1016 EXPECT_NE(arrayType,
nullptr);
1017 EXPECT_TRUE(is<jlm::rvsdg::BitType>(arrayType->element_type()));
1018 EXPECT_EQ(arrayType->nelements(), 2u);
1023TEST(JlmToMlirToJlmTests, TestVarArgList)
1026 using namespace mlir::rvsdg;
1029 auto graph = &rvsdgModule->Rvsdg();
1038 std::cout <<
"Convert to MLIR" << std::endl;
1043 std::cout <<
"Validate MLIR" << std::endl;
1044 auto & omegaRegion = omega.getRegion();
1045 auto & omegaBlock = omegaRegion.front();
1046 bool foundVarArgOp =
false;
1047 for (
auto & op : omegaBlock.getOperations())
1049 auto mlirVarArgOp = ::mlir::dyn_cast<::mlir::jlm::CreateVarArgList>(&op);
1052 EXPECT_EQ(mlirVarArgOp.getOperands().size(), 2u);
1053 EXPECT_TRUE(mlirVarArgOp.getOperands()[0].getType().isa<mlir::IntegerType>());
1054 EXPECT_TRUE(mlirVarArgOp.getOperands()[1].getType().isa<mlir::IntegerType>());
1055 EXPECT_TRUE(mlirVarArgOp.getResult().getType().isa<mlir::jlm::VarargListType>());
1056 foundVarArgOp =
true;
1059 EXPECT_TRUE(foundVarArgOp);
1062 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1063 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1064 rootBlock->push_back(omega);
1066 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1071 EXPECT_EQ(region->numNodes(), 3u);
1072 bool foundVarArgOp =
false;
1073 for (
auto & node : region->Nodes())
1075 auto convertedVarArgOp =
1077 if (convertedVarArgOp)
1079 EXPECT_EQ(convertedVarArgOp->nresults(), 1u);
1080 EXPECT_EQ(convertedVarArgOp->narguments(), 2u);
1081 auto resultType = convertedVarArgOp->result(0);
1082 EXPECT_TRUE(is<jlm::llvm::VariableArgumentType>(resultType));
1083 EXPECT_TRUE(is<jlm::rvsdg::BitType>(convertedVarArgOp->argument(0)));
1084 EXPECT_TRUE(is<jlm::rvsdg::BitType>(convertedVarArgOp->argument(1)));
1085 foundVarArgOp =
true;
1088 EXPECT_TRUE(foundVarArgOp);
1096 using namespace mlir::rvsdg;
1099 auto graph = &rvsdgModule->Rvsdg();
1104 graph->GetRootRegion(),
1106 ::llvm::APFloat(2.0));
1110 std::cout <<
"Convert to MLIR" << std::endl;
1115 std::cout <<
"Validate MLIR" << std::endl;
1116 auto & omegaRegion = omega.getRegion();
1117 auto & omegaBlock = omegaRegion.front();
1118 bool foundFNegOp =
false;
1119 for (
auto & op : omegaBlock.getOperations())
1121 auto mlirFNegOp = ::mlir::dyn_cast<::mlir::arith::NegFOp>(&op);
1124 auto inputFloatType = mlirFNegOp.getOperand().getType().dyn_cast<mlir::FloatType>();
1125 EXPECT_NE(inputFloatType,
nullptr);
1126 EXPECT_EQ(inputFloatType.getWidth(), 32u);
1127 auto outputFloatType = mlirFNegOp.getResult().getType().dyn_cast<mlir::FloatType>();
1128 EXPECT_NE(outputFloatType,
nullptr);
1129 EXPECT_EQ(outputFloatType.getWidth(), 32u);
1133 EXPECT_TRUE(foundFNegOp);
1136 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1137 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1138 rootBlock->push_back(omega);
1140 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1145 EXPECT_EQ(region->numNodes(), 2u);
1146 bool foundFNegOp =
false;
1147 for (
auto & node : region->Nodes())
1149 auto convertedFNegOp =
dynamic_cast<const FNegOperation *
>(&node.GetOperation());
1150 if (convertedFNegOp)
1152 EXPECT_EQ(convertedFNegOp->nresults(), 1u);
1153 EXPECT_EQ(convertedFNegOp->narguments(), 1u);
1154 auto inputFloatType = jlm::util::assertedCast<const jlm::llvm::FloatingPointType>(
1155 convertedFNegOp->argument(0).get());
1157 auto outputFloatType = jlm::util::assertedCast<const jlm::llvm::FloatingPointType>(
1158 convertedFNegOp->result(0).get());
1163 EXPECT_TRUE(foundFNegOp);
1168TEST(JlmToMlirToJlmTests, TestFPExt)
1171 using namespace mlir::rvsdg;
1174 auto graph = &rvsdgModule->Rvsdg();
1180 graph->GetRootRegion(),
1182 ::llvm::APFloat(2.0));
1186 std::cout <<
"Convert to MLIR" << std::endl;
1191 std::cout <<
"Validate MLIR" << std::endl;
1192 auto & omegaRegion = omega.getRegion();
1193 auto & omegaBlock = omegaRegion.front();
1194 bool foundFPExtOp =
false;
1195 for (
auto & op : omegaBlock.getOperations())
1197 auto mlirFPExtOp = ::mlir::dyn_cast<::mlir::arith::ExtFOp>(&op);
1200 auto inputFloatType = mlirFPExtOp.getOperand().getType().dyn_cast<mlir::FloatType>();
1201 EXPECT_NE(inputFloatType,
nullptr);
1202 EXPECT_EQ(inputFloatType.getWidth(), 32u);
1203 auto outputFloatType = mlirFPExtOp.getResult().getType().dyn_cast<mlir::FloatType>();
1204 EXPECT_NE(outputFloatType,
nullptr);
1205 EXPECT_EQ(outputFloatType.getWidth(), 64u);
1206 foundFPExtOp =
true;
1209 EXPECT_TRUE(foundFPExtOp);
1212 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1213 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1214 rootBlock->push_back(omega);
1216 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1221 EXPECT_EQ(region->numNodes(), 2u);
1222 bool foundFPExtOp =
false;
1223 for (
auto & node : region->Nodes())
1225 auto convertedFPExtOp =
dynamic_cast<const FPExtOperation *
>(&node.GetOperation());
1226 if (convertedFPExtOp)
1228 EXPECT_EQ(convertedFPExtOp->nresults(), 1u);
1229 EXPECT_EQ(convertedFPExtOp->narguments(), 1u);
1230 auto inputFloatType = jlm::util::assertedCast<const jlm::llvm::FloatingPointType>(
1231 convertedFPExtOp->argument(0).get());
1233 auto outputFloatType = jlm::util::assertedCast<const jlm::llvm::FloatingPointType>(
1234 convertedFPExtOp->result(0).get());
1236 foundFPExtOp =
true;
1239 EXPECT_TRUE(foundFPExtOp);
1244TEST(JlmToMlirToJlmTests, TestTrunc)
1247 using namespace mlir::rvsdg;
1250 auto graph = &rvsdgModule->Rvsdg();
1259 std::cout <<
"Convert to MLIR" << std::endl;
1264 std::cout <<
"Validate MLIR" << std::endl;
1265 auto & omegaRegion = omega.getRegion();
1266 auto & omegaBlock = omegaRegion.front();
1267 bool foundTruncOp =
false;
1268 for (
auto & op : omegaBlock.getOperations())
1270 auto mlirTruncOp = ::mlir::dyn_cast<::mlir::arith::TruncIOp>(&op);
1273 auto inputBitType = mlirTruncOp.getOperand().getType().dyn_cast<mlir::IntegerType>();
1274 EXPECT_NE(inputBitType,
nullptr);
1275 EXPECT_EQ(inputBitType.getWidth(), 64u);
1276 auto outputBitType = mlirTruncOp.getResult().getType().dyn_cast<mlir::IntegerType>();
1277 EXPECT_NE(outputBitType,
nullptr);
1278 EXPECT_EQ(outputBitType.getWidth(), 32u);
1279 foundTruncOp =
true;
1282 EXPECT_TRUE(foundTruncOp);
1285 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1286 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1287 rootBlock->push_back(omega);
1289 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1294 EXPECT_EQ(region->numNodes(), 2u);
1295 bool foundTruncOp =
false;
1296 for (
auto & node : region->Nodes())
1298 auto convertedTruncOp =
dynamic_cast<const TruncOperation *
>(&node.GetOperation());
1299 if (convertedTruncOp)
1301 EXPECT_EQ(convertedTruncOp->nresults(), 1u);
1302 EXPECT_EQ(convertedTruncOp->narguments(), 1u);
1303 auto inputBitType = jlm::util::assertedCast<const jlm::rvsdg::BitType>(
1304 convertedTruncOp->argument(0).get());
1305 EXPECT_EQ(inputBitType->nbits(), 64u);
1306 auto outputBitType =
1307 jlm::util::assertedCast<const jlm::rvsdg::BitType>(convertedTruncOp->result(0).get());
1308 EXPECT_EQ(outputBitType->nbits(), 32u);
1309 foundTruncOp =
true;
1312 EXPECT_TRUE(foundTruncOp);
1320 using namespace mlir::rvsdg;
1323 auto graph = &rvsdgModule->Rvsdg();
1327 { IOStateType::Create(), MemoryStateType::Create(), PointerType::Create() },
1330 graph->GetRootRegion(),
1331 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
1332 auto iOStateArgument = lambda->GetFunctionArguments().at(0);
1333 auto memoryStateArgument = lambda->GetFunctionArguments().at(1);
1334 auto pointerArgument = lambda->GetFunctionArguments().at(2);
1339 lambda->finalize({});
1342 std::cout <<
"Convert to MLIR" << std::endl;
1347 std::cout <<
"Validate MLIR" << std::endl;
1348 auto & omegaRegion = omega.getRegion();
1349 auto & omegaBlock = omegaRegion.front();
1350 auto & mlirLambda = omegaBlock.front();
1351 auto & mlirLambdaRegion = mlirLambda.getRegion(0);
1352 auto & mlirLambdaBlock = mlirLambdaRegion.front();
1353 auto & mlirOp = mlirLambdaBlock.front();
1355 EXPECT_TRUE(mlir::isa<mlir::jlm::Free>(mlirOp));
1357 auto mlirFree = mlir::cast<mlir::jlm::Free>(mlirOp);
1358 EXPECT_EQ(mlirFree.getNumOperands(), 3u);
1359 EXPECT_EQ(mlirFree.getNumResults(), 2u);
1361 auto inputType1 = mlirFree.getOperand(0).getType();
1362 auto inputType2 = mlirFree.getOperand(1).getType();
1363 auto inputType3 = mlirFree.getOperand(2).getType();
1364 EXPECT_TRUE(mlir::isa<mlir::LLVM::LLVMPointerType>(inputType1));
1365 EXPECT_TRUE(mlir::isa<mlir::rvsdg::MemStateEdgeType>(inputType2));
1366 EXPECT_TRUE(mlir::isa<mlir::rvsdg::IOStateEdgeType>(inputType3));
1368 auto outputType1 = mlirFree.getResult(0).getType();
1369 auto outputType2 = mlirFree.getResult(1).getType();
1370 EXPECT_TRUE(mlir::isa<mlir::rvsdg::MemStateEdgeType>(outputType1));
1371 EXPECT_TRUE(mlir::isa<mlir::rvsdg::IOStateEdgeType>(outputType2));
1374 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1375 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1376 rootBlock->push_back(omega);
1378 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1383 EXPECT_EQ(region->numNodes(), 1u);
1384 auto convertedLambda =
1385 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
1386 EXPECT_TRUE(is<jlm::rvsdg::LambdaOperation>(convertedLambda));
1388 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1u);
1389 EXPECT_TRUE(is<FreeOperation>(convertedLambda->subregion()->Nodes().begin()->GetOperation()));
1391 &convertedLambda->subregion()->Nodes().begin()->GetOperation());
1393 EXPECT_EQ(convertedFree->narguments(), 3u);
1394 EXPECT_EQ(convertedFree->nresults(), 2u);
1396 EXPECT_TRUE(is<jlm::llvm::PointerType>(convertedFree->argument(0)));
1397 EXPECT_TRUE(is<jlm::llvm::MemoryStateType>(convertedFree->argument(1)));
1398 EXPECT_TRUE(is<jlm::llvm::IOStateType>(convertedFree->argument(2)));
1400 EXPECT_TRUE(is<jlm::llvm::MemoryStateType>(convertedFree->result(0)));
1401 EXPECT_TRUE(is<jlm::llvm::IOStateType>(convertedFree->result(1)));
1406TEST(JlmToMlirToJlmTests, TestFunctionGraphImport)
1409 using namespace mlir::rvsdg;
1412 auto graph = &rvsdgModule->Rvsdg();
1416 { IOStateType::Create(), MemoryStateType::Create(), PointerType::Create() },
1417 { IOStateType::Create(), MemoryStateType::Create() });
1423 Linkage::externalLinkage,
1424 CallingConvention::Default);
1427 std::cout <<
"Convert to MLIR" << std::endl;
1432 std::cout <<
"Validate MLIR" << std::endl;
1433 auto & omegaRegion = omega.getRegion();
1434 auto & omegaBlock = omegaRegion.front();
1435 auto & mlirOp = omegaBlock.front();
1437 EXPECT_TRUE(mlir::isa<mlir::rvsdg::OmegaArgument>(mlirOp));
1439 auto mlirOmegaArgument = mlir::cast<mlir::rvsdg::OmegaArgument>(mlirOp);
1441 auto valueType = mlirOmegaArgument.getValueType();
1442 auto importedValueType = mlirOmegaArgument.getImportedValue().getType();
1443 auto linkage = mlirOmegaArgument.getLinkage();
1444 auto name = mlirOmegaArgument.getName();
1446 auto mlirFunctionType = valueType.dyn_cast<mlir::FunctionType>();
1447 auto mlirImportedFunctionType = importedValueType.dyn_cast<mlir::FunctionType>();
1448 EXPECT_NE(mlirFunctionType,
nullptr);
1449 EXPECT_NE(mlirImportedFunctionType,
nullptr);
1450 EXPECT_EQ(mlirFunctionType, mlirImportedFunctionType);
1451 EXPECT_EQ(mlirFunctionType.getNumInputs(), 3u);
1452 EXPECT_EQ(mlirFunctionType.getNumResults(), 2u);
1453 EXPECT_TRUE(mlir::isa<mlir::rvsdg::IOStateEdgeType>(mlirFunctionType.getInput(0)));
1454 EXPECT_TRUE(mlir::isa<mlir::rvsdg::MemStateEdgeType>(mlirFunctionType.getInput(1)));
1455 EXPECT_TRUE(mlir::isa<mlir::LLVM::LLVMPointerType>(mlirFunctionType.getInput(2)));
1456 EXPECT_TRUE(mlir::isa<mlir::rvsdg::IOStateEdgeType>(mlirFunctionType.getResult(0)));
1457 EXPECT_TRUE(mlir::isa<mlir::rvsdg::MemStateEdgeType>(mlirFunctionType.getResult(1)));
1458 EXPECT_EQ(linkage,
"external_linkage");
1459 EXPECT_EQ(name,
"test");
1462 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1463 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1464 rootBlock->push_back(omega);
1466 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1471 EXPECT_EQ(region->numNodes(), 0u);
1473 EXPECT_EQ(region->graph()->GetRootRegion().narguments(), 1u);
1474 auto arg = region->graph()->GetRootRegion().argument(0);
1476 EXPECT_NE(imp,
nullptr);
1477 EXPECT_EQ(imp->Name(),
"test");
1478 EXPECT_EQ(imp->linkage(), Linkage::externalLinkage);
1479 EXPECT_EQ(*imp->ValueType(), *functionType);
1480 EXPECT_EQ(*imp->ImportedType(), *functionType);
1485TEST(JlmToMlirToJlmTests, TestPointerGraphImport)
1488 using namespace mlir::rvsdg;
1491 auto graph = &rvsdgModule->Rvsdg();
1497 PointerType::Create(),
1499 Linkage::externalLinkage,
1504 std::cout <<
"Convert to MLIR" << std::endl;
1509 std::cout <<
"Validate MLIR" << std::endl;
1510 auto & omegaRegion = omega.getRegion();
1511 auto & omegaBlock = omegaRegion.front();
1512 auto & mlirOp = omegaBlock.front();
1514 EXPECT_TRUE(mlir::isa<mlir::rvsdg::OmegaArgument>(mlirOp));
1516 auto mlirOmegaArgument = mlir::cast<mlir::rvsdg::OmegaArgument>(mlirOp);
1518 auto valueType = mlirOmegaArgument.getValueType();
1519 auto importedValueType = mlirOmegaArgument.getImportedValue().getType();
1520 auto linkage = mlirOmegaArgument.getLinkage();
1521 auto name = mlirOmegaArgument.getName();
1523 EXPECT_TRUE(mlir::isa<mlir::LLVM::LLVMPointerType>(importedValueType));
1525 auto mlirIntType = valueType.dyn_cast<mlir::IntegerType>();
1526 EXPECT_NE(mlirIntType,
nullptr);
1527 EXPECT_EQ(mlirIntType.getWidth(), 32u);
1528 EXPECT_EQ(linkage,
"external_linkage");
1529 EXPECT_EQ(name,
"test");
1532 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1533 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1534 rootBlock->push_back(omega);
1536 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1541 EXPECT_EQ(region->numNodes(), 0u);
1543 EXPECT_EQ(region->graph()->GetRootRegion().narguments(), 1u);
1544 auto arg = region->graph()->GetRootRegion().argument(0);
1546 EXPECT_NE(imp,
nullptr);
1547 EXPECT_EQ(imp->Name(),
"test");
1548 EXPECT_EQ(imp->linkage(), Linkage::externalLinkage);
1550 EXPECT_EQ(*imp->ImportedType(), *PointerType::Create());
1556TEST(JlmToMlirToJlmTests, TestIOBarrier)
1559 using namespace mlir::rvsdg;
1562 auto graph = &rvsdgModule->Rvsdg();
1569 graph->GetRootRegion(),
1570 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
1571 auto ioStateArgument = lambda->GetFunctionArguments()[0];
1578 { value, ioStateArgument },
1582 lambda->finalize({});
1585 std::cout <<
"Convert to MLIR" << std::endl;
1590 std::cout <<
"Validate MLIR" << std::endl;
1591 auto & omegaRegion = omega.getRegion();
1592 EXPECT_EQ(omegaRegion.getBlocks().size(), 1u);
1593 auto & omegaBlock = omegaRegion.front();
1594 auto & mlirLambda = omegaBlock.front();
1595 auto & mlirLambdaRegion = mlirLambda.getRegion(0);
1596 auto & mlirLambdaBlock = mlirLambdaRegion.front();
1599 bool foundIOBarrier =
false;
1600 for (
auto & lambdaOp : mlirLambdaBlock.getOperations())
1602 if (
auto ioBarrier = mlir::dyn_cast<mlir::jlm::IOBarrier>(&lambdaOp))
1604 foundIOBarrier =
true;
1607 EXPECT_EQ(ioBarrier->getNumOperands(), 2u);
1610 auto valueType = ioBarrier->getOperand(0).getType().dyn_cast<mlir::IntegerType>();
1611 EXPECT_NE(valueType,
nullptr);
1612 EXPECT_EQ(valueType.getWidth(), 32u);
1613 EXPECT_TRUE(mlir::isa<mlir::rvsdg::IOStateEdgeType>(ioBarrier->getOperand(1).getType()));
1616 auto resultType = ioBarrier->getResult(0).getType().dyn_cast<mlir::IntegerType>();
1617 EXPECT_NE(resultType,
nullptr);
1618 EXPECT_EQ(resultType.getWidth(), 32u);
1621 EXPECT_TRUE(foundIOBarrier);
1624 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1625 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1626 rootBlock->push_back(omega);
1628 auto region = &convertedRvsdgModule->Rvsdg().GetRootRegion();
1634 EXPECT_EQ(region->numNodes(), 1u);
1635 auto & lambdaNode = *region->Nodes().begin();
1637 EXPECT_NE(lambdaOperation,
nullptr);
1640 bool foundIOBarrier =
false;
1641 for (
auto & lambdaNode : lambdaOperation->subregion()->Nodes())
1643 auto ioBarrierOp =
dynamic_cast<const IOBarrierOperation *
>(&lambdaNode.GetOperation());
1646 foundIOBarrier =
true;
1649 EXPECT_EQ(ioBarrierOp->nresults(), 1u);
1650 EXPECT_EQ(ioBarrierOp->narguments(), 2u);
1655 EXPECT_NE(valueType,
nullptr);
1656 EXPECT_EQ(valueType->nbits(), 32u);
1659 auto ioStateType =
dynamic_cast<const IOStateType *
>(ioBarrierOp->argument(1).get());
1660 EXPECT_NE(ioStateType,
nullptr);
1663 auto outputType =
dynamic_cast<const jlm::rvsdg::BitType *
>(ioBarrierOp->result(0).get());
1664 EXPECT_NE(outputType,
nullptr);
1665 EXPECT_EQ(outputType->nbits(), 32u);
1668 EXPECT_TRUE(foundIOBarrier);
1673TEST(JlmToMlirToJlmTests, TestMalloc)
1676 using namespace mlir::rvsdg;
1679 auto graph = &rvsdgModule->Rvsdg();
1683 auto undefIOState = UndefValueOperation::Create(graph->GetRootRegion(), IOStateType::Create());
1684 MallocOperation::createNode(*constOp, *undefIOState);
1687 std::cout <<
"Convert to MLIR" << std::endl;
1692 std::cout <<
"Validate MLIR" << std::endl;
1693 auto & omegaRegion = omega.getRegion();
1694 auto & omegaBlock = omegaRegion.front();
1695 bool foundMallocOp =
false;
1696 for (
auto & op : omegaBlock.getOperations())
1698 auto mlirMallocOp = ::mlir::dyn_cast<::mlir::jlm::Malloc>(&op);
1701 auto inputBitType = mlirMallocOp.getOperand(0).getType().dyn_cast<mlir::IntegerType>();
1702 EXPECT_NE(inputBitType,
nullptr);
1703 EXPECT_EQ(inputBitType.getWidth(), 64u);
1704 EXPECT_TRUE(mlir::isa<mlir::LLVM::LLVMPointerType>(mlirMallocOp.getResult(0).getType()));
1705 EXPECT_TRUE(mlir::isa<mlir::rvsdg::IOStateEdgeType>(mlirMallocOp.getResult(1).getType()));
1706 EXPECT_TRUE(mlir::isa<mlir::rvsdg::MemStateEdgeType>(mlirMallocOp.getResult(2).getType()));
1707 foundMallocOp =
true;
1710 EXPECT_TRUE(foundMallocOp);
1713 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1714 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1715 rootBlock->push_back(omega);
1717 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1722 EXPECT_EQ(region->numNodes(), 3u);
1723 bool foundMallocOp =
false;
1724 for (
auto & node : region->Nodes())
1726 auto convertedMallocOp =
dynamic_cast<const MallocOperation *
>(&node.GetOperation());
1727 if (convertedMallocOp)
1729 EXPECT_EQ(convertedMallocOp->nresults(), 3u);
1730 EXPECT_EQ(convertedMallocOp->narguments(), 2u);
1731 auto inputBitType = jlm::util::assertedCast<const jlm::rvsdg::BitType>(
1732 convertedMallocOp->argument(0).get());
1733 EXPECT_EQ(inputBitType->nbits(), 64u);
1737 foundMallocOp =
true;
1740 EXPECT_TRUE(foundMallocOp);