276 ::llvm::SmallVector<::mlir::Value> inputs)
278 ::mlir::Operation * MlirOp =
nullptr;
282 Builder_->create<::mlir::arith::AddIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
287 Builder_->create<::mlir::arith::AndIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
292 Builder_->create<::mlir::arith::ShRUIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
297 Builder_->create<::mlir::arith::MulIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
302 Builder_->create<::mlir::arith::OrIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
307 Builder_->create<::mlir::arith::DivSIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
312 Builder_->create<::mlir::arith::ShLIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
317 Builder_->create<::mlir::arith::ShRUIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
322 Builder_->create<::mlir::arith::RemSIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
331 Builder_->create<::mlir::arith::SubIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
336 Builder_->create<::mlir::arith::DivUIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
341 Builder_->create<::mlir::arith::RemUIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
350 Builder_->create<::mlir::arith::XOrIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
451 ::mlir::Block & block,
452 const ::llvm::SmallVector<::mlir::Value> & inputs)
454 ::mlir::Operation * MlirOp =
nullptr;
458 auto value = bitOp->value();
459 MlirOp =
Builder_->create<::mlir::arith::ConstantIntOp>(
467 auto isNegative = integerConstOp->Representation().is_negative();
468 auto value = isNegative ? integerConstOp->Representation().to_int()
469 : integerConstOp->Representation().to_uint();
470 MlirOp =
Builder_->create<::mlir::arith::ConstantIntOp>(
473 integerConstOp->Representation().nbits());
481 MlirOp =
Builder_->create<::mlir::LLVM::FMulAddOp>(
496 auto value = fpOp->constant();
498 Builder_->create<::mlir::arith::ConstantFloatOp>(
Builder_->getUnknownLoc(), value, size);
503 MlirOp =
Builder_->create<::mlir::LLVM::ZeroOp>(
Builder_->getUnknownLoc(), type);
508 MlirOp =
Builder_->create<::mlir::jlm::ConstantDataArray>(
516 MlirOp =
Builder_->create<::mlir::LLVM::ZeroOp>(
Builder_->getUnknownLoc(), type);
519 auto constantPointerNullOp =
523 auto type =
ConvertType(*constantPointerNullOp->result(0));
524 MlirOp =
Builder_->create<::mlir::LLVM::ZeroOp>(
Builder_->getUnknownLoc(), type);
536 MlirOp =
Builder_->create<::mlir::arith::NegFOp>(
Builder_->getUnknownLoc(), inputs[0]);
540 MlirOp =
Builder_->create<::mlir::arith::ExtFOp>(
560 MlirOp =
Builder_->create<::mlir::arith::ExtUIOp>(
562 Builder_->getIntegerType(zextOperation->ndstbits()),
567 MlirOp =
Builder_->create<::mlir::arith::ExtSIOp>(
569 Builder_->getIntegerType(sextOp->ndstbits()),
574 MlirOp =
Builder_->create<::mlir::arith::SIToFPOp>(
581 MlirOp =
Builder_->create<::mlir::arith::TruncIOp>(
588 MlirOp =
Builder_->create<::mlir::LLVM::IntToPtrOp>(
595 auto srcType = bitCastOp->argument(0);
596 auto dstType = bitCastOp->result(0);
601 MlirOp =
Builder_->create<::mlir::LLVM::BitcastOp>(
607 else if (
auto srcBitType =
dynamic_cast<const rvsdg::BitType *
>(srcType.get()))
609 if (
auto dstBitType =
dynamic_cast<const rvsdg::BitType *
>(dstType.get()))
611 auto srcBits = srcBitType->nbits();
612 auto dstBits = dstBitType->nbits();
614 if (dstBits > srcBits)
616 MlirOp =
Builder_->create<::mlir::arith::ExtUIOp>(
621 else if (dstBits < srcBits)
623 MlirOp =
Builder_->create<::mlir::arith::TruncIOp>(
631 MlirOp =
Builder_->create<::mlir::LLVM::BitcastOp>(
641 util::strfmt(
"Unsupported bitcast type combination: ", bitCastOp->debug_string());
647 MlirOp =
Builder_->create<::mlir::jlm::FuncToPtr>(
649 Builder_->getType<::mlir::LLVM::LLVMPointerType>(),
654 MlirOp =
Builder_->create<::mlir::jlm::PtrToFunc>(
662 MlirOp =
Builder_->create<::mlir::rvsdg::ConstantCtrl>(
665 ctlOp->value().alternative());
669 MlirOp =
Builder_->create<::mlir::jlm::CreateVarArgList>(
676 MlirOp =
Builder_->create<::mlir::jlm::Undef>(
682 auto nMemstates = freeOp->narguments() - 2;
684 std::vector<::mlir::Type> memoryStates(
686 Builder_->getType<::mlir::rvsdg::MemStateEdgeType>());
687 MlirOp =
Builder_->create<::mlir::jlm::Free>(
689 Builder_->getType<::mlir::rvsdg::IOStateEdgeType>(),
690 ::mlir::TypeRange(::llvm::ArrayRef(memoryStates)),
693 ::mlir::ValueRange({ std::next(inputs.begin(), 2), inputs.end() }));
697 MlirOp =
Builder_->create<::mlir::jlm::Alloca>(
703 alloca_op->alignment(),
704 ::mlir::ValueRange({ std::next(inputs.begin()), inputs.end() }));
708 MlirOp =
Builder_->create<::mlir::jlm::Malloc>(
722 ::mlir::Value inputIoState = isVolatile ? inputs[1] :
nullptr;
723 ::mlir::Type outputIoState =
724 isVolatile ?
Builder_->getType<::mlir::rvsdg::IOStateEdgeType>() :
nullptr;
726 MlirOp =
Builder_->create<::mlir::jlm::Load>(
732 Builder_->getUI32IntegerAttr(load_op->GetAlignment()),
736 { std::next(inputs.begin(), isVolatile ? 2 : 1), inputs.end() }));
743 ::mlir::Value inputIoState = isVolatile ? inputs[2] :
nullptr;
744 ::mlir::Type outputIoState =
745 isVolatile ?
Builder_->getType<::mlir::rvsdg::IOStateEdgeType>() :
nullptr;
747 MlirOp =
Builder_->create<::mlir::jlm::Store>(
753 Builder_->getUI32IntegerAttr(store_op->GetAlignment()),
757 { std::next(inputs.begin(), isVolatile ? 3 : 2), inputs.end() }));
761 MlirOp =
Builder_->create<::mlir::rvsdg::MemStateMerge>(
768 MlirOp =
Builder_->create<::mlir::jlm::IOBarrier>(
777 MlirOp =
Builder_->create<::mlir::jlm::MemoryHoistBarrier>(
779 Builder_->getType<::mlir::LLVM::LLVMPointerType>(),
782 hoistBarrierOp->getDereferenceableSize());
786 MlirOp =
Builder_->create<::mlir::LLVM::GEPOp>(
791 ::mlir::ValueRange({ std::next(inputs.begin()), inputs.end() }));
795 assert(selectOp->nresults() == 1);
796 assert(inputs.size() == 3);
797 MlirOp =
Builder_->create<::mlir::arith::SelectOp>(
810 ::llvm::SmallVector<::mlir::Attribute> mappingVector;
811 for (
auto mapping : *matchOp)
813 ::mlir::rvsdg::MatchRuleAttr matchRule = ::mlir::rvsdg::MatchRuleAttr::get(
815 ::llvm::ArrayRef(
static_cast<int64_t
>(mapping.first)),
818 mappingVector.push_back(matchRule);
821 mappingVector.push_back(::mlir::rvsdg::MatchRuleAttr::get(
823 ::llvm::ArrayRef<int64_t>(),
824 matchOp->default_alternative()));
827 MlirOp =
Builder_->create<::mlir::rvsdg::Match>(
831 ::mlir::ArrayAttr::get(
Builder_->getContext(), ::llvm::ArrayRef(mappingVector)));
835 auto functionType = *callOp->GetFunctionType();
836 ::llvm::SmallVector<::mlir::Type> argumentTypes;
837 for (
size_t i = 0; i < functionType.NumArguments(); i++)
839 argumentTypes.push_back(
ConvertType(functionType.ArgumentType(i)));
841 ::llvm::SmallVector<::mlir::Type> resultTypes;
842 for (
size_t i = 0; i < functionType.NumResults(); i++)
844 resultTypes.push_back(
ConvertType(functionType.ResultType(i)));
846 MlirOp =
Builder_->create<::mlir::jlm::Call>(
851 { std::next(inputs.begin()), std::prev(std::prev(inputs.end())) }),
852 inputs[inputs.size() - 2],
853 inputs[inputs.size() - 1]
857 auto lambdaStateSplit =
860 auto memoryNodeIndicesAttr =
863 ::llvm::SmallVector<::mlir::Type> resultTypes;
864 for (
size_t i = 0; i < lambdaStateSplit->nresults(); i++)
866 resultTypes.push_back(
ConvertType(*lambdaStateSplit->result(i).get()));
868 MlirOp =
Builder_->create<::mlir::rvsdg::LambdaEntryMemoryStateSplit>(
870 ::llvm::ArrayRef(resultTypes),
872 memoryNodeIndicesAttr);
875 auto lambdaStateMerge =
878 auto memoryNodeIndicesAttr =
881 ::llvm::SmallVector<::mlir::Type> resultTypes;
882 for (
size_t i = 0; i < lambdaStateMerge->nresults(); i++)
884 resultTypes.push_back(
ConvertType(*lambdaStateMerge->result(i).get()));
886 MlirOp =
Builder_->create<::mlir::rvsdg::LambdaExitMemoryStateMerge>(
888 ::llvm::ArrayRef(resultTypes),
889 ::mlir::ValueRange(inputs),
890 memoryNodeIndicesAttr);
893 auto callStateSplit =
896 auto memoryNodeIndicesAttr =
899 ::llvm::SmallVector<::mlir::Type> resultTypes;
900 for (
size_t i = 0; i < callStateSplit->nresults(); i++)
902 resultTypes.push_back(
ConvertType(*callStateSplit->result(i).get()));
904 MlirOp =
Builder_->create<::mlir::rvsdg::CallExitMemoryStateSplit>(
906 ::llvm::ArrayRef(resultTypes),
908 memoryNodeIndicesAttr);
911 auto callStateMerge =
914 auto memoryNodeIndicesAttr =
917 ::llvm::SmallVector<::mlir::Type> resultTypes;
918 for (
size_t i = 0; i < callStateMerge->nresults(); i++)
920 resultTypes.push_back(
ConvertType(*callStateMerge->result(i).get()));
922 MlirOp =
Builder_->create<::mlir::rvsdg::CallEntryMemoryStateMerge>(
924 ::llvm::ArrayRef(resultTypes),
925 ::mlir::ValueRange(inputs),
926 memoryNodeIndicesAttr);
930 ::mlir::Type resultType =
ConvertType(*memoryStateJoin->result(0));
932 MlirOp =
Builder_->create<::mlir::rvsdg::MemoryStateJoin>(
935 ::mlir::ValueRange(inputs));
940 auto message =
util::strfmt(
"Unimplemented simple node: ", operation.debug_string());
944 block.push_back(MlirOp);
1213 ::llvm::SmallVector<::mlir::Value> inputs)
1217 return Builder_->create<::mlir::arith::AddIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1221 return Builder_->create<::mlir::arith::SubIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1225 return Builder_->create<::mlir::arith::MulIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1229 return Builder_->create<::mlir::arith::DivSIOp>(
1236 return Builder_->create<::mlir::arith::DivUIOp>(
1243 return Builder_->create<::mlir::arith::RemSIOp>(
1250 return Builder_->create<::mlir::arith::RemUIOp>(
1257 return Builder_->create<::mlir::LLVM::AShrOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1261 return Builder_->create<::mlir::LLVM::ShlOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1265 return Builder_->create<::mlir::LLVM::LShrOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1269 return Builder_->create<::mlir::arith::AndIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1273 return Builder_->create<::mlir::arith::OrIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1277 return Builder_->create<::mlir::arith::XOrIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1281 return Builder_->create<::mlir::arith::CmpIOp>(
1283 ::mlir::arith::CmpIPredicate::eq,
1289 return Builder_->create<::mlir::arith::CmpIOp>(
1291 ::mlir::arith::CmpIPredicate::ne,
1297 return Builder_->create<::mlir::arith::CmpIOp>(
1299 ::mlir::arith::CmpIPredicate::sge,
1305 return Builder_->create<::mlir::arith::CmpIOp>(
1307 ::mlir::arith::CmpIPredicate::sgt,
1313 return Builder_->create<::mlir::arith::CmpIOp>(
1315 ::mlir::arith::CmpIPredicate::sle,
1321 return Builder_->create<::mlir::arith::CmpIOp>(
1323 ::mlir::arith::CmpIPredicate::slt,
1329 return Builder_->create<::mlir::arith::CmpIOp>(
1331 ::mlir::arith::CmpIPredicate::uge,
1337 return Builder_->create<::mlir::arith::CmpIOp>(
1339 ::mlir::arith::CmpIPredicate::ugt,
1345 return Builder_->create<::mlir::arith::CmpIOp>(
1347 ::mlir::arith::CmpIPredicate::ule,
1353 return Builder_->create<::mlir::arith::CmpIOp>(
1355 ::mlir::arith::CmpIPredicate::ult,