19#include <mlir/Dialect/Arith/IR/Arith.h>
20#include <mlir/Support/LLVM.h>
22#include <llvm/ADT/STLExtras.h>
23#include <llvm/ADT/TypeSwitch.h>
30static inline ParseResult
31parseOptionalOverflowSemantics(OpAsmParser &parser, llzk::cast::OverflowSemanticsAttr &overflow) {
33 if (failed(parser.parseOptionalKeyword(&keyword))) {
37 std::optional<llzk::cast::OverflowSemantics> semantics =
40 return parser.emitError(parser.getCurrentLocation()) <<
"expected overflow semantics keyword";
43 overflow = llzk::cast::OverflowSemanticsAttr::get(parser.getContext(), *semantics);
48printOptionalOverflowSemantics(OpAsmPrinter &printer, llzk::cast::OverflowSemanticsAttr overflow) {
59 return lhs.size() == rhs.size() && llvm::all_of(llvm::zip_equal(lhs, rhs), [](
auto pair) {
60 auto [lhsType, rhsType] = pair;
61 auto lhsFeltType = mlir::dyn_cast<llzk::felt::FeltType>(lhsType);
62 auto rhsFeltType = mlir::dyn_cast<llzk::felt::FeltType>(rhsType);
67 if (lhsFeltType && rhsFeltType && lhsFeltType != rhsFeltType) {
73 return !lhsFeltType.hasField();
77 return lhsType == rhsType;
83 if (!op.
getValue().getDefiningOp()) {
87 return llvm::TypeSwitch<Operation *, LogicalResult>(op.
getValue().getDefiningOp())
88 .Case<arith::ConstantIndexOp, arith::ConstantIntOp>([&rewriter, &op](
auto constOp) {
90 op, felt::FeltConstAttr::get(op->getContext(),
toAPInt(constOp.value()), op.getType())
93 }).Default([](
auto) {
return failure(); });
98 return ::parseOptionalOverflowSemantics(parser, overflow);
102 OpAsmPrinter &printer,
IntToFeltOp , OverflowSemanticsAttr overflow
110 auto value = constOp.getValue().getValue();
111 if (value.getBitWidth() <= 64) {
112 rewriter.replaceOpWithNewOp<arith::ConstantIndexOp>(op, value.getSExtValue());
120 OpAsmParser &parser, OverflowSemanticsAttr &overflow
122 return ::parseOptionalOverflowSemantics(parser, overflow);
126 OpAsmPrinter &printer,
FeltToIndexOp , OverflowSemanticsAttr overflow
::mlir::TypedValue<::llzk::felt::FeltType > getValue()
::llvm::LogicalResult canonicalize(FeltToIndexOp op, ::mlir::PatternRewriter &rewriter)
static void printOptionalOverflowSemantics(::mlir::OpAsmPrinter &printer, FeltToIndexOp op, ::llzk::cast::OverflowSemanticsAttr overflow)
::mlir::ParseResult parseOptionalOverflowSemantics(::mlir::OpAsmParser &parser, ::llzk::cast::OverflowSemanticsAttr &overflow)
static void printOptionalOverflowSemantics(::mlir::OpAsmPrinter &printer, IntToFeltOp op, ::llzk::cast::OverflowSemanticsAttr overflow)
::mlir::ParseResult parseOptionalOverflowSemantics(::mlir::OpAsmParser &parser, ::llzk::cast::OverflowSemanticsAttr &overflow)
static bool isCompatibleReturnTypes(::mlir::TypeRange lhs, ::mlir::TypeRange rhs)
::llvm::LogicalResult canonicalize(IntToFeltOp op, ::mlir::PatternRewriter &rewriter)
::mlir::TypedValue<::mlir::Type > getValue()
::llvm::StringRef stringifyOverflowSemantics(OverflowSemantics val)
::std::optional< OverflowSemantics > symbolizeOverflowSemantics(::llvm::StringRef str)
APInt toAPInt(const DynamicAPInt &val, unsigned bitWidth)