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>
38 if (failed(::mlir::verify(omega)))
40 omega.emitError(
"module verification error");
41 throw util::Error(
"Verification of RVSDG-MLIR failed");
45 ::llvm::raw_os_ostream os(std::cout);
51 ::llvm::raw_fd_ostream os(filePath.
to_str(), ec);
56 ::mlir::rvsdg::OmegaNode
59 auto & graph = rvsdgModule.
Rvsdg();
61 auto omega =
Builder_->create<::mlir::rvsdg::OmegaNode>(
Builder_->getUnknownLoc());
62 auto & omegaBlock = omega.getRegion().emplaceBlock();
64 ::llvm::SmallVector<::mlir::Value> regionResults =
68 Builder_->create<::mlir::rvsdg::OmegaResult>(
Builder_->getUnknownLoc(), regionResults);
69 omegaBlock.push_back(omegaResult);
73 ::llvm::SmallVector<::mlir::Value>
76 std::unordered_map<rvsdg::Output *, ::mlir::Value> valueMap;
78 for (
size_t i = 0; i < region.
narguments(); ++i)
83 auto imp = util::assertedCast<llvm::LlvmGraphImport>(arg);
84 block.push_back(
Builder_->create<::mlir::rvsdg::OmegaArgument>(
89 Builder_->getStringAttr(imp->Name())));
90 valueMap[arg] = block.back().getResult(0);
95 valueMap[arg] = block.getArgument(argIndex);
106 auto convertedNode =
ConvertNode(*rvsdgNode, block, inputs);
107 for (
size_t i = 0; i < rvsdgNode->noutputs(); i++)
109 valueMap[rvsdgNode->output(i)] = convertedNode->getResult(i);
115 ::llvm::SmallVector<::mlir::Value> results;
116 for (
size_t i = 0; i < region.
nresults(); i++)
119 if (it != valueMap.end())
121 results.push_back(it->second);
126 "Unimplemented input type: ",
130 " for region result: ",
141 ::llvm::SmallVector<::mlir::Value>
144 const std::unordered_map<rvsdg::Output *, ::mlir::Value> & valueMap)
146 ::llvm::SmallVector<::mlir::Value> inputs;
147 for (
size_t i = 0; i < node.
ninputs(); i++)
150 if (it != valueMap.end())
152 inputs.push_back(it->second);
157 "Unimplemented input type: ",
174 ::mlir::Block & block,
175 const ::llvm::SmallVector<::mlir::Value> & inputs)
207 ::llvm::SmallVector<::mlir::Value> inputs)
212 return Builder_->create<::mlir::arith::AddFOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
214 return Builder_->create<::mlir::arith::SubFOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
216 return Builder_->create<::mlir::arith::MulFOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
218 return Builder_->create<::mlir::arith::DivFOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
220 return Builder_->create<::mlir::arith::RemFOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
229 ::llvm::SmallVector<::mlir::Value> inputs)
232 auto predicate = map.LookupValue(op.
cmp());
233 return Builder_->create<::mlir::arith::CmpFOp>(
235 Builder_->getAttr<::mlir::arith::CmpFPredicateAttr>(predicate),
243 ::llvm::SmallVector<::mlir::Value> inputs)
245 ::mlir::Operation * MlirOp =
nullptr;
246 if (jlm::rvsdg::is<const rvsdg::bitadd_op>(bitOp))
249 Builder_->create<::mlir::arith::AddIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
251 else if (jlm::rvsdg::is<const rvsdg::bitand_op>(bitOp))
254 Builder_->create<::mlir::arith::AndIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
256 else if (jlm::rvsdg::is<const rvsdg::bitashr_op>(bitOp))
259 Builder_->create<::mlir::arith::ShRUIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
261 else if (jlm::rvsdg::is<const rvsdg::bitmul_op>(bitOp))
264 Builder_->create<::mlir::arith::MulIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
266 else if (jlm::rvsdg::is<const rvsdg::bitor_op>(bitOp))
269 Builder_->create<::mlir::arith::OrIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
271 else if (jlm::rvsdg::is<const rvsdg::bitsdiv_op>(bitOp))
274 Builder_->create<::mlir::arith::DivSIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
276 else if (jlm::rvsdg::is<const rvsdg::bitshl_op>(bitOp))
279 Builder_->create<::mlir::arith::ShLIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
281 else if (jlm::rvsdg::is<const rvsdg::bitshr_op>(bitOp))
284 Builder_->create<::mlir::arith::ShRUIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
286 else if (jlm::rvsdg::is<const rvsdg::bitsmod_op>(bitOp))
289 Builder_->create<::mlir::arith::RemSIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
291 else if (jlm::rvsdg::is<const rvsdg::bitsmulh_op>(bitOp))
295 else if (jlm::rvsdg::is<const rvsdg::bitsub_op>(bitOp))
298 Builder_->create<::mlir::arith::SubIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
300 else if (jlm::rvsdg::is<const rvsdg::bitudiv_op>(bitOp))
303 Builder_->create<::mlir::arith::DivUIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
305 else if (jlm::rvsdg::is<const rvsdg::bitumod_op>(bitOp))
308 Builder_->create<::mlir::arith::RemUIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
310 else if (jlm::rvsdg::is<const rvsdg::bitumulh_op>(bitOp))
314 else if (jlm::rvsdg::is<const rvsdg::bitxor_op>(bitOp))
317 Builder_->create<::mlir::arith::XOrIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
330 ::llvm::SmallVector<::mlir::Value> inputs)
332 auto compPredicate = ::mlir::arith::CmpIPredicate::eq;
333 if (jlm::rvsdg::is<const rvsdg::biteq_op>(bitOp))
334 compPredicate = ::mlir::arith::CmpIPredicate::eq;
335 else if (jlm::rvsdg::is<const rvsdg::bitne_op>(bitOp))
336 compPredicate = ::mlir::arith::CmpIPredicate::ne;
337 else if (jlm::rvsdg::is<const rvsdg::bitsge_op>(bitOp))
338 compPredicate = ::mlir::arith::CmpIPredicate::sge;
339 else if (jlm::rvsdg::is<const rvsdg::bitsgt_op>(bitOp))
340 compPredicate = ::mlir::arith::CmpIPredicate::sgt;
341 else if (jlm::rvsdg::is<const rvsdg::bitsle_op>(bitOp))
342 compPredicate = ::mlir::arith::CmpIPredicate::sle;
343 else if (jlm::rvsdg::is<const rvsdg::bitslt_op>(bitOp))
344 compPredicate = ::mlir::arith::CmpIPredicate::slt;
345 else if (jlm::rvsdg::is<const rvsdg::bituge_op>(bitOp))
346 compPredicate = ::mlir::arith::CmpIPredicate::uge;
347 else if (jlm::rvsdg::is<const rvsdg::bitugt_op>(bitOp))
348 compPredicate = ::mlir::arith::CmpIPredicate::ugt;
349 else if (jlm::rvsdg::is<const rvsdg::bitule_op>(bitOp))
350 compPredicate = ::mlir::arith::CmpIPredicate::ule;
351 else if (jlm::rvsdg::is<const rvsdg::bitult_op>(bitOp))
352 compPredicate = ::mlir::arith::CmpIPredicate::ult;
359 auto MlirOp =
Builder_->create<::mlir::arith::CmpIOp>(
370 ::llvm::SmallVector<::mlir::Value> inputs)
372 auto compPredicate = ::mlir::LLVM::ICmpPredicate::eq;
374 compPredicate = ::mlir::LLVM::ICmpPredicate::eq;
376 compPredicate = ::mlir::LLVM::ICmpPredicate::ne;
378 compPredicate = ::mlir::LLVM::ICmpPredicate::sgt;
380 compPredicate = ::mlir::LLVM::ICmpPredicate::sge;
382 compPredicate = ::mlir::LLVM::ICmpPredicate::slt;
384 compPredicate = ::mlir::LLVM::ICmpPredicate::sle;
391 auto MlirOp =
Builder_->create<::mlir::LLVM::ICmpOp>(
406 static ::mlir::ArrayAttr
408 ::mlir::MLIRContext * context,
409 const std::vector<llvm::MemoryNodeId> & memoryNodeIndices)
411 auto int64Type = ::mlir::IntegerType::get(context, 64);
412 ::llvm::SmallVector<::mlir::Attribute> intAttributes;
413 for (
auto memoryNodeId : memoryNodeIndices)
415 intAttributes.push_back(::mlir::IntegerAttr::get(int64Type, memoryNodeId));
417 return ::mlir::ArrayAttr::get(context, intAttributes);
423 ::mlir::Block & block,
424 const ::llvm::SmallVector<::mlir::Value> & inputs)
426 ::mlir::Operation * MlirOp =
nullptr;
430 auto value = bitOp->value();
431 MlirOp =
Builder_->create<::mlir::arith::ConstantIntOp>(
439 auto isNegative = integerConstOp->Representation().is_negative();
440 auto value = isNegative ? integerConstOp->Representation().to_int()
441 : integerConstOp->Representation().to_uint();
442 MlirOp =
Builder_->create<::mlir::arith::ConstantIntOp>(
445 integerConstOp->Representation().nbits());
451 else if (rvsdg::is<jlm::llvm::FMulAddIntrinsicOperation>(operation))
453 MlirOp =
Builder_->create<::mlir::LLVM::FMulAddOp>(
459 else if (rvsdg::is<jlm::llvm::IntegerBinaryOperation>(operation))
468 auto value = fpOp->constant();
470 Builder_->create<::mlir::arith::ConstantFloatOp>(
Builder_->getUnknownLoc(), value, size);
480 MlirOp =
Builder_->create<::mlir::jlm::ConstantDataArray>(
491 auto constantPointerNullOp =
498 else if (jlm::rvsdg::is<const rvsdg::BitBinaryOperation>(operation))
506 else if (rvsdg::is<const jlm::llvm::FNegOperation>(operation))
508 MlirOp =
Builder_->create<::mlir::arith::NegFOp>(
Builder_->getUnknownLoc(), inputs[0]);
512 MlirOp =
Builder_->create<::mlir::arith::ExtFOp>(
518 else if (jlm::rvsdg::is<const rvsdg::BitCompareOperation>(operation))
532 MlirOp =
Builder_->create<::mlir::arith::ExtUIOp>(
534 Builder_->getIntegerType(zextOperation->ndstbits()),
539 MlirOp =
Builder_->create<::mlir::arith::ExtSIOp>(
541 Builder_->getIntegerType(sextOp->ndstbits()),
546 MlirOp =
Builder_->create<::mlir::arith::SIToFPOp>(
553 MlirOp =
Builder_->create<::mlir::arith::TruncIOp>(
561 MlirOp =
Builder_->create<::mlir::rvsdg::ConstantCtrl>(
564 ctlOp->value().alternative());
568 MlirOp =
Builder_->create<::mlir::jlm::CreateVarArgList>(
575 MlirOp =
Builder_->create<::mlir::jlm::Undef>(
581 auto nMemstates = freeOp->narguments() - 2;
583 std::vector<::mlir::Type> memoryStates(
585 Builder_->getType<::mlir::rvsdg::MemStateEdgeType>());
586 MlirOp =
Builder_->create<::mlir::jlm::Free>(
588 ::mlir::TypeRange(::llvm::ArrayRef(memoryStates)),
589 Builder_->getType<::mlir::rvsdg::IOStateEdgeType>(),
591 ::mlir::ValueRange({ std::next(inputs.begin()), std::prev(inputs.end()) }),
592 inputs[inputs.size() - 1]);
596 MlirOp =
Builder_->create<::mlir::jlm::Alloca>(
602 alloca_op->alignment(),
603 ::mlir::ValueRange({ std::next(inputs.begin()), inputs.end() }));
607 MlirOp =
Builder_->create<::mlir::jlm::Malloc>(
619 ::llvm::SmallVector<::mlir::Type> memStateTypes;
620 for (
size_t i = 1; i < load_op->nresults(); i++)
622 memStateTypes.push_back(
ConvertType(*load_op->result(i)));
624 MlirOp =
Builder_->create<::mlir::jlm::Load>(
629 Builder_->getUI32IntegerAttr(load_op->GetAlignment()),
630 ::mlir::ValueRange({ std::next(inputs.begin()), inputs.end() })
635 MlirOp =
Builder_->create<::mlir::jlm::Store>(
640 Builder_->getUI32IntegerAttr(store_op->GetAlignment()),
641 ::mlir::ValueRange({ std::next(std::next(inputs.begin())), inputs.end() })
644 else if (rvsdg::is<jlm::llvm::MemoryStateMergeOperation>(operation))
646 MlirOp =
Builder_->create<::mlir::rvsdg::MemStateMerge>(
651 else if (rvsdg::is<jlm::llvm::IOBarrierOperation>(operation))
653 MlirOp =
Builder_->create<::mlir::jlm::IOBarrier>(
661 MlirOp =
Builder_->create<::mlir::LLVM::GEPOp>(
666 ::mlir::ValueRange({ std::next(inputs.begin()), inputs.end() }));
670 assert(selectOp->nresults() == 1);
671 assert(inputs.size() == 3);
672 MlirOp =
Builder_->create<::mlir::arith::SelectOp>(
685 ::llvm::SmallVector<::mlir::Attribute> mappingVector;
686 for (
auto mapping : *matchOp)
688 ::mlir::rvsdg::MatchRuleAttr matchRule = ::mlir::rvsdg::MatchRuleAttr::get(
690 ::llvm::ArrayRef(
static_cast<int64_t
>(mapping.first)),
693 mappingVector.push_back(matchRule);
696 mappingVector.push_back(::mlir::rvsdg::MatchRuleAttr::get(
698 ::llvm::ArrayRef<int64_t>(),
699 matchOp->default_alternative()));
702 MlirOp =
Builder_->create<::mlir::rvsdg::Match>(
706 ::mlir::ArrayAttr::get(
Builder_->getContext(), ::llvm::ArrayRef(mappingVector)));
710 auto functionType = *callOp->GetFunctionType();
711 ::llvm::SmallVector<::mlir::Type> argumentTypes;
712 for (
size_t i = 0; i < functionType.NumArguments(); i++)
714 argumentTypes.push_back(
ConvertType(functionType.ArgumentType(i)));
716 ::llvm::SmallVector<::mlir::Type> resultTypes;
717 for (
size_t i = 0; i < functionType.NumResults(); i++)
719 resultTypes.push_back(
ConvertType(functionType.ResultType(i)));
721 MlirOp =
Builder_->create<::mlir::jlm::Call>(
726 { std::next(inputs.begin()), std::prev(std::prev(inputs.end())) }),
727 inputs[inputs.size() - 2],
728 inputs[inputs.size() - 1]
732 auto lambdaStateSplit =
735 auto memoryNodeIndicesAttr =
738 ::llvm::SmallVector<::mlir::Type> resultTypes;
739 for (
size_t i = 0; i < lambdaStateSplit->nresults(); i++)
741 resultTypes.push_back(
ConvertType(*lambdaStateSplit->result(i).get()));
743 MlirOp =
Builder_->create<::mlir::rvsdg::LambdaEntryMemoryStateSplit>(
745 ::llvm::ArrayRef(resultTypes),
747 memoryNodeIndicesAttr);
750 auto lambdaStateMerge =
753 auto memoryNodeIndicesAttr =
756 ::llvm::SmallVector<::mlir::Type> resultTypes;
757 for (
size_t i = 0; i < lambdaStateMerge->nresults(); i++)
759 resultTypes.push_back(
ConvertType(*lambdaStateMerge->result(i).get()));
761 MlirOp =
Builder_->create<::mlir::rvsdg::LambdaExitMemoryStateMerge>(
763 ::llvm::ArrayRef(resultTypes),
764 ::mlir::ValueRange(inputs),
765 memoryNodeIndicesAttr);
768 auto callStateSplit =
771 auto memoryNodeIndicesAttr =
774 ::llvm::SmallVector<::mlir::Type> resultTypes;
775 for (
size_t i = 0; i < callStateSplit->nresults(); i++)
777 resultTypes.push_back(
ConvertType(*callStateSplit->result(i).get()));
779 MlirOp =
Builder_->create<::mlir::rvsdg::CallExitMemoryStateSplit>(
781 ::llvm::ArrayRef(resultTypes),
783 memoryNodeIndicesAttr);
786 auto callStateMerge =
789 auto memoryNodeIndicesAttr =
792 ::llvm::SmallVector<::mlir::Type> resultTypes;
793 for (
size_t i = 0; i < callStateMerge->nresults(); i++)
795 resultTypes.push_back(
ConvertType(*callStateMerge->result(i).get()));
797 MlirOp =
Builder_->create<::mlir::rvsdg::CallEntryMemoryStateMerge>(
799 ::llvm::ArrayRef(resultTypes),
800 ::mlir::ValueRange(inputs),
801 memoryNodeIndicesAttr);
805 ::mlir::Type resultType =
ConvertType(*memoryStateJoin->result(0));
807 MlirOp =
Builder_->create<::mlir::rvsdg::MemoryStateJoin>(
810 ::mlir::ValueRange(inputs));
815 auto message =
util::strfmt(
"Unimplemented simple node: ", operation.debug_string());
819 block.push_back(MlirOp);
823 ::llvm::SmallVector<::mlir::Type>
826 ::llvm::SmallVector<::mlir::Type> typeRange;
827 for (
size_t i = 0; i < nresults; ++i)
829 typeRange.push_back(
Builder_->getType<::mlir::rvsdg::MemStateEdgeType>());
837 ::mlir::Block & block,
838 const ::llvm::SmallVector<::mlir::Value> & inputs)
841 ::llvm::SmallVector<::mlir::NamedAttribute> attributes;
842 auto symbolName =
Builder_->getNamedAttr(
843 Builder_->getStringAttr(
"sym_name"),
846 attributes.push_back(symbolName);
847 auto linkage =
Builder_->getNamedAttr(
851 attributes.push_back(linkage);
853 auto lambda =
Builder_->create<::mlir::rvsdg::LambdaNode>(
857 ::llvm::ArrayRef<::mlir::NamedAttribute>(attributes));
858 block.push_back(lambda);
860 auto & lambdaBlock = lambda.getRegion().emplaceBlock();
863 Builder_->create<::mlir::rvsdg::LambdaResult>(
Builder_->getUnknownLoc(), regionResults);
864 lambdaBlock.push_back(lambdaResult);
872 ::mlir::Block & block,
873 const ::llvm::SmallVector<::mlir::Value> & inputs)
875 auto & gammaOp = *util::assertedCast<const rvsdg::GammaOperation>(&gammaNode.
GetOperation());
877 ::llvm::SmallVector<::mlir::Type> typeRangeOuput;
878 for (
size_t i = 0; i < gammaNode.
noutputs(); ++i)
885 ::mlir::Value predicate = inputs[0];
887 auto gamma =
Builder_->create<::mlir::rvsdg::GammaNode>(
889 ::mlir::TypeRange(::llvm::ArrayRef(typeRangeOuput)),
891 ::mlir::ValueRange({ std::next(inputs.begin()), inputs.end() }),
892 gammaOp.nalternatives()
894 block.push_back(gamma);
896 for (
size_t i = 0; i < gammaOp.nalternatives(); ++i)
898 auto & gammaBlock = gamma.getRegion(i).emplaceBlock();
901 Builder_->create<::mlir::rvsdg::GammaResult>(
Builder_->getUnknownLoc(), regionResults);
902 gammaBlock.push_back(gammaResult);
911 ::mlir::Block & block,
912 const ::llvm::SmallVector<::mlir::Value> & inputs)
914 ::llvm::SmallVector<::mlir::Type> outputTypeRange;
915 for (
size_t i = 0; i < thetaNode.
noutputs(); ++i)
920 ::llvm::SmallVector<::mlir::NamedAttribute> attributes;
922 auto theta =
Builder_->create<::mlir::rvsdg::ThetaNode>(
924 ::mlir::TypeRange(::llvm::ArrayRef(outputTypeRange)),
925 ::mlir::ValueRange(::llvm::ArrayRef(inputs)),
928 block.push_back(theta);
929 auto & thetaBlock = theta.getRegion().emplaceBlock();
931 auto results = ::mlir::ValueRange({ std::next(regionResults.begin()), regionResults.end() });
932 auto thetaResult =
Builder_->create<::mlir::rvsdg::ThetaResult>(
936 thetaBlock.push_back(thetaResult);
943 ::mlir::Block & block,
944 const ::llvm::SmallVector<::mlir::Value> & inputs)
946 auto op = util::assertedCast<const llvm::DeltaOperation>(&deltaNode.
GetOperation());
947 auto delta =
Builder_->create<::mlir::rvsdg::DeltaNode>(
949 Builder_->getType<::mlir::LLVM::LLVMPointerType>(),
951 ::llvm::StringRef(op->name()),
953 ::llvm::StringRef(op->Section()),
955 block.push_back(delta);
956 auto & deltaBlock = delta.getRegion().emplaceBlock();
960 Builder_->create<::mlir::rvsdg::DeltaResult>(
Builder_->getUnknownLoc(), regionResults[0]);
961 deltaBlock.push_back(deltaResult);
982 "Floating point type conversion not implemented: ",
991 ::llvm::SmallVector<::mlir::Type> argumentTypes;
992 for (
size_t i = 0; i < functionType.
NumArguments(); i++)
996 ::llvm::SmallVector<::mlir::Type> resultTypes;
997 for (
size_t i = 0; i < functionType.
NumResults(); i++)
1001 return Builder_->getFunctionType(argumentTypes, resultTypes);
1009 return Builder_->getIntegerType(bt->nbits());
1015 else if (rvsdg::is<llvm::IOStateType>(
type))
1017 return Builder_->getType<::mlir::rvsdg::IOStateEdgeType>();
1019 else if (rvsdg::is<llvm::MemoryStateType>(
type))
1021 return Builder_->getType<::mlir::rvsdg::MemStateEdgeType>();
1025 return Builder_->getType<::mlir::rvsdg::RVSDG_CTRLType>(clt->nalternatives());
1027 else if (rvsdg::is<llvm::PointerType>(
type))
1029 return Builder_->getType<::mlir::LLVM::LLVMPointerType>();
1033 return Builder_->getType<::mlir::LLVM::LLVMArrayType>(
1035 arrayType->nelements());
1041 else if (rvsdg::is<const llvm::VariableArgumentType>(
type))
1043 return Builder_->getType<::mlir::jlm::VarargListType>();
1045 else if (rvsdg::is<const rvsdg::UnitType>(
type))
1047 return Builder_->getType<::mlir::NoneType>();
1051 std::vector<::mlir::Type> elements;
1052 for (
size_t i = 0; i < structType->numElements(); i++)
1054 elements.push_back(
ConvertType(*structType->getElementType(i)));
1057 if (structType->IsLiteral())
1059 return ::mlir::LLVM::LLVMStructType::getLiteral(
1062 structType->IsPacked());
1066 auto mlirStructType = ::mlir::LLVM::LLVMStructType::getIdentified(
1068 structType->GetName());
1069 if (mlirStructType.isInitialized())
1070 return mlirStructType;
1071 if (mlirStructType.setBody(elements, structType->IsPacked()).failed())
1073 throw util::Error(
"Not able to set the body of struct in the MLIR backend.");
1075 return mlirStructType;
1080 auto message =
util::strfmt(
"Type conversion not implemented: ",
type.debug_string());
1088 ::llvm::SmallVector<::mlir::Value> inputs)
1090 if (rvsdg::is<jlm::llvm::IntegerAddOperation>(operation))
1092 return Builder_->create<::mlir::arith::AddIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1094 else if (rvsdg::is<jlm::llvm::IntegerSubOperation>(operation))
1096 return Builder_->create<::mlir::arith::SubIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1098 else if (rvsdg::is<jlm::llvm::IntegerMulOperation>(operation))
1100 return Builder_->create<::mlir::arith::MulIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1102 else if (rvsdg::is<jlm::llvm::IntegerSDivOperation>(operation))
1104 return Builder_->create<::mlir::arith::DivSIOp>(
1109 else if (rvsdg::is<jlm::llvm::IntegerUDivOperation>(operation))
1111 return Builder_->create<::mlir::arith::DivUIOp>(
1116 else if (rvsdg::is<jlm::llvm::IntegerSRemOperation>(operation))
1118 return Builder_->create<::mlir::arith::RemSIOp>(
1123 else if (rvsdg::is<jlm::llvm::IntegerURemOperation>(operation))
1125 return Builder_->create<::mlir::arith::RemUIOp>(
1130 else if (rvsdg::is<jlm::llvm::IntegerAShrOperation>(operation))
1132 return Builder_->create<::mlir::LLVM::AShrOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1134 else if (rvsdg::is<jlm::llvm::IntegerShlOperation>(operation))
1136 return Builder_->create<::mlir::LLVM::ShlOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1138 else if (rvsdg::is<jlm::llvm::IntegerLShrOperation>(operation))
1140 return Builder_->create<::mlir::LLVM::LShrOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1142 else if (rvsdg::is<jlm::llvm::IntegerAndOperation>(operation))
1144 return Builder_->create<::mlir::arith::AndIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1146 else if (rvsdg::is<jlm::llvm::IntegerOrOperation>(operation))
1148 return Builder_->create<::mlir::arith::OrIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1150 else if (rvsdg::is<jlm::llvm::IntegerXorOperation>(operation))
1152 return Builder_->create<::mlir::arith::XOrIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1154 else if (rvsdg::is<jlm::llvm::IntegerEqOperation>(operation))
1156 return Builder_->create<::mlir::arith::CmpIOp>(
1158 ::mlir::arith::CmpIPredicate::eq,
1162 else if (rvsdg::is<jlm::llvm::IntegerNeOperation>(operation))
1164 return Builder_->create<::mlir::arith::CmpIOp>(
1166 ::mlir::arith::CmpIPredicate::ne,
1170 else if (rvsdg::is<jlm::llvm::IntegerSgeOperation>(operation))
1172 return Builder_->create<::mlir::arith::CmpIOp>(
1174 ::mlir::arith::CmpIPredicate::sge,
1178 else if (rvsdg::is<jlm::llvm::IntegerSgtOperation>(operation))
1180 return Builder_->create<::mlir::arith::CmpIOp>(
1182 ::mlir::arith::CmpIPredicate::sgt,
1186 else if (rvsdg::is<jlm::llvm::IntegerSleOperation>(operation))
1188 return Builder_->create<::mlir::arith::CmpIOp>(
1190 ::mlir::arith::CmpIPredicate::sle,
1194 else if (rvsdg::is<jlm::llvm::IntegerSltOperation>(operation))
1196 return Builder_->create<::mlir::arith::CmpIOp>(
1198 ::mlir::arith::CmpIPredicate::slt,
1202 else if (rvsdg::is<jlm::llvm::IntegerUgeOperation>(operation))
1204 return Builder_->create<::mlir::arith::CmpIOp>(
1206 ::mlir::arith::CmpIPredicate::uge,
1210 else if (rvsdg::is<jlm::llvm::IntegerUgtOperation>(operation))
1212 return Builder_->create<::mlir::arith::CmpIOp>(
1214 ::mlir::arith::CmpIPredicate::ugt,
1218 else if (rvsdg::is<jlm::llvm::IntegerUleOperation>(operation))
1220 return Builder_->create<::mlir::arith::CmpIOp>(
1222 ::mlir::arith::CmpIPredicate::ule,
1226 else if (rvsdg::is<jlm::llvm::IntegerUltOperation>(operation))
1228 return Builder_->create<::mlir::arith::CmpIOp>(
1230 ::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
llvm::cmp cmp() const noexcept
std::string debug_string() const override
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
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 type(const Node *n)
static std::string strfmt(Args... args)