mlir 基本操作
在 MLIR 中,mlir::Operation 类提供了丰富的方法,用于操作和分析 IR 中的操作(Operation)。以下是 mlir::Operation 的常用方法及其功能的详细说明:
// 获取操作名称llvm::outs() << "Operation name: " << op->getName() << "\n";llvm::outs() << "Operation name: " << op->getName() << "\n";// 获取操作数for (mlir::Value operand : op->getOperands()) {llvm::outs() << "Operand: " << operand << "\n";}// 获取结果for (mlir::Value result : op->getResults()) {llvm::outs() << "Result: " << result << "\n";}// 获取属性for (mlir::NamedAttribute attr : op->getAttrs()) {llvm::outs() << "Attribute: " << attr.getName() << " = " << attr.getValue() << "\n";}Location loc = op.getLoc();
// 获取block 入口参数,参数类型,父block, 行号
mlir::Block *block = op->getBlock();
for (mlir::BlockArgument arg : block->getArguments()) {llvm::outs() << " Argument: " << arg << "\n";llvm::outs() << " Type: " << arg.getType() << "\n";llvm::outs() << " Parent Block: " << arg.getParentBlock() << "\n";llvm::outs() << " Location: " << arg.getLoc() << "\n";auto custom_tensor =rewriter.create<custom::ConstLikeOp>(loc, arg.getType(), arg);}
以下是获取块输入参数的主要方法:
方法 | 说明 |
---|---|
getArguments() | 获取块的所有输入参数。 |
getArgument(index) | 获取块的特定输入参数。 |
getNumArguments() | 获取块的输入参数数量。 |
getType() | 获取输入参数的类型。 |
getParentBlock() | 获取输入参数所属的块。 |
getLoc() | 获取输入参数的位置信息。 |
getUses() | 获取输入参数的使用。 |
SmallVector<Value> customTensors;
SmallVector<Value> resultTensors;void getcustomTensors(const llvm::SmallVector<mlir::Value> &values,SmallVector<mlir::Value> &results) {for (size_t i = 0; i < values.size(); ++i) {mlir::Type type = values[i].getType();if (auto tensorType = type.dyn_cast<mlir::TensorType>()) {ele_type = tensorType.getElementType();auto const_k =stc::getConstTensor<float>(rewriter, op, vec, newShape).value();llvm::outs() << "TensorTorchType: " << tensorType << "\n";llvm::outs() << " Element Type: " << tensorType.getElementType()<< "\n"; // 打印元素类型llvm::outs() << " Shape: ";for (int64_t dim : tensorType.getShape()) { // 打印形状llvm::outs() << dim << " ";}llvm::outs() << "\n";} else {llvm::outs() << "Not a TensorTorchType: " << type << "\n";}}
}void ToBuiltinTensorOp::getCanonicalizationPatterns(RewritePatternSet &patterns,MLIRContext *context) {patterns.add(+[](ToBuiltinTensorOp op, PatternRewriter &rewriter) {auto operand = op.getOperand();auto fromBuiltinOp = operand.getDefiningOp<FromBuiltinTensorOp>();if (!fromBuiltinOp)return failure();rewriter.replaceOp(op, fromBuiltinOp.getOperand());return success();});
}