26 #include <llvm/Support/raw_os_ostream.h>
28 #include <mlir/Dialect/Arith/IR/Arith.h>
29 #include <mlir/IR/Builders.h>
30 #include <mlir/IR/Verifier.h>
32 #include <unordered_map>
40 if (failed(::mlir::verify(omega)))
42 omega.emitError(
"module verification error");
43 throw util::Error(
"Verification of RVSDG-MLIR failed");
47 ::llvm::raw_os_ostream os(std::cout);
53 ::llvm::raw_fd_ostream os(filePath.
to_str(), ec);
58 ::mlir::rvsdg::OmegaNode
61 auto & graph = rvsdgModule.
Rvsdg();
63 auto omega =
Builder_->create<::mlir::rvsdg::OmegaNode>(
Builder_->getUnknownLoc());
64 auto & omegaBlock = omega.getRegion().emplaceBlock();
66 ::llvm::SmallVector<::mlir::Value> regionResults =
70 Builder_->create<::mlir::rvsdg::OmegaResult>(
Builder_->getUnknownLoc(), regionResults);
71 omegaBlock.push_back(omegaResult);
75 ::llvm::SmallVector<::mlir::Value>
78 std::unordered_map<rvsdg::Output *, ::mlir::Value> valueMap;
80 for (
size_t i = 0; i < region.
narguments(); ++i)
85 auto imp = util::assertedCast<llvm::LlvmGraphImport>(arg);
86 block.push_back(
Builder_->create<::mlir::rvsdg::OmegaArgument>(
91 Builder_->getStringAttr(imp->Name())));
92 valueMap[arg] = block.back().getResult(0);
97 valueMap[arg] = block.getArgument(argIndex);
108 auto convertedNode =
ConvertNode(*rvsdgNode, block, inputs);
109 for (
size_t i = 0; i < rvsdgNode->noutputs(); i++)
111 valueMap[rvsdgNode->output(i)] = convertedNode->getResult(i);
117 ::llvm::SmallVector<::mlir::Value> results;
118 for (
size_t i = 0; i < region.
nresults(); i++)
121 if (it != valueMap.end())
123 results.push_back(it->second);
128 "Unimplemented input type: ",
132 " for region result: ",
143 ::llvm::SmallVector<::mlir::Value>
146 const std::unordered_map<rvsdg::Output *, ::mlir::Value> & valueMap)
148 ::llvm::SmallVector<::mlir::Value> inputs;
149 for (
size_t i = 0; i < node.
ninputs(); i++)
152 if (it != valueMap.end())
154 inputs.push_back(it->second);
159 "Unimplemented input type: ",
176 ::mlir::Block & block,
177 const ::llvm::SmallVector<::mlir::Value> & inputs)
209 ::llvm::SmallVector<::mlir::Value> inputs)
214 return Builder_->create<::mlir::arith::AddFOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
216 return Builder_->create<::mlir::arith::SubFOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
218 return Builder_->create<::mlir::arith::MulFOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
220 return Builder_->create<::mlir::arith::DivFOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
222 return Builder_->create<::mlir::arith::RemFOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
231 ::llvm::SmallVector<::mlir::Value> inputs)
234 auto predicate = map.LookupValue(op.
cmp());
235 return Builder_->create<::mlir::arith::CmpFOp>(
237 Builder_->getAttr<::mlir::arith::CmpFPredicateAttr>(predicate),
245 ::llvm::SmallVector<::mlir::Value> inputs)
247 ::mlir::Operation * MlirOp =
nullptr;
248 if (jlm::rvsdg::is<const rvsdg::bitadd_op>(bitOp))
251 Builder_->create<::mlir::arith::AddIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
253 else if (jlm::rvsdg::is<const rvsdg::bitand_op>(bitOp))
256 Builder_->create<::mlir::arith::AndIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
258 else if (jlm::rvsdg::is<const rvsdg::bitashr_op>(bitOp))
261 Builder_->create<::mlir::arith::ShRUIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
263 else if (jlm::rvsdg::is<const rvsdg::bitmul_op>(bitOp))
266 Builder_->create<::mlir::arith::MulIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
268 else if (jlm::rvsdg::is<const rvsdg::bitor_op>(bitOp))
271 Builder_->create<::mlir::arith::OrIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
273 else if (jlm::rvsdg::is<const rvsdg::bitsdiv_op>(bitOp))
276 Builder_->create<::mlir::arith::DivSIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
278 else if (jlm::rvsdg::is<const rvsdg::bitshl_op>(bitOp))
281 Builder_->create<::mlir::arith::ShLIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
283 else if (jlm::rvsdg::is<const rvsdg::bitshr_op>(bitOp))
286 Builder_->create<::mlir::arith::ShRUIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
288 else if (jlm::rvsdg::is<const rvsdg::bitsmod_op>(bitOp))
291 Builder_->create<::mlir::arith::RemSIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
293 else if (jlm::rvsdg::is<const rvsdg::bitsmulh_op>(bitOp))
297 else if (jlm::rvsdg::is<const rvsdg::bitsub_op>(bitOp))
300 Builder_->create<::mlir::arith::SubIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
302 else if (jlm::rvsdg::is<const rvsdg::bitudiv_op>(bitOp))
305 Builder_->create<::mlir::arith::DivUIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
307 else if (jlm::rvsdg::is<const rvsdg::bitumod_op>(bitOp))
310 Builder_->create<::mlir::arith::RemUIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
312 else if (jlm::rvsdg::is<const rvsdg::bitumulh_op>(bitOp))
316 else if (jlm::rvsdg::is<const rvsdg::bitxor_op>(bitOp))
319 Builder_->create<::mlir::arith::XOrIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
332 ::llvm::SmallVector<::mlir::Value> inputs)
334 auto compPredicate = ::mlir::arith::CmpIPredicate::eq;
335 if (jlm::rvsdg::is<const rvsdg::biteq_op>(bitOp))
336 compPredicate = ::mlir::arith::CmpIPredicate::eq;
337 else if (jlm::rvsdg::is<const rvsdg::bitne_op>(bitOp))
338 compPredicate = ::mlir::arith::CmpIPredicate::ne;
339 else if (jlm::rvsdg::is<const rvsdg::bitsge_op>(bitOp))
340 compPredicate = ::mlir::arith::CmpIPredicate::sge;
341 else if (jlm::rvsdg::is<const rvsdg::bitsgt_op>(bitOp))
342 compPredicate = ::mlir::arith::CmpIPredicate::sgt;
343 else if (jlm::rvsdg::is<const rvsdg::bitsle_op>(bitOp))
344 compPredicate = ::mlir::arith::CmpIPredicate::sle;
345 else if (jlm::rvsdg::is<const rvsdg::bitslt_op>(bitOp))
346 compPredicate = ::mlir::arith::CmpIPredicate::slt;
347 else if (jlm::rvsdg::is<const rvsdg::bituge_op>(bitOp))
348 compPredicate = ::mlir::arith::CmpIPredicate::uge;
349 else if (jlm::rvsdg::is<const rvsdg::bitugt_op>(bitOp))
350 compPredicate = ::mlir::arith::CmpIPredicate::ugt;
351 else if (jlm::rvsdg::is<const rvsdg::bitule_op>(bitOp))
352 compPredicate = ::mlir::arith::CmpIPredicate::ule;
353 else if (jlm::rvsdg::is<const rvsdg::bitult_op>(bitOp))
354 compPredicate = ::mlir::arith::CmpIPredicate::ult;
361 auto MlirOp =
Builder_->create<::mlir::arith::CmpIOp>(
372 ::llvm::SmallVector<::mlir::Value> inputs)
374 static std::unordered_map<llvm::ICmpPredicate, ::mlir::LLVM::ICmpPredicate> map = {
387 const auto mlirPredicate = map.at(operation.
predicate());
388 auto MlirOp =
Builder_->create<::mlir::LLVM::ICmpOp>(
403 static ::mlir::ArrayAttr
405 ::mlir::MLIRContext * context,
406 const std::vector<llvm::MemoryNodeId> & memoryNodeIndices)
408 auto int64Type = ::mlir::IntegerType::get(context, 64);
409 ::llvm::SmallVector<::mlir::Attribute> intAttributes;
410 for (
auto memoryNodeId : memoryNodeIndices)
412 intAttributes.push_back(::mlir::IntegerAttr::get(int64Type, memoryNodeId));
414 return ::mlir::ArrayAttr::get(context, intAttributes);
420 ::mlir::Block & block,
421 const ::llvm::SmallVector<::mlir::Value> & inputs)
423 ::mlir::Operation * MlirOp =
nullptr;
427 auto value = bitOp->value();
428 MlirOp =
Builder_->create<::mlir::arith::ConstantIntOp>(
436 auto isNegative = integerConstOp->Representation().is_negative();
437 auto value = isNegative ? integerConstOp->Representation().to_int()
438 : integerConstOp->Representation().to_uint();
439 MlirOp =
Builder_->create<::mlir::arith::ConstantIntOp>(
442 integerConstOp->Representation().nbits());
448 else if (rvsdg::is<jlm::llvm::FMulAddIntrinsicOperation>(operation))
450 MlirOp =
Builder_->create<::mlir::LLVM::FMulAddOp>(
456 else if (rvsdg::is<jlm::llvm::IntegerBinaryOperation>(operation))
465 auto value = fpOp->constant();
467 Builder_->create<::mlir::arith::ConstantFloatOp>(
Builder_->getUnknownLoc(), value, size);
472 MlirOp =
Builder_->create<::mlir::LLVM::ZeroOp>(
Builder_->getUnknownLoc(), type);
477 MlirOp =
Builder_->create<::mlir::jlm::ConstantDataArray>(
485 MlirOp =
Builder_->create<::mlir::LLVM::ZeroOp>(
Builder_->getUnknownLoc(), type);
488 auto constantPointerNullOp =
492 auto type =
ConvertType(*constantPointerNullOp->result(0));
493 MlirOp =
Builder_->create<::mlir::LLVM::ZeroOp>(
Builder_->getUnknownLoc(), type);
495 else if (jlm::rvsdg::is<const rvsdg::BitBinaryOperation>(operation))
503 else if (rvsdg::is<const jlm::llvm::FNegOperation>(operation))
505 MlirOp =
Builder_->create<::mlir::arith::NegFOp>(
Builder_->getUnknownLoc(), inputs[0]);
509 MlirOp =
Builder_->create<::mlir::arith::ExtFOp>(
515 else if (jlm::rvsdg::is<const rvsdg::BitCompareOperation>(operation))
529 MlirOp =
Builder_->create<::mlir::arith::ExtUIOp>(
531 Builder_->getIntegerType(zextOperation->ndstbits()),
536 MlirOp =
Builder_->create<::mlir::arith::ExtSIOp>(
538 Builder_->getIntegerType(sextOp->ndstbits()),
543 MlirOp =
Builder_->create<::mlir::arith::SIToFPOp>(
550 MlirOp =
Builder_->create<::mlir::arith::TruncIOp>(
558 MlirOp =
Builder_->create<::mlir::rvsdg::ConstantCtrl>(
561 ctlOp->value().alternative());
565 MlirOp =
Builder_->create<::mlir::jlm::CreateVarArgList>(
572 MlirOp =
Builder_->create<::mlir::jlm::Undef>(
578 auto nMemstates = freeOp->narguments() - 2;
580 std::vector<::mlir::Type> memoryStates(
582 Builder_->getType<::mlir::rvsdg::MemStateEdgeType>());
583 MlirOp =
Builder_->create<::mlir::jlm::Free>(
585 ::mlir::TypeRange(::llvm::ArrayRef(memoryStates)),
586 Builder_->getType<::mlir::rvsdg::IOStateEdgeType>(),
588 ::mlir::ValueRange({ std::next(inputs.begin()), std::prev(inputs.end()) }),
589 inputs[inputs.size() - 1]);
593 MlirOp =
Builder_->create<::mlir::jlm::Alloca>(
599 alloca_op->alignment(),
600 ::mlir::ValueRange({ std::next(inputs.begin()), inputs.end() }));
604 MlirOp =
Builder_->create<::mlir::jlm::Malloc>(
616 ::llvm::SmallVector<::mlir::Type> memStateTypes;
617 for (
size_t i = 1; i < load_op->nresults(); i++)
619 memStateTypes.push_back(
ConvertType(*load_op->result(i)));
621 MlirOp =
Builder_->create<::mlir::jlm::Load>(
626 Builder_->getUI32IntegerAttr(load_op->GetAlignment()),
627 ::mlir::ValueRange({ std::next(inputs.begin()), inputs.end() })
632 MlirOp =
Builder_->create<::mlir::jlm::Store>(
637 Builder_->getUI32IntegerAttr(store_op->GetAlignment()),
638 ::mlir::ValueRange({ std::next(std::next(inputs.begin())), inputs.end() })
641 else if (rvsdg::is<jlm::llvm::MemoryStateMergeOperation>(operation))
643 MlirOp =
Builder_->create<::mlir::rvsdg::MemStateMerge>(
648 else if (rvsdg::is<jlm::llvm::IOBarrierOperation>(operation))
650 MlirOp =
Builder_->create<::mlir::jlm::IOBarrier>(
658 MlirOp =
Builder_->create<::mlir::LLVM::GEPOp>(
663 ::mlir::ValueRange({ std::next(inputs.begin()), inputs.end() }));
667 assert(selectOp->nresults() == 1);
668 assert(inputs.size() == 3);
669 MlirOp =
Builder_->create<::mlir::arith::SelectOp>(
682 ::llvm::SmallVector<::mlir::Attribute> mappingVector;
683 for (
auto mapping : *matchOp)
685 ::mlir::rvsdg::MatchRuleAttr matchRule = ::mlir::rvsdg::MatchRuleAttr::get(
687 ::llvm::ArrayRef(
static_cast<int64_t
>(mapping.first)),
690 mappingVector.push_back(matchRule);
693 mappingVector.push_back(::mlir::rvsdg::MatchRuleAttr::get(
695 ::llvm::ArrayRef<int64_t>(),
696 matchOp->default_alternative()));
699 MlirOp =
Builder_->create<::mlir::rvsdg::Match>(
703 ::mlir::ArrayAttr::get(
Builder_->getContext(), ::llvm::ArrayRef(mappingVector)));
707 auto functionType = *callOp->GetFunctionType();
708 ::llvm::SmallVector<::mlir::Type> argumentTypes;
709 for (
size_t i = 0; i < functionType.NumArguments(); i++)
711 argumentTypes.push_back(
ConvertType(functionType.ArgumentType(i)));
713 ::llvm::SmallVector<::mlir::Type> resultTypes;
714 for (
size_t i = 0; i < functionType.NumResults(); i++)
716 resultTypes.push_back(
ConvertType(functionType.ResultType(i)));
718 MlirOp =
Builder_->create<::mlir::jlm::Call>(
723 { std::next(inputs.begin()), std::prev(std::prev(inputs.end())) }),
724 inputs[inputs.size() - 2],
725 inputs[inputs.size() - 1]
729 auto lambdaStateSplit =
732 auto memoryNodeIndicesAttr =
735 ::llvm::SmallVector<::mlir::Type> resultTypes;
736 for (
size_t i = 0; i < lambdaStateSplit->nresults(); i++)
738 resultTypes.push_back(
ConvertType(*lambdaStateSplit->result(i).get()));
740 MlirOp =
Builder_->create<::mlir::rvsdg::LambdaEntryMemoryStateSplit>(
742 ::llvm::ArrayRef(resultTypes),
744 memoryNodeIndicesAttr);
747 auto lambdaStateMerge =
750 auto memoryNodeIndicesAttr =
753 ::llvm::SmallVector<::mlir::Type> resultTypes;
754 for (
size_t i = 0; i < lambdaStateMerge->nresults(); i++)
756 resultTypes.push_back(
ConvertType(*lambdaStateMerge->result(i).get()));
758 MlirOp =
Builder_->create<::mlir::rvsdg::LambdaExitMemoryStateMerge>(
760 ::llvm::ArrayRef(resultTypes),
761 ::mlir::ValueRange(inputs),
762 memoryNodeIndicesAttr);
765 auto callStateSplit =
768 auto memoryNodeIndicesAttr =
771 ::llvm::SmallVector<::mlir::Type> resultTypes;
772 for (
size_t i = 0; i < callStateSplit->nresults(); i++)
774 resultTypes.push_back(
ConvertType(*callStateSplit->result(i).get()));
776 MlirOp =
Builder_->create<::mlir::rvsdg::CallExitMemoryStateSplit>(
778 ::llvm::ArrayRef(resultTypes),
780 memoryNodeIndicesAttr);
783 auto callStateMerge =
786 auto memoryNodeIndicesAttr =
789 ::llvm::SmallVector<::mlir::Type> resultTypes;
790 for (
size_t i = 0; i < callStateMerge->nresults(); i++)
792 resultTypes.push_back(
ConvertType(*callStateMerge->result(i).get()));
794 MlirOp =
Builder_->create<::mlir::rvsdg::CallEntryMemoryStateMerge>(
796 ::llvm::ArrayRef(resultTypes),
797 ::mlir::ValueRange(inputs),
798 memoryNodeIndicesAttr);
802 ::mlir::Type resultType =
ConvertType(*memoryStateJoin->result(0));
804 MlirOp =
Builder_->create<::mlir::rvsdg::MemoryStateJoin>(
807 ::mlir::ValueRange(inputs));
812 auto message =
util::strfmt(
"Unimplemented simple node: ", operation.debug_string());
816 block.push_back(MlirOp);
820 ::llvm::SmallVector<::mlir::Type>
823 ::llvm::SmallVector<::mlir::Type> typeRange;
824 for (
size_t i = 0; i < nresults; ++i)
826 typeRange.push_back(
Builder_->getType<::mlir::rvsdg::MemStateEdgeType>());
834 ::mlir::Block & block,
835 const ::llvm::SmallVector<::mlir::Value> & inputs)
838 ::llvm::SmallVector<::mlir::NamedAttribute> attributes;
839 auto symbolName =
Builder_->getNamedAttr(
840 Builder_->getStringAttr(
"sym_name"),
843 attributes.push_back(symbolName);
844 auto linkage =
Builder_->getNamedAttr(
848 attributes.push_back(linkage);
850 auto lambda =
Builder_->create<::mlir::rvsdg::LambdaNode>(
854 ::llvm::ArrayRef<::mlir::NamedAttribute>(attributes));
855 block.push_back(lambda);
857 auto & lambdaBlock = lambda.getRegion().emplaceBlock();
860 Builder_->create<::mlir::rvsdg::LambdaResult>(
Builder_->getUnknownLoc(), regionResults);
861 lambdaBlock.push_back(lambdaResult);
869 ::mlir::Block & block,
870 const ::llvm::SmallVector<::mlir::Value> & inputs)
872 auto & gammaOp = *util::assertedCast<const rvsdg::GammaOperation>(&gammaNode.
GetOperation());
874 ::llvm::SmallVector<::mlir::Type> typeRangeOuput;
875 for (
size_t i = 0; i < gammaNode.
noutputs(); ++i)
882 ::mlir::Value predicate = inputs[0];
884 auto gamma =
Builder_->create<::mlir::rvsdg::GammaNode>(
886 ::mlir::TypeRange(::llvm::ArrayRef(typeRangeOuput)),
888 ::mlir::ValueRange({ std::next(inputs.begin()), inputs.end() }),
889 gammaOp.nalternatives()
891 block.push_back(gamma);
893 for (
size_t i = 0; i < gammaOp.nalternatives(); ++i)
895 auto & gammaBlock = gamma.getRegion(i).emplaceBlock();
898 Builder_->create<::mlir::rvsdg::GammaResult>(
Builder_->getUnknownLoc(), regionResults);
899 gammaBlock.push_back(gammaResult);
908 ::mlir::Block & block,
909 const ::llvm::SmallVector<::mlir::Value> & inputs)
911 ::llvm::SmallVector<::mlir::Type> outputTypeRange;
912 for (
size_t i = 0; i < thetaNode.
noutputs(); ++i)
917 ::llvm::SmallVector<::mlir::NamedAttribute> attributes;
919 auto theta =
Builder_->create<::mlir::rvsdg::ThetaNode>(
921 ::mlir::TypeRange(::llvm::ArrayRef(outputTypeRange)),
922 ::mlir::ValueRange(::llvm::ArrayRef(inputs)),
925 block.push_back(theta);
926 auto & thetaBlock = theta.getRegion().emplaceBlock();
928 auto results = ::mlir::ValueRange({ std::next(regionResults.begin()), regionResults.end() });
929 auto thetaResult =
Builder_->create<::mlir::rvsdg::ThetaResult>(
933 thetaBlock.push_back(thetaResult);
940 ::mlir::Block & block,
941 const ::llvm::SmallVector<::mlir::Value> & inputs)
943 auto op = util::assertedCast<const llvm::DeltaOperation>(&deltaNode.
GetOperation());
944 auto delta =
Builder_->create<::mlir::rvsdg::DeltaNode>(
946 Builder_->getType<::mlir::LLVM::LLVMPointerType>(),
948 ::llvm::StringRef(op->name()),
950 ::llvm::StringRef(op->Section()),
952 block.push_back(delta);
953 auto & deltaBlock = delta.getRegion().emplaceBlock();
957 Builder_->create<::mlir::rvsdg::DeltaResult>(
Builder_->getUnknownLoc(), regionResults[0]);
958 deltaBlock.push_back(deltaResult);
979 "Floating point type conversion not implemented: ",
988 ::llvm::SmallVector<::mlir::Type> argumentTypes;
989 for (
size_t i = 0; i < functionType.
NumArguments(); i++)
993 ::llvm::SmallVector<::mlir::Type> resultTypes;
994 for (
size_t i = 0; i < functionType.
NumResults(); i++)
998 return Builder_->getFunctionType(argumentTypes, resultTypes);
1006 return Builder_->getIntegerType(bt->nbits());
1012 else if (rvsdg::is<llvm::IOStateType>(type))
1014 return Builder_->getType<::mlir::rvsdg::IOStateEdgeType>();
1016 else if (rvsdg::is<llvm::MemoryStateType>(type))
1018 return Builder_->getType<::mlir::rvsdg::MemStateEdgeType>();
1022 return Builder_->getType<::mlir::rvsdg::RVSDG_CTRLType>(clt->nalternatives());
1024 else if (rvsdg::is<llvm::PointerType>(type))
1026 return Builder_->getType<::mlir::LLVM::LLVMPointerType>();
1028 else if (
auto arrayType =
dynamic_cast<const llvm::ArrayType *
>(&type))
1030 return Builder_->getType<::mlir::LLVM::LLVMArrayType>(
1032 arrayType->nelements());
1038 else if (rvsdg::is<const llvm::VariableArgumentType>(type))
1040 return Builder_->getType<::mlir::jlm::VarargListType>();
1042 else if (rvsdg::is<const rvsdg::UnitType>(type))
1044 return Builder_->getType<::mlir::NoneType>();
1048 std::vector<::mlir::Type> elements;
1049 for (
size_t i = 0; i < structType->numElements(); i++)
1051 elements.push_back(
ConvertType(*structType->getElementType(i)));
1054 if (structType->IsLiteral())
1056 return ::mlir::LLVM::LLVMStructType::getLiteral(
1059 structType->IsPacked());
1063 auto mlirStructType = ::mlir::LLVM::LLVMStructType::getIdentified(
1065 structType->GetName());
1066 if (mlirStructType.isInitialized())
1067 return mlirStructType;
1068 if (mlirStructType.setBody(elements, structType->IsPacked()).failed())
1070 throw util::Error(
"Not able to set the body of struct in the MLIR backend.");
1072 return mlirStructType;
1085 ::llvm::SmallVector<::mlir::Value> inputs)
1087 if (rvsdg::is<jlm::llvm::IntegerAddOperation>(operation))
1089 return Builder_->create<::mlir::arith::AddIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1091 else if (rvsdg::is<jlm::llvm::IntegerSubOperation>(operation))
1093 return Builder_->create<::mlir::arith::SubIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1095 else if (rvsdg::is<jlm::llvm::IntegerMulOperation>(operation))
1097 return Builder_->create<::mlir::arith::MulIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1099 else if (rvsdg::is<jlm::llvm::IntegerSDivOperation>(operation))
1101 return Builder_->create<::mlir::arith::DivSIOp>(
1106 else if (rvsdg::is<jlm::llvm::IntegerUDivOperation>(operation))
1108 return Builder_->create<::mlir::arith::DivUIOp>(
1113 else if (rvsdg::is<jlm::llvm::IntegerSRemOperation>(operation))
1115 return Builder_->create<::mlir::arith::RemSIOp>(
1120 else if (rvsdg::is<jlm::llvm::IntegerURemOperation>(operation))
1122 return Builder_->create<::mlir::arith::RemUIOp>(
1127 else if (rvsdg::is<jlm::llvm::IntegerAShrOperation>(operation))
1129 return Builder_->create<::mlir::LLVM::AShrOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1131 else if (rvsdg::is<jlm::llvm::IntegerShlOperation>(operation))
1133 return Builder_->create<::mlir::LLVM::ShlOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1135 else if (rvsdg::is<jlm::llvm::IntegerLShrOperation>(operation))
1137 return Builder_->create<::mlir::LLVM::LShrOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1139 else if (rvsdg::is<jlm::llvm::IntegerAndOperation>(operation))
1141 return Builder_->create<::mlir::arith::AndIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1143 else if (rvsdg::is<jlm::llvm::IntegerOrOperation>(operation))
1145 return Builder_->create<::mlir::arith::OrIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1147 else if (rvsdg::is<jlm::llvm::IntegerXorOperation>(operation))
1149 return Builder_->create<::mlir::arith::XOrIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1151 else if (rvsdg::is<jlm::llvm::IntegerEqOperation>(operation))
1153 return Builder_->create<::mlir::arith::CmpIOp>(
1155 ::mlir::arith::CmpIPredicate::eq,
1159 else if (rvsdg::is<jlm::llvm::IntegerNeOperation>(operation))
1161 return Builder_->create<::mlir::arith::CmpIOp>(
1163 ::mlir::arith::CmpIPredicate::ne,
1167 else if (rvsdg::is<jlm::llvm::IntegerSgeOperation>(operation))
1169 return Builder_->create<::mlir::arith::CmpIOp>(
1171 ::mlir::arith::CmpIPredicate::sge,
1175 else if (rvsdg::is<jlm::llvm::IntegerSgtOperation>(operation))
1177 return Builder_->create<::mlir::arith::CmpIOp>(
1179 ::mlir::arith::CmpIPredicate::sgt,
1183 else if (rvsdg::is<jlm::llvm::IntegerSleOperation>(operation))
1185 return Builder_->create<::mlir::arith::CmpIOp>(
1187 ::mlir::arith::CmpIPredicate::sle,
1191 else if (rvsdg::is<jlm::llvm::IntegerSltOperation>(operation))
1193 return Builder_->create<::mlir::arith::CmpIOp>(
1195 ::mlir::arith::CmpIPredicate::slt,
1199 else if (rvsdg::is<jlm::llvm::IntegerUgeOperation>(operation))
1201 return Builder_->create<::mlir::arith::CmpIOp>(
1203 ::mlir::arith::CmpIPredicate::uge,
1207 else if (rvsdg::is<jlm::llvm::IntegerUgtOperation>(operation))
1209 return Builder_->create<::mlir::arith::CmpIOp>(
1211 ::mlir::arith::CmpIPredicate::ugt,
1215 else if (rvsdg::is<jlm::llvm::IntegerUleOperation>(operation))
1217 return Builder_->create<::mlir::arith::CmpIOp>(
1219 ::mlir::arith::CmpIPredicate::ule,
1223 else if (rvsdg::is<jlm::llvm::IntegerUltOperation>(operation))
1225 return Builder_->create<::mlir::arith::CmpIOp>(
1227 ::mlir::arith::CmpIPredicate::ult,
ConstantPointerNullOperation class.
const llvm::fpop & fpop() const noexcept
const fpcmp & cmp() const noexcept
const jlm::llvm::Linkage & linkage() const noexcept
const std::string & name() const noexcept
ICmpPredicate predicate() const noexcept
UndefValueOperation class.
::mlir::Operation * ConvertDelta(const rvsdg::DeltaNode &node, ::mlir::Block &block, const ::llvm::SmallVector<::mlir::Value > &inputs)
::llvm::SmallVector<::mlir::Value > ConvertRegion(rvsdg::Region ®ion, ::mlir::Block &block, bool isRoot=false)
::mlir::FloatType ConvertFPType(const llvm::fpsize size)
::mlir::FunctionType ConvertFunctionType(const jlm::rvsdg::FunctionType &functionType)
::mlir::Operation * ConvertTheta(const rvsdg::ThetaNode &thetaNode, ::mlir::Block &block, const ::llvm::SmallVector<::mlir::Value > &inputs)
::mlir::Type ConvertType(const rvsdg::Type &type)
::mlir::Operation * ConvertNode(const rvsdg::Node &node, ::mlir::Block &block, const ::llvm::SmallVector<::mlir::Value > &inputs)
::mlir::Operation * BitCompareNode(const rvsdg::SimpleOperation &bitOp, ::llvm::SmallVector<::mlir::Value > inputs)
::llvm::SmallVector<::mlir::Type > GetMemStateRange(size_t nresults)
::mlir::Operation * ConvertPointerCompareNode(const llvm::PtrCmpOperation &pointerCompareOp, ::llvm::SmallVector<::mlir::Value > inputs)
::mlir::Operation * ConvertGamma(const rvsdg::GammaNode &gammaNode, ::mlir::Block &block, const ::llvm::SmallVector<::mlir::Value > &inputs)
static void Print(::mlir::rvsdg::OmegaNode &omega, const util::FilePath &filePath)
static ::llvm::SmallVector<::mlir::Value > GetConvertedInputs(const rvsdg::Node &node, const std::unordered_map< rvsdg::Output *, ::mlir::Value > &valueMap)
::mlir::Operation * ConvertFpBinaryNode(const jlm::llvm::FBinaryOperation &op, ::llvm::SmallVector<::mlir::Value > inputs)
::mlir::Operation * ConvertLambda(const rvsdg::LambdaNode &node, ::mlir::Block &block, const ::llvm::SmallVector<::mlir::Value > &inputs)
::mlir::Operation * ConvertIntegerBinaryOperation(const jlm::llvm::IntegerBinaryOperation &operation, ::llvm::SmallVector<::mlir::Value > inputs)
::mlir::Operation * ConvertBitBinaryNode(const rvsdg::SimpleOperation &bitOp, ::llvm::SmallVector<::mlir::Value > inputs)
::mlir::Operation * ConvertSimpleNode(const rvsdg::SimpleNode &node, ::mlir::Block &block, const ::llvm::SmallVector<::mlir::Value > &inputs)
::mlir::rvsdg::OmegaNode ConvertModule(const llvm::LlvmRvsdgModule &rvsdgModule)
std::unique_ptr<::mlir::OpBuilder > Builder_
::mlir::Operation * ConvertFpCompareNode(const jlm::llvm::FCmpOperation &op, ::llvm::SmallVector<::mlir::Value > inputs)
rvsdg::Region * subregion() const noexcept
const DeltaOperation & GetOperation() const noexcept override
size_t NumArguments() const noexcept
size_t NumResults() const noexcept
const jlm::rvsdg::Type & ArgumentType(size_t index) const noexcept
const jlm::rvsdg::Type & ResultType(size_t index) const noexcept
Conditional operator / pattern matching.
const GammaOperation & GetOperation() const noexcept override
rvsdg::Region * subregion() const noexcept
rvsdg::Output * output() const noexcept
LambdaOperation & GetOperation() const noexcept override
virtual std::string DebugString() const =0
NodeInput * input(size_t index) const noexcept
size_t ninputs() const noexcept
size_t noutputs() const noexcept
virtual std::string debug_string() const =0
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
virtual std::string debug_string() const
std::string debug_string() const override
Represent acyclic RVSDG subgraphs.
RegionResult * result(size_t index) const noexcept
size_t nresults() const noexcept
RegionArgument * argument(size_t index) const noexcept
size_t narguments() const noexcept
const SimpleOperation & GetOperation() const noexcept override
NodeOutput * output(size_t index) const noexcept
StructuralOutput * output(size_t index) const noexcept
rvsdg::Region * subregion(size_t index) const noexcept
rvsdg::Region * subregion() const noexcept
virtual std::string debug_string() const =0
const std::string & to_str() const noexcept
#define JLM_UNREACHABLE(msg)
std::string_view linkageToString(const Linkage linkage)
const util::BijectiveMap<::mlir::arith::CmpFPredicate, llvm::fpcmp > & GetFpCmpPredicateMap()
::mlir::ArrayAttr memoryNodeIndicesToArrayAttr(::mlir::MLIRContext *context, const std::vector< llvm::MemoryNodeId > &memoryNodeIndices)
static std::string strfmt(Args... args)