You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
4.3 KiB
123 lines
4.3 KiB
//===- PDLInterp.cpp - PDL Interpreter Dialect ------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "mlir/Dialect/PDLInterp/IR/PDLInterp.h"
|
|
#include "mlir/Dialect/PDL/IR/PDLTypes.h"
|
|
#include "mlir/IR/BuiltinTypes.h"
|
|
#include "mlir/IR/DialectImplementation.h"
|
|
|
|
using namespace mlir;
|
|
using namespace mlir::pdl_interp;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// PDLInterp Dialect
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
void PDLInterpDialect::initialize() {
|
|
addOperations<
|
|
#define GET_OP_LIST
|
|
#include "mlir/Dialect/PDLInterp/IR/PDLInterpOps.cpp.inc"
|
|
>();
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// pdl_interp::CreateOperationOp
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
static ParseResult parseCreateOperationOp(OpAsmParser &p,
|
|
OperationState &state) {
|
|
if (p.parseOptionalAttrDict(state.attributes))
|
|
return failure();
|
|
Builder &builder = p.getBuilder();
|
|
|
|
// Parse the operation name.
|
|
StringAttr opName;
|
|
if (p.parseAttribute(opName, "name", state.attributes))
|
|
return failure();
|
|
|
|
// Parse the operands.
|
|
SmallVector<OpAsmParser::OperandType, 4> operands;
|
|
if (p.parseLParen() || p.parseOperandList(operands) || p.parseRParen() ||
|
|
p.resolveOperands(operands, builder.getType<pdl::ValueType>(),
|
|
state.operands))
|
|
return failure();
|
|
|
|
// Parse the attributes.
|
|
SmallVector<Attribute, 4> attrNames;
|
|
if (succeeded(p.parseOptionalLBrace())) {
|
|
SmallVector<OpAsmParser::OperandType, 4> attrOps;
|
|
do {
|
|
StringAttr nameAttr;
|
|
OpAsmParser::OperandType operand;
|
|
if (p.parseAttribute(nameAttr) || p.parseEqual() ||
|
|
p.parseOperand(operand))
|
|
return failure();
|
|
attrNames.push_back(nameAttr);
|
|
attrOps.push_back(operand);
|
|
} while (succeeded(p.parseOptionalComma()));
|
|
|
|
if (p.parseRBrace() ||
|
|
p.resolveOperands(attrOps, builder.getType<pdl::AttributeType>(),
|
|
state.operands))
|
|
return failure();
|
|
}
|
|
state.addAttribute("attributeNames", builder.getArrayAttr(attrNames));
|
|
state.addTypes(builder.getType<pdl::OperationType>());
|
|
|
|
// Parse the result types.
|
|
SmallVector<OpAsmParser::OperandType, 4> opResultTypes;
|
|
if (p.parseArrow())
|
|
return failure();
|
|
if (succeeded(p.parseOptionalLParen())) {
|
|
if (p.parseRParen())
|
|
return failure();
|
|
} else if (p.parseOperandList(opResultTypes) ||
|
|
p.resolveOperands(opResultTypes, builder.getType<pdl::TypeType>(),
|
|
state.operands)) {
|
|
return failure();
|
|
}
|
|
|
|
int32_t operandSegmentSizes[] = {static_cast<int32_t>(operands.size()),
|
|
static_cast<int32_t>(attrNames.size()),
|
|
static_cast<int32_t>(opResultTypes.size())};
|
|
state.addAttribute("operand_segment_sizes",
|
|
builder.getI32VectorAttr(operandSegmentSizes));
|
|
return success();
|
|
}
|
|
|
|
static void print(OpAsmPrinter &p, CreateOperationOp op) {
|
|
p << "pdl_interp.create_operation ";
|
|
p.printOptionalAttrDict(op.getAttrs(),
|
|
{"attributeNames", "name", "operand_segment_sizes"});
|
|
p << '"' << op.name() << "\"(" << op.operands() << ')';
|
|
|
|
// Emit the optional attributes.
|
|
ArrayAttr attrNames = op.attributeNames();
|
|
if (!attrNames.empty()) {
|
|
Operation::operand_range attrArgs = op.attributes();
|
|
p << " {";
|
|
interleaveComma(llvm::seq<int>(0, attrNames.size()), p,
|
|
[&](int i) { p << attrNames[i] << " = " << attrArgs[i]; });
|
|
p << '}';
|
|
}
|
|
|
|
// Print the result type constraints of the operation.
|
|
auto types = op.types();
|
|
if (types.empty())
|
|
p << " -> ()";
|
|
else
|
|
p << " -> " << op.types();
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// TableGen Auto-Generated Op and Interface Definitions
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#define GET_OP_CLASSES
|
|
#include "mlir/Dialect/PDLInterp/IR/PDLInterpOps.cpp.inc"
|