6 #include <gtest/gtest.h>
19 TEST(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(), 1);
40 auto & omegaBlock = omegaRegion.front();
42 EXPECT_EQ(omegaBlock.getOperations().size(), 2);
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(), 1);
63 EXPECT_NE(convertedUndef,
nullptr);
65 auto outputType = convertedUndef->result(0);
66 EXPECT_TRUE(jlm::rvsdg::is<const jlm::rvsdg::BitType>(outputType));
67 EXPECT_EQ(std::dynamic_pointer_cast<const jlm::rvsdg::BitType>(outputType)->nbits(), 32);
72 TEST(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;
87 jlm::rvsdg::CreateOpNode<AllocaOperation>(
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(), 1);
101 auto & omegaBlock = omegaRegion.front();
104 EXPECT_EQ(omegaBlock.getOperations().size(), 3);
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(), 4);
113 EXPECT_EQ(mlirAllocaOp.getNumResults(), 2);
115 auto valueType = mlir::cast<mlir::IntegerType>(mlirAllocaOp.getValueType());
116 EXPECT_NE(valueType,
nullptr);
117 EXPECT_EQ(valueType.getWidth(), 64);
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(), 2);
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(), 4);
142 EXPECT_TRUE(jlm::rvsdg::is<jlm::rvsdg::BitType>(allocaOp->allocatedType()));
145 EXPECT_EQ(valueBitType->nbits(), 64);
147 EXPECT_EQ(allocaOp->narguments(), 1);
149 EXPECT_TRUE(jlm::rvsdg::is<jlm::rvsdg::BitType>(allocaOp->argument(0)));
152 EXPECT_EQ(inputBitType->nbits(), 32);
154 EXPECT_EQ(allocaOp->nresults(), 2);
156 EXPECT_TRUE(jlm::rvsdg::is<PointerType>(allocaOp->result(0)));
157 EXPECT_TRUE(jlm::rvsdg::is<jlm::llvm::MemoryStateType>(allocaOp->result(1)));
162 EXPECT_TRUE(foundAlloca);
167 TEST(JlmToMlirToJlmTests, TestLoad)
170 using namespace mlir::rvsdg;
173 auto graph = &rvsdgModule->Rvsdg();
180 graph->GetRootRegion(),
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());
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(), 4);
215 EXPECT_EQ(mlirLoad.getInputMemStates().size(), 1);
216 EXPECT_EQ(mlirLoad.getNumOperands(), 2);
217 EXPECT_EQ(mlirLoad.getNumResults(), 2);
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(), 32);
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(), 1);
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(), 1);
240 EXPECT_TRUE(is<LoadNonVolatileOperation>(
241 convertedLambda->subregion()->Nodes().begin()->GetOperation()));
242 auto convertedLoad = convertedLambda->subregion()->Nodes().begin().ptr();
246 EXPECT_EQ(loadOperation->GetAlignment(), 4);
247 EXPECT_EQ(loadOperation->NumMemoryStates(), 1);
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(), 32);
262 TEST(JlmToMlirToJlmTests, TestStore)
265 using namespace mlir::rvsdg;
268 auto graph = &rvsdgModule->Rvsdg();
276 graph->GetRootRegion(),
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(), 4);
310 EXPECT_EQ(mlirStore.getInputMemStates().size(), 1);
311 EXPECT_EQ(mlirStore.getNumOperands(), 3);
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(), 32);
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(), 1);
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(), 1);
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(), 4);
341 EXPECT_EQ(convertedStoreOperation->NumMemoryStates(), 1);
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(), 32);
356 TEST(JlmToMlirToJlmTests, TestSext)
359 using namespace mlir::rvsdg;
362 auto graph = &rvsdgModule->Rvsdg();
368 graph->GetRootRegion(),
370 auto bitsArgument = lambda->GetFunctionArguments().at(0);
374 auto node = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*sextOp);
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(), 1);
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(), 1);
418 EXPECT_TRUE(is<SExtOperation>(convertedLambda->subregion()->Nodes().begin()->GetOperation()));
420 &convertedLambda->subregion()->Nodes().begin()->GetOperation());
422 EXPECT_EQ(convertedSext->ndstbits(), 64);
423 EXPECT_EQ(convertedSext->nsrcbits(), 32);
424 EXPECT_EQ(convertedSext->nresults(), 1);
429 TEST(JlmToMlirToJlmTests, TestSitofp)
432 using namespace mlir::rvsdg;
435 auto graph = &rvsdgModule->Rvsdg();
442 graph->GetRootRegion(),
444 auto bitsArgument = lambda->GetFunctionArguments().at(0);
447 jlm::rvsdg::CreateOpNode<SIToFPOperation>({ bitsArgument }, bitsType, floatType);
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(), 1);
484 auto convertedLambda =
485 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
486 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1);
488 is<SIToFPOperation>(convertedLambda->subregion()->Nodes().begin()->GetOperation()));
490 &convertedLambda->subregion()->Nodes().begin()->GetOperation());
492 EXPECT_TRUE(jlm::rvsdg::is<jlm::rvsdg::BitType>(*convertedSitofp->argument(0).get()));
493 EXPECT_TRUE(jlm::rvsdg::is<jlm::llvm::FloatingPointType>(*convertedSitofp->result(0).get()));
498 TEST(JlmToMlirToJlmTests, TestConstantFP)
501 using namespace mlir::rvsdg;
504 auto graph = &rvsdgModule->Rvsdg();
508 graph->GetRootRegion(),
512 jlm::rvsdg::CreateOpNode<ConstantFP>(*lambda->subregion(),
fpsize::dbl, ::llvm::APFloat(2.0));
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(), 1);
540 auto convertedLambda =
541 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
542 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1);
543 EXPECT_TRUE(is<ConstantFP>(convertedLambda->subregion()->Nodes().begin()->GetOperation()));
544 auto convertedConst =
dynamic_cast<const ConstantFP *
>(
545 &convertedLambda->subregion()->Nodes().begin()->GetOperation());
547 EXPECT_TRUE(jlm::rvsdg::is<jlm::llvm::FloatingPointType>(*convertedConst->result(0).get()));
548 EXPECT_TRUE(convertedConst->constant().isExactlyValue(2.0));
553 TEST(JlmToMlirToJlmTests, TestFpBinary)
556 using namespace mlir::rvsdg;
558 for (
auto binOp : binOps)
561 auto graph = &rvsdgModule->Rvsdg();
566 graph->GetRootRegion(),
569 auto floatArgument1 = lambda->GetFunctionArguments().at(0);
570 auto floatArgument2 = lambda->GetFunctionArguments().at(1);
572 jlm::rvsdg::CreateOpNode<FBinaryOperation>(
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(), 1);
618 auto convertedLambda =
619 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
620 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1);
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(), 1);
627 EXPECT_EQ(convertedFpbin->narguments(), 2);
633 TEST(JlmToMlirToJlmTests, TestFMulAddOp)
636 using namespace mlir::rvsdg;
639 auto graph = &rvsdgModule->Rvsdg();
645 graph->GetRootRegion(),
648 auto floatArgument1 = lambda->GetFunctionArguments().at(0);
649 auto floatArgument2 = lambda->GetFunctionArguments().at(1);
650 auto floatArgument3 = lambda->GetFunctionArguments().at(2);
652 auto & node = jlm::rvsdg::CreateOpNode<jlm::llvm::FMulAddIntrinsicOperation>(
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(), 1);
677 auto convertedLambda =
678 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
679 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1);
680 const auto arguments = convertedLambda->GetFunctionArguments();
681 const auto results = convertedLambda->GetFunctionResults();
682 EXPECT_EQ(arguments.size(), 3);
683 EXPECT_EQ(results.size(), 1);
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));
694 TEST(JlmToMlirToJlmTests, TestGetElementPtr)
697 using namespace mlir::rvsdg;
700 auto graph = &rvsdgModule->Rvsdg();
707 graph->GetRootRegion(),
710 auto pointerArgument = lambda->GetFunctionArguments().at(0);
711 auto bitArgument = lambda->GetFunctionArguments().at(1);
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(), 2);
740 auto indices = mlirGep.getIndices();
741 EXPECT_EQ(indices.size(), 2);
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(), 32);
749 EXPECT_EQ(index1.getType().getIntOrFloatBitWidth(), 32);
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(), 1);
762 auto convertedLambda =
763 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
764 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1);
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)));
778 TEST(JlmToMlirToJlmTests, TestDelta)
781 using namespace mlir::rvsdg;
784 auto graph = &rvsdgModule->Rvsdg();
789 &graph->GetRootRegion(),
792 "non-constant-delta",
799 delta1->finalize(bitConstant);
802 &graph->GetRootRegion(),
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(), 3);
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(), 1);
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(), 2);
864 for (
auto & node : region->Nodes())
866 auto convertedDelta = jlm::util::assertedCast<jlm::rvsdg::DeltaNode>(&node);
867 EXPECT_EQ(convertedDelta->subregion()->numNodes(), 1);
868 auto dop = jlm::util::assertedCast<const jlm::llvm::DeltaOperation>(&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()));
881 EXPECT_EQ(dop->Section(),
"section");
883 auto op = convertedDelta->subregion()->Nodes().begin();
884 EXPECT_TRUE(is<jlm::llvm::IntegerConstantOperation>(op->GetOperation()));
890 TEST(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(), 2);
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(), 2);
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(), 3);
945 bool foundConstantDataArray =
false;
946 for (
auto & node : region->Nodes())
948 if (
auto constantDataArray =
dynamic_cast<const ConstantDataArray *
>(&node.GetOperation()))
950 foundConstantDataArray =
true;
951 EXPECT_EQ(constantDataArray->nresults(), 1);
952 EXPECT_EQ(constantDataArray->narguments(), 2);
953 auto resultType = constantDataArray->result(0);
955 EXPECT_NE(arrayType,
nullptr);
956 EXPECT_TRUE(is<jlm::rvsdg::BitType>(arrayType->element_type()));
957 EXPECT_EQ(arrayType->nelements(), 2);
958 EXPECT_TRUE(is<jlm::rvsdg::BitType>(constantDataArray->argument(0)));
959 EXPECT_TRUE(is<jlm::rvsdg::BitType>(constantDataArray->argument(1)));
962 EXPECT_TRUE(foundConstantDataArray);
967 TEST(JlmToMlirToJlmTests, TestConstantAggregateZero)
970 using namespace mlir::rvsdg;
973 auto graph = &rvsdgModule->Rvsdg();
981 std::cout <<
"Convert to MLIR" << std::endl;
986 std::cout <<
"Validate MLIR" << std::endl;
987 auto & omegaRegion = omega.getRegion();
988 auto & omegaBlock = omegaRegion.front();
989 auto mlirConstantAggregateZero = ::mlir::dyn_cast<::mlir::LLVM::ZeroOp>(&omegaBlock.front());
990 EXPECT_NE(mlirConstantAggregateZero,
nullptr);
991 auto mlirConstantAggregateZeroResultType =
992 mlirConstantAggregateZero.getType().dyn_cast<mlir::LLVM::LLVMArrayType>();
993 EXPECT_NE(mlirConstantAggregateZeroResultType,
nullptr);
994 EXPECT_TRUE(mlirConstantAggregateZeroResultType.getElementType().isa<mlir::IntegerType>());
995 EXPECT_EQ(mlirConstantAggregateZeroResultType.getNumElements(), 2);
998 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
999 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1000 rootBlock->push_back(omega);
1002 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1007 EXPECT_EQ(region->numNodes(), 1);
1008 auto const convertedConstantAggregateZero =
1009 jlm::util::assertedCast<const ConstantAggregateZeroOperation>(
1010 ®ion->Nodes().begin().ptr()->GetOperation());
1011 EXPECT_EQ(convertedConstantAggregateZero->nresults(), 1);
1012 EXPECT_EQ(convertedConstantAggregateZero->narguments(), 0);
1013 auto resultType = convertedConstantAggregateZero->result(0);
1015 EXPECT_NE(arrayType,
nullptr);
1016 EXPECT_TRUE(is<jlm::rvsdg::BitType>(arrayType->element_type()));
1017 EXPECT_EQ(arrayType->nelements(), 2);
1022 TEST(JlmToMlirToJlmTests, TestVarArgList)
1025 using namespace mlir::rvsdg;
1028 auto graph = &rvsdgModule->Rvsdg();
1037 std::cout <<
"Convert to MLIR" << std::endl;
1042 std::cout <<
"Validate MLIR" << std::endl;
1043 auto & omegaRegion = omega.getRegion();
1044 auto & omegaBlock = omegaRegion.front();
1045 bool foundVarArgOp =
false;
1046 for (
auto & op : omegaBlock.getOperations())
1048 auto mlirVarArgOp = ::mlir::dyn_cast<::mlir::jlm::CreateVarArgList>(&op);
1051 EXPECT_EQ(mlirVarArgOp.getOperands().size(), 2);
1052 EXPECT_TRUE(mlirVarArgOp.getOperands()[0].getType().isa<mlir::IntegerType>());
1053 EXPECT_TRUE(mlirVarArgOp.getOperands()[1].getType().isa<mlir::IntegerType>());
1054 EXPECT_TRUE(mlirVarArgOp.getResult().getType().isa<mlir::jlm::VarargListType>());
1055 foundVarArgOp =
true;
1058 EXPECT_TRUE(foundVarArgOp);
1061 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1062 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1063 rootBlock->push_back(omega);
1065 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1070 EXPECT_EQ(region->numNodes(), 3);
1071 bool foundVarArgOp =
false;
1072 for (
auto & node : region->Nodes())
1074 auto convertedVarArgOp =
1076 if (convertedVarArgOp)
1078 EXPECT_EQ(convertedVarArgOp->nresults(), 1);
1079 EXPECT_EQ(convertedVarArgOp->narguments(), 2);
1080 auto resultType = convertedVarArgOp->result(0);
1081 EXPECT_TRUE(is<jlm::llvm::VariableArgumentType>(resultType));
1082 EXPECT_TRUE(is<jlm::rvsdg::BitType>(convertedVarArgOp->argument(0)));
1083 EXPECT_TRUE(is<jlm::rvsdg::BitType>(convertedVarArgOp->argument(1)));
1084 foundVarArgOp =
true;
1087 EXPECT_TRUE(foundVarArgOp);
1092 TEST(JlmToMlirToJlmTests, TestFNeg)
1095 using namespace mlir::rvsdg;
1098 auto graph = &rvsdgModule->Rvsdg();
1102 auto & constNode = jlm::rvsdg::CreateOpNode<ConstantFP>(
1103 graph->GetRootRegion(),
1105 ::llvm::APFloat(2.0));
1109 std::cout <<
"Convert to MLIR" << std::endl;
1114 std::cout <<
"Validate MLIR" << std::endl;
1115 auto & omegaRegion = omega.getRegion();
1116 auto & omegaBlock = omegaRegion.front();
1117 bool foundFNegOp =
false;
1118 for (
auto & op : omegaBlock.getOperations())
1120 auto mlirFNegOp = ::mlir::dyn_cast<::mlir::arith::NegFOp>(&op);
1123 auto inputFloatType = mlirFNegOp.getOperand().getType().dyn_cast<mlir::FloatType>();
1124 EXPECT_NE(inputFloatType,
nullptr);
1125 EXPECT_EQ(inputFloatType.getWidth(), 32);
1126 auto outputFloatType = mlirFNegOp.getResult().getType().dyn_cast<mlir::FloatType>();
1127 EXPECT_NE(outputFloatType,
nullptr);
1128 EXPECT_EQ(outputFloatType.getWidth(), 32);
1132 EXPECT_TRUE(foundFNegOp);
1135 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1136 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1137 rootBlock->push_back(omega);
1139 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1144 EXPECT_EQ(region->numNodes(), 2);
1145 bool foundFNegOp =
false;
1146 for (
auto & node : region->Nodes())
1148 auto convertedFNegOp =
dynamic_cast<const FNegOperation *
>(&node.GetOperation());
1149 if (convertedFNegOp)
1151 EXPECT_EQ(convertedFNegOp->nresults(), 1);
1152 EXPECT_EQ(convertedFNegOp->narguments(), 1);
1153 auto inputFloatType = jlm::util::assertedCast<const jlm::llvm::FloatingPointType>(
1154 convertedFNegOp->argument(0).get());
1156 auto outputFloatType = jlm::util::assertedCast<const jlm::llvm::FloatingPointType>(
1157 convertedFNegOp->result(0).get());
1162 EXPECT_TRUE(foundFNegOp);
1167 TEST(JlmToMlirToJlmTests, TestFPExt)
1170 using namespace mlir::rvsdg;
1173 auto graph = &rvsdgModule->Rvsdg();
1178 auto & constNode = jlm::rvsdg::CreateOpNode<ConstantFP>(
1179 graph->GetRootRegion(),
1181 ::llvm::APFloat(2.0));
1182 jlm::rvsdg::CreateOpNode<FPExtOperation>({ constNode.output(0) }, floatType1, floatType2);
1185 std::cout <<
"Convert to MLIR" << std::endl;
1190 std::cout <<
"Validate MLIR" << std::endl;
1191 auto & omegaRegion = omega.getRegion();
1192 auto & omegaBlock = omegaRegion.front();
1193 bool foundFPExtOp =
false;
1194 for (
auto & op : omegaBlock.getOperations())
1196 auto mlirFPExtOp = ::mlir::dyn_cast<::mlir::arith::ExtFOp>(&op);
1199 auto inputFloatType = mlirFPExtOp.getOperand().getType().dyn_cast<mlir::FloatType>();
1200 EXPECT_NE(inputFloatType,
nullptr);
1201 EXPECT_EQ(inputFloatType.getWidth(), 32);
1202 auto outputFloatType = mlirFPExtOp.getResult().getType().dyn_cast<mlir::FloatType>();
1203 EXPECT_NE(outputFloatType,
nullptr);
1204 EXPECT_EQ(outputFloatType.getWidth(), 64);
1205 foundFPExtOp =
true;
1208 EXPECT_TRUE(foundFPExtOp);
1211 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1212 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1213 rootBlock->push_back(omega);
1215 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1220 EXPECT_EQ(region->numNodes(), 2);
1221 bool foundFPExtOp =
false;
1222 for (
auto & node : region->Nodes())
1224 auto convertedFPExtOp =
dynamic_cast<const FPExtOperation *
>(&node.GetOperation());
1225 if (convertedFPExtOp)
1227 EXPECT_EQ(convertedFPExtOp->nresults(), 1);
1228 EXPECT_EQ(convertedFPExtOp->narguments(), 1);
1229 auto inputFloatType = jlm::util::assertedCast<const jlm::llvm::FloatingPointType>(
1230 convertedFPExtOp->argument(0).get());
1232 auto outputFloatType = jlm::util::assertedCast<const jlm::llvm::FloatingPointType>(
1233 convertedFPExtOp->result(0).get());
1235 foundFPExtOp =
true;
1238 EXPECT_TRUE(foundFPExtOp);
1243 TEST(JlmToMlirToJlmTests, TestTrunc)
1246 using namespace mlir::rvsdg;
1249 auto graph = &rvsdgModule->Rvsdg();
1255 jlm::rvsdg::CreateOpNode<TruncOperation>({ constOp }, bitType1, bitType2);
1258 std::cout <<
"Convert to MLIR" << std::endl;
1263 std::cout <<
"Validate MLIR" << std::endl;
1264 auto & omegaRegion = omega.getRegion();
1265 auto & omegaBlock = omegaRegion.front();
1266 bool foundTruncOp =
false;
1267 for (
auto & op : omegaBlock.getOperations())
1269 auto mlirTruncOp = ::mlir::dyn_cast<::mlir::arith::TruncIOp>(&op);
1272 auto inputBitType = mlirTruncOp.getOperand().getType().dyn_cast<mlir::IntegerType>();
1273 EXPECT_NE(inputBitType,
nullptr);
1274 EXPECT_EQ(inputBitType.getWidth(), 64);
1275 auto outputBitType = mlirTruncOp.getResult().getType().dyn_cast<mlir::IntegerType>();
1276 EXPECT_NE(outputBitType,
nullptr);
1277 EXPECT_EQ(outputBitType.getWidth(), 32);
1278 foundTruncOp =
true;
1281 EXPECT_TRUE(foundTruncOp);
1284 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1285 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1286 rootBlock->push_back(omega);
1288 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1293 EXPECT_EQ(region->numNodes(), 2);
1294 bool foundTruncOp =
false;
1295 for (
auto & node : region->Nodes())
1297 auto convertedTruncOp =
dynamic_cast<const TruncOperation *
>(&node.GetOperation());
1298 if (convertedTruncOp)
1300 EXPECT_EQ(convertedTruncOp->nresults(), 1);
1301 EXPECT_EQ(convertedTruncOp->narguments(), 1);
1302 auto inputBitType = jlm::util::assertedCast<const jlm::rvsdg::BitType>(
1303 convertedTruncOp->argument(0).get());
1304 EXPECT_EQ(inputBitType->nbits(), 64);
1305 auto outputBitType =
1306 jlm::util::assertedCast<const jlm::rvsdg::BitType>(convertedTruncOp->result(0).get());
1307 EXPECT_EQ(outputBitType->nbits(), 32);
1308 foundTruncOp =
true;
1311 EXPECT_TRUE(foundTruncOp);
1316 TEST(JlmToMlirToJlmTests, TestFree)
1319 using namespace mlir::rvsdg;
1322 auto graph = &rvsdgModule->Rvsdg();
1329 graph->GetRootRegion(),
1331 auto iOStateArgument = lambda->GetFunctionArguments().at(0);
1332 auto memoryStateArgument = lambda->GetFunctionArguments().at(1);
1333 auto pointerArgument = lambda->GetFunctionArguments().at(2);
1338 lambda->finalize({});
1341 std::cout <<
"Convert to MLIR" << std::endl;
1346 std::cout <<
"Validate MLIR" << std::endl;
1347 auto & omegaRegion = omega.getRegion();
1348 auto & omegaBlock = omegaRegion.front();
1349 auto & mlirLambda = omegaBlock.front();
1350 auto & mlirLambdaRegion = mlirLambda.getRegion(0);
1351 auto & mlirLambdaBlock = mlirLambdaRegion.front();
1352 auto & mlirOp = mlirLambdaBlock.front();
1354 EXPECT_TRUE(mlir::isa<mlir::jlm::Free>(mlirOp));
1356 auto mlirFree = mlir::cast<mlir::jlm::Free>(mlirOp);
1357 EXPECT_EQ(mlirFree.getNumOperands(), 3);
1358 EXPECT_EQ(mlirFree.getNumResults(), 2);
1360 auto inputType1 = mlirFree.getOperand(0).getType();
1361 auto inputType2 = mlirFree.getOperand(1).getType();
1362 auto inputType3 = mlirFree.getOperand(2).getType();
1363 EXPECT_TRUE(mlir::isa<mlir::LLVM::LLVMPointerType>(inputType1));
1364 EXPECT_TRUE(mlir::isa<mlir::rvsdg::MemStateEdgeType>(inputType2));
1365 EXPECT_TRUE(mlir::isa<mlir::rvsdg::IOStateEdgeType>(inputType3));
1367 auto outputType1 = mlirFree.getResult(0).getType();
1368 auto outputType2 = mlirFree.getResult(1).getType();
1369 EXPECT_TRUE(mlir::isa<mlir::rvsdg::MemStateEdgeType>(outputType1));
1370 EXPECT_TRUE(mlir::isa<mlir::rvsdg::IOStateEdgeType>(outputType2));
1373 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1374 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1375 rootBlock->push_back(omega);
1377 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1382 EXPECT_EQ(region->numNodes(), 1);
1383 auto convertedLambda =
1384 jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(region->Nodes().begin().ptr());
1385 EXPECT_TRUE(is<jlm::rvsdg::LambdaOperation>(convertedLambda));
1387 EXPECT_EQ(convertedLambda->subregion()->numNodes(), 1);
1388 EXPECT_TRUE(is<FreeOperation>(convertedLambda->subregion()->Nodes().begin()->GetOperation()));
1390 &convertedLambda->subregion()->Nodes().begin()->GetOperation());
1392 EXPECT_EQ(convertedFree->narguments(), 3);
1393 EXPECT_EQ(convertedFree->nresults(), 2);
1395 EXPECT_TRUE(is<jlm::llvm::PointerType>(convertedFree->argument(0)));
1396 EXPECT_TRUE(is<jlm::llvm::MemoryStateType>(convertedFree->argument(1)));
1397 EXPECT_TRUE(is<jlm::llvm::IOStateType>(convertedFree->argument(2)));
1399 EXPECT_TRUE(is<jlm::llvm::MemoryStateType>(convertedFree->result(0)));
1400 EXPECT_TRUE(is<jlm::llvm::IOStateType>(convertedFree->result(1)));
1405 TEST(JlmToMlirToJlmTests, TestFunctionGraphImport)
1408 using namespace mlir::rvsdg;
1411 auto graph = &rvsdgModule->Rvsdg();
1426 std::cout <<
"Convert to MLIR" << std::endl;
1431 std::cout <<
"Validate MLIR" << std::endl;
1432 auto & omegaRegion = omega.getRegion();
1433 auto & omegaBlock = omegaRegion.front();
1434 auto & mlirOp = omegaBlock.front();
1436 EXPECT_TRUE(mlir::isa<mlir::rvsdg::OmegaArgument>(mlirOp));
1438 auto mlirOmegaArgument = mlir::cast<mlir::rvsdg::OmegaArgument>(mlirOp);
1440 auto valueType = mlirOmegaArgument.getValueType();
1441 auto importedValueType = mlirOmegaArgument.getImportedValue().getType();
1442 auto linkage = mlirOmegaArgument.getLinkage();
1443 auto name = mlirOmegaArgument.getName();
1445 auto mlirFunctionType = valueType.dyn_cast<mlir::FunctionType>();
1446 auto mlirImportedFunctionType = importedValueType.dyn_cast<mlir::FunctionType>();
1447 EXPECT_NE(mlirFunctionType,
nullptr);
1448 EXPECT_NE(mlirImportedFunctionType,
nullptr);
1449 EXPECT_EQ(mlirFunctionType, mlirImportedFunctionType);
1450 EXPECT_EQ(mlirFunctionType.getNumInputs(), 3);
1451 EXPECT_EQ(mlirFunctionType.getNumResults(), 2);
1452 EXPECT_TRUE(mlir::isa<mlir::rvsdg::IOStateEdgeType>(mlirFunctionType.getInput(0)));
1453 EXPECT_TRUE(mlir::isa<mlir::rvsdg::MemStateEdgeType>(mlirFunctionType.getInput(1)));
1454 EXPECT_TRUE(mlir::isa<mlir::LLVM::LLVMPointerType>(mlirFunctionType.getInput(2)));
1455 EXPECT_TRUE(mlir::isa<mlir::rvsdg::IOStateEdgeType>(mlirFunctionType.getResult(0)));
1456 EXPECT_TRUE(mlir::isa<mlir::rvsdg::MemStateEdgeType>(mlirFunctionType.getResult(1)));
1457 EXPECT_EQ(linkage,
"external_linkage");
1458 EXPECT_EQ(name,
"test");
1461 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1462 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1463 rootBlock->push_back(omega);
1465 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1470 EXPECT_EQ(region->numNodes(), 0);
1472 EXPECT_EQ(region->graph()->GetRootRegion().narguments(), 1);
1473 auto arg = region->graph()->GetRootRegion().argument(0);
1475 EXPECT_NE(imp,
nullptr);
1476 EXPECT_EQ(imp->Name(),
"test");
1478 EXPECT_EQ(*imp->ValueType(), *functionType);
1479 EXPECT_EQ(*imp->ImportedType(), *functionType);
1484 TEST(JlmToMlirToJlmTests, TestPointerGraphImport)
1487 using namespace mlir::rvsdg;
1490 auto graph = &rvsdgModule->Rvsdg();
1503 std::cout <<
"Convert to MLIR" << std::endl;
1508 std::cout <<
"Validate MLIR" << std::endl;
1509 auto & omegaRegion = omega.getRegion();
1510 auto & omegaBlock = omegaRegion.front();
1511 auto & mlirOp = omegaBlock.front();
1513 EXPECT_TRUE(mlir::isa<mlir::rvsdg::OmegaArgument>(mlirOp));
1515 auto mlirOmegaArgument = mlir::cast<mlir::rvsdg::OmegaArgument>(mlirOp);
1517 auto valueType = mlirOmegaArgument.getValueType();
1518 auto importedValueType = mlirOmegaArgument.getImportedValue().getType();
1519 auto linkage = mlirOmegaArgument.getLinkage();
1520 auto name = mlirOmegaArgument.getName();
1522 EXPECT_TRUE(mlir::isa<mlir::LLVM::LLVMPointerType>(importedValueType));
1524 auto mlirIntType = valueType.dyn_cast<mlir::IntegerType>();
1525 EXPECT_NE(mlirIntType,
nullptr);
1526 EXPECT_EQ(mlirIntType.getWidth(), 32);
1527 EXPECT_EQ(linkage,
"external_linkage");
1528 EXPECT_EQ(name,
"test");
1531 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1532 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1533 rootBlock->push_back(omega);
1535 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1540 EXPECT_EQ(region->numNodes(), 0);
1542 EXPECT_EQ(region->graph()->GetRootRegion().narguments(), 1);
1543 auto arg = region->graph()->GetRootRegion().argument(0);
1545 EXPECT_NE(imp,
nullptr);
1546 EXPECT_EQ(imp->Name(),
"test");
1555 TEST(JlmToMlirToJlmTests, TestIOBarrier)
1558 using namespace mlir::rvsdg;
1561 auto graph = &rvsdgModule->Rvsdg();
1568 graph->GetRootRegion(),
1570 auto ioStateArgument = lambda->GetFunctionArguments()[0];
1576 jlm::rvsdg::CreateOpNode<jlm::llvm::IOBarrierOperation>(
1577 { value, ioStateArgument },
1581 lambda->finalize({});
1584 std::cout <<
"Convert to MLIR" << std::endl;
1589 std::cout <<
"Validate MLIR" << std::endl;
1590 auto & omegaRegion = omega.getRegion();
1591 EXPECT_EQ(omegaRegion.getBlocks().size(), 1);
1592 auto & omegaBlock = omegaRegion.front();
1593 auto & mlirLambda = omegaBlock.front();
1594 auto & mlirLambdaRegion = mlirLambda.getRegion(0);
1595 auto & mlirLambdaBlock = mlirLambdaRegion.front();
1598 bool foundIOBarrier =
false;
1599 for (
auto & lambdaOp : mlirLambdaBlock.getOperations())
1601 if (
auto ioBarrier = mlir::dyn_cast<mlir::jlm::IOBarrier>(&lambdaOp))
1603 foundIOBarrier =
true;
1606 EXPECT_EQ(ioBarrier->getNumOperands(), 2);
1609 auto valueType = ioBarrier->getOperand(0).getType().dyn_cast<mlir::IntegerType>();
1610 EXPECT_NE(valueType,
nullptr);
1611 EXPECT_EQ(valueType.getWidth(), 32);
1612 EXPECT_TRUE(mlir::isa<mlir::rvsdg::IOStateEdgeType>(ioBarrier->getOperand(1).getType()));
1615 auto resultType = ioBarrier->getResult(0).getType().dyn_cast<mlir::IntegerType>();
1616 EXPECT_NE(resultType,
nullptr);
1617 EXPECT_EQ(resultType.getWidth(), 32);
1620 EXPECT_TRUE(foundIOBarrier);
1623 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1624 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1625 rootBlock->push_back(omega);
1627 auto region = &convertedRvsdgModule->Rvsdg().GetRootRegion();
1633 EXPECT_EQ(region->numNodes(), 1);
1634 auto & lambdaNode = *region->Nodes().begin();
1636 EXPECT_NE(lambdaOperation,
nullptr);
1639 bool foundIOBarrier =
false;
1640 for (
auto & lambdaNode : lambdaOperation->subregion()->Nodes())
1642 auto ioBarrierOp =
dynamic_cast<const IOBarrierOperation *
>(&lambdaNode.GetOperation());
1645 foundIOBarrier =
true;
1648 EXPECT_EQ(ioBarrierOp->nresults(), 1);
1649 EXPECT_EQ(ioBarrierOp->narguments(), 2);
1654 EXPECT_NE(valueType,
nullptr);
1655 EXPECT_EQ(valueType->nbits(), 32);
1658 auto ioStateType =
dynamic_cast<const IOStateType *
>(ioBarrierOp->argument(1).get());
1659 EXPECT_NE(ioStateType,
nullptr);
1662 auto outputType =
dynamic_cast<const jlm::rvsdg::BitType *
>(ioBarrierOp->result(0).get());
1663 EXPECT_NE(outputType,
nullptr);
1664 EXPECT_EQ(outputType->nbits(), 32);
1667 EXPECT_TRUE(foundIOBarrier);
1672 TEST(JlmToMlirToJlmTests, TestMalloc)
1675 using namespace mlir::rvsdg;
1678 auto graph = &rvsdgModule->Rvsdg();
1686 std::cout <<
"Convert to MLIR" << std::endl;
1691 std::cout <<
"Validate MLIR" << std::endl;
1692 auto & omegaRegion = omega.getRegion();
1693 auto & omegaBlock = omegaRegion.front();
1694 bool foundMallocOp =
false;
1695 for (
auto & op : omegaBlock.getOperations())
1697 auto mlirMallocOp = ::mlir::dyn_cast<::mlir::jlm::Malloc>(&op);
1700 auto inputBitType = mlirMallocOp.getOperand(0).getType().dyn_cast<mlir::IntegerType>();
1701 EXPECT_NE(inputBitType,
nullptr);
1702 EXPECT_EQ(inputBitType.getWidth(), 64);
1703 EXPECT_TRUE(mlir::isa<mlir::LLVM::LLVMPointerType>(mlirMallocOp.getResult(0).getType()));
1704 EXPECT_TRUE(mlir::isa<mlir::rvsdg::IOStateEdgeType>(mlirMallocOp.getResult(1).getType()));
1705 EXPECT_TRUE(mlir::isa<mlir::rvsdg::MemStateEdgeType>(mlirMallocOp.getResult(2).getType()));
1706 foundMallocOp =
true;
1709 EXPECT_TRUE(foundMallocOp);
1712 std::cout <<
"Converting MLIR to RVSDG" << std::endl;
1713 std::unique_ptr<mlir::Block> rootBlock = std::make_unique<mlir::Block>();
1714 rootBlock->push_back(omega);
1716 auto region = &rvsdgModule->Rvsdg().GetRootRegion();
1721 EXPECT_EQ(region->numNodes(), 3);
1722 bool foundMallocOp =
false;
1723 for (
auto & node : region->Nodes())
1725 auto convertedMallocOp =
dynamic_cast<const MallocOperation *
>(&node.GetOperation());
1726 if (convertedMallocOp)
1728 EXPECT_EQ(convertedMallocOp->nresults(), 3);
1729 EXPECT_EQ(convertedMallocOp->narguments(), 2);
1730 auto inputBitType = jlm::util::assertedCast<const jlm::rvsdg::BitType>(
1731 convertedMallocOp->argument(0).get());
1732 EXPECT_EQ(inputBitType->nbits(), 64);
1733 EXPECT_TRUE(jlm::rvsdg::is<jlm::llvm::PointerType>(convertedMallocOp->result(0)));
1734 EXPECT_TRUE(jlm::rvsdg::is<jlm::llvm::IOStateType>(convertedMallocOp->result(1)));
1735 EXPECT_TRUE(jlm::rvsdg::is<jlm::llvm::MemoryStateType>(convertedMallocOp->result(2)));
1736 foundMallocOp =
true;
1739 EXPECT_TRUE(foundMallocOp);
TEST(JlmToMlirToJlmTests, TestUndef)
static std::shared_ptr< const ArrayType > Create(std::shared_ptr< const Type > type, size_t nelements)
static jlm::rvsdg::Output * Create(rvsdg::Region ®ion, std::shared_ptr< const jlm::rvsdg::Type > type)
static jlm::rvsdg::Output * Create(const std::vector< jlm::rvsdg::Output * > &elements)
static std::unique_ptr< DeltaOperation > Create(std::shared_ptr< const rvsdg::Type > type, const std::string &name, const Linkage &linkage, std::string section, bool constant, const size_t alignment)
static std::shared_ptr< const FloatingPointType > Create(fpsize size)
static std::unique_ptr< llvm::ThreeAddressCode > Create(const Variable *pointer, const std::vector< const Variable * > &memoryStates, const Variable *iOState)
static rvsdg::Output * create(rvsdg::Output *baseAddress, const std::vector< rvsdg::Output * > &indices, std::shared_ptr< const rvsdg::Type > pointeeType)
static std::shared_ptr< const IOStateType > Create()
static LlvmGraphImport & createGlobalImport(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::Type > valueType, std::shared_ptr< const rvsdg::Type > importedType, std::string name, Linkage linkage, const bool isConstant, const size_t alignment)
static LlvmGraphImport & createFunctionImport(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::FunctionType > functionType, std::string name, Linkage linkage, CallingConvention callingConvention)
static std::unique_ptr< LlvmLambdaOperation > Create(std::shared_ptr< const jlm::rvsdg::FunctionType > type, std::string name, const jlm::llvm::Linkage &linkage, jlm::llvm::CallingConvention callingConvention, jlm::llvm::AttributeSet attributes)
static std::unique_ptr< LlvmRvsdgModule > Create(const util::FilePath &sourceFileName, const std::string &targetTriple, const std::string &dataLayout)
static std::unique_ptr< llvm::ThreeAddressCode > Create(const Variable *address, const Variable *state, std::shared_ptr< const rvsdg::Type > loadedType, size_t alignment)
static rvsdg::SimpleNode & createNode(rvsdg::Output &size, rvsdg::Output &ioState)
static std::shared_ptr< const MemoryStateType > Create()
static std::shared_ptr< const PointerType > Create()
static std::unique_ptr< llvm::ThreeAddressCode > create(const Variable *operand, const std::shared_ptr< const rvsdg::Type > &type)
static std::unique_ptr< llvm::ThreeAddressCode > Create(const Variable *address, const Variable *value, const Variable *state, size_t alignment)
UndefValueOperation class.
static jlm::rvsdg::Output * Create(rvsdg::Region ®ion, std::shared_ptr< const jlm::rvsdg::Type > type)
static rvsdg::Output * Create(rvsdg::Region ®ion, const std::vector< rvsdg::Output * > &operands)
::mlir::rvsdg::OmegaNode ConvertModule(const llvm::LlvmRvsdgModule &rvsdgModule)
static std::unique_ptr< llvm::LlvmRvsdgModule > CreateAndConvert(std::unique_ptr<::mlir::Block > &block)
static Output & create(Region ®ion, BitValueRepresentation value)
static std::shared_ptr< const BitType > Create(std::size_t nbits)
Creates bit type of specified width.
static DeltaNode * Create(rvsdg::Region *parent, std::unique_ptr< DeltaOperation > op)
static std::shared_ptr< const FunctionType > Create(std::vector< std::shared_ptr< const jlm::rvsdg::Type >> argumentTypes, std::vector< std::shared_ptr< const jlm::rvsdg::Type >> resultTypes)
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
Global memory state passed between functions.