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>(
589 MlirOp =
Builder_->create<::mlir::rvsdg::ConstantCtrl>(
592 ctlOp->value().alternative());
596 MlirOp =
Builder_->create<::mlir::jlm::CreateVarArgList>(
603 MlirOp =
Builder_->create<::mlir::jlm::Undef>(
609 auto nMemstates = freeOp->narguments() - 2;
611 std::vector<::mlir::Type> memoryStates(
613 Builder_->getType<::mlir::rvsdg::MemStateEdgeType>());
614 MlirOp =
Builder_->create<::mlir::jlm::Free>(
616 ::mlir::TypeRange(::llvm::ArrayRef(memoryStates)),
617 Builder_->getType<::mlir::rvsdg::IOStateEdgeType>(),
619 ::mlir::ValueRange({ std::next(inputs.begin()), std::prev(inputs.end()) }),
620 inputs[inputs.size() - 1]);
624 MlirOp =
Builder_->create<::mlir::jlm::Alloca>(
630 alloca_op->alignment(),
631 ::mlir::ValueRange({ std::next(inputs.begin()), inputs.end() }));
635 MlirOp =
Builder_->create<::mlir::jlm::Malloc>(
647 ::llvm::SmallVector<::mlir::Type> memStateTypes;
648 for (
size_t i = 1; i < load_op->nresults(); i++)
650 memStateTypes.push_back(
ConvertType(*load_op->result(i)));
652 MlirOp =
Builder_->create<::mlir::jlm::Load>(
657 Builder_->getUI32IntegerAttr(load_op->GetAlignment()),
658 ::mlir::ValueRange({ std::next(inputs.begin()), inputs.end() })
663 MlirOp =
Builder_->create<::mlir::jlm::Store>(
668 Builder_->getUI32IntegerAttr(store_op->GetAlignment()),
669 ::mlir::ValueRange({ std::next(std::next(inputs.begin())), inputs.end() })
674 MlirOp =
Builder_->create<::mlir::rvsdg::MemStateMerge>(
681 MlirOp =
Builder_->create<::mlir::jlm::IOBarrier>(
689 MlirOp =
Builder_->create<::mlir::LLVM::GEPOp>(
694 ::mlir::ValueRange({ std::next(inputs.begin()), inputs.end() }));
698 assert(selectOp->nresults() == 1);
699 assert(inputs.size() == 3);
700 MlirOp =
Builder_->create<::mlir::arith::SelectOp>(
713 ::llvm::SmallVector<::mlir::Attribute> mappingVector;
714 for (
auto mapping : *matchOp)
716 ::mlir::rvsdg::MatchRuleAttr matchRule = ::mlir::rvsdg::MatchRuleAttr::get(
718 ::llvm::ArrayRef(
static_cast<int64_t
>(mapping.first)),
721 mappingVector.push_back(matchRule);
724 mappingVector.push_back(::mlir::rvsdg::MatchRuleAttr::get(
726 ::llvm::ArrayRef<int64_t>(),
727 matchOp->default_alternative()));
730 MlirOp =
Builder_->create<::mlir::rvsdg::Match>(
734 ::mlir::ArrayAttr::get(
Builder_->getContext(), ::llvm::ArrayRef(mappingVector)));
738 auto functionType = *callOp->GetFunctionType();
739 ::llvm::SmallVector<::mlir::Type> argumentTypes;
740 for (
size_t i = 0; i < functionType.NumArguments(); i++)
742 argumentTypes.push_back(
ConvertType(functionType.ArgumentType(i)));
744 ::llvm::SmallVector<::mlir::Type> resultTypes;
745 for (
size_t i = 0; i < functionType.NumResults(); i++)
747 resultTypes.push_back(
ConvertType(functionType.ResultType(i)));
749 MlirOp =
Builder_->create<::mlir::jlm::Call>(
754 { std::next(inputs.begin()), std::prev(std::prev(inputs.end())) }),
755 inputs[inputs.size() - 2],
756 inputs[inputs.size() - 1]
760 auto lambdaStateSplit =
763 auto memoryNodeIndicesAttr =
766 ::llvm::SmallVector<::mlir::Type> resultTypes;
767 for (
size_t i = 0; i < lambdaStateSplit->nresults(); i++)
769 resultTypes.push_back(
ConvertType(*lambdaStateSplit->result(i).get()));
771 MlirOp =
Builder_->create<::mlir::rvsdg::LambdaEntryMemoryStateSplit>(
773 ::llvm::ArrayRef(resultTypes),
775 memoryNodeIndicesAttr);
778 auto lambdaStateMerge =
781 auto memoryNodeIndicesAttr =
784 ::llvm::SmallVector<::mlir::Type> resultTypes;
785 for (
size_t i = 0; i < lambdaStateMerge->nresults(); i++)
787 resultTypes.push_back(
ConvertType(*lambdaStateMerge->result(i).get()));
789 MlirOp =
Builder_->create<::mlir::rvsdg::LambdaExitMemoryStateMerge>(
791 ::llvm::ArrayRef(resultTypes),
792 ::mlir::ValueRange(inputs),
793 memoryNodeIndicesAttr);
796 auto callStateSplit =
799 auto memoryNodeIndicesAttr =
802 ::llvm::SmallVector<::mlir::Type> resultTypes;
803 for (
size_t i = 0; i < callStateSplit->nresults(); i++)
805 resultTypes.push_back(
ConvertType(*callStateSplit->result(i).get()));
807 MlirOp =
Builder_->create<::mlir::rvsdg::CallExitMemoryStateSplit>(
809 ::llvm::ArrayRef(resultTypes),
811 memoryNodeIndicesAttr);
814 auto callStateMerge =
817 auto memoryNodeIndicesAttr =
820 ::llvm::SmallVector<::mlir::Type> resultTypes;
821 for (
size_t i = 0; i < callStateMerge->nresults(); i++)
823 resultTypes.push_back(
ConvertType(*callStateMerge->result(i).get()));
825 MlirOp =
Builder_->create<::mlir::rvsdg::CallEntryMemoryStateMerge>(
827 ::llvm::ArrayRef(resultTypes),
828 ::mlir::ValueRange(inputs),
829 memoryNodeIndicesAttr);
833 ::mlir::Type resultType =
ConvertType(*memoryStateJoin->result(0));
835 MlirOp =
Builder_->create<::mlir::rvsdg::MemoryStateJoin>(
838 ::mlir::ValueRange(inputs));
843 auto message =
util::strfmt(
"Unimplemented simple node: ", operation.debug_string());
847 block.push_back(MlirOp);
1116 ::llvm::SmallVector<::mlir::Value> inputs)
1120 return Builder_->create<::mlir::arith::AddIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1124 return Builder_->create<::mlir::arith::SubIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1128 return Builder_->create<::mlir::arith::MulIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1132 return Builder_->create<::mlir::arith::DivSIOp>(
1139 return Builder_->create<::mlir::arith::DivUIOp>(
1146 return Builder_->create<::mlir::arith::RemSIOp>(
1153 return Builder_->create<::mlir::arith::RemUIOp>(
1160 return Builder_->create<::mlir::LLVM::AShrOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1164 return Builder_->create<::mlir::LLVM::ShlOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1168 return Builder_->create<::mlir::LLVM::LShrOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1172 return Builder_->create<::mlir::arith::AndIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1176 return Builder_->create<::mlir::arith::OrIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1180 return Builder_->create<::mlir::arith::XOrIOp>(
Builder_->getUnknownLoc(), inputs[0], inputs[1]);
1184 return Builder_->create<::mlir::arith::CmpIOp>(
1186 ::mlir::arith::CmpIPredicate::eq,
1192 return Builder_->create<::mlir::arith::CmpIOp>(
1194 ::mlir::arith::CmpIPredicate::ne,
1200 return Builder_->create<::mlir::arith::CmpIOp>(
1202 ::mlir::arith::CmpIPredicate::sge,
1208 return Builder_->create<::mlir::arith::CmpIOp>(
1210 ::mlir::arith::CmpIPredicate::sgt,
1216 return Builder_->create<::mlir::arith::CmpIOp>(
1218 ::mlir::arith::CmpIPredicate::sle,
1224 return Builder_->create<::mlir::arith::CmpIOp>(
1226 ::mlir::arith::CmpIPredicate::slt,
1232 return Builder_->create<::mlir::arith::CmpIOp>(
1234 ::mlir::arith::CmpIPredicate::uge,
1240 return Builder_->create<::mlir::arith::CmpIOp>(
1242 ::mlir::arith::CmpIPredicate::ugt,
1248 return Builder_->create<::mlir::arith::CmpIOp>(
1250 ::mlir::arith::CmpIPredicate::ule,
1256 return Builder_->create<::mlir::arith::CmpIOp>(
1258 ::mlir::arith::CmpIPredicate::ult,