mlir 类型
构建
// **************************获取type类型*********************************auto i32_type = builder.getI32Type() // 获取int32类型auto tensor_type = // 获取<1x2xf64>的tensor类型mlir::RankedTensorType::get({1, 2},rewriter.getF64Type());auto tensor_noshapre_type = //获取<*xf64>的tensor类型mlir::UnrankedTensorType::get(rewriter.getF64Type());auto tcc_opaqueType = // 获取不透明体类型emitc::OpaqueType::get(builder.getContext(), "tcc_para");auto apply_res_type = // 获取指针类型emitc::PointerType::get(builder.getContext(), builder.getI32Type());// **************************data******************************************
// 构造APFloat类型的数据:①构造float类型数据;②套个llvm::APFloat()
float f_data = 1.0;
llvm::APFloat float_data = llvm::APFloat(f_data); // 构造StringRef类型数据:①构造string类型数据;②套个llvm::StringRef()
llvm::StringRef strref_data = llvm::StringRef("string"); // 构建ArrayRef<>类型数据:①构造个vector或数组; ②套个llvm::ArrayRef()
std::vector<double> vec_data{1.0, 2.0};
llvm::ArrayRef<double> array_data = llvm::ArrayRef(vec_data);
int64_t array_[2] = {1, 2};
llvm::ArrayRef<int64_t> array_data = llvm::ArrayRef(array_data);// 构建ValueRange类型数据
::mlir::ValueRange operands {};// *************************attr属性********************************************
auto str_attr = builder.getStringAttr("&"); // 获取str类型属性// 获取array类型属性 kernel_size = [32, 3, 3, 3]
int64_t array_[2] = {1, 2};
auto array_attr = builder.getI64ArrayAttr(llvm::ArrayRef(array_));
// 获取array类型属性
SmallVector<int32_t> everyOperandNumber(operandNums, 1);
auto operandSegmentSizesAttr = rewriter.getDenseI32ArrayAttr(everyOperandNumber);// 获取tensor类型的属性(一般是constantOp需要)value = dense<[[1.000000e+00, 2.000000e+00]]>
auto tensor_type = // 获取<1x2xf64>的tensor类型mlir::RankedTensorType::get({1, 2},rewriter.getF64Type());
std::vector<double> data{1.0, 2.0};
auto array_data = llvm::ArrayRef(data);
auto tensor_Att = DenseElementsAttr::get(tensor_type, array_data);// 构建uint64_t attr
IntegerAttr::get(IntegerType::get(rewriter.getContext(), 64, IntegerType::Unsigned), group)// 构建NamedAttribute
rewriter.getNamedAttr("bias_value", rewriter.getF32FloatAttr(bias));
获取
int64_t group = op->getAttr("group").dyn_cast<IntegerAttr>().getSInt();int64_t strides[2];
strides[0] = op->getAttr("strides").dyn_cast<ArrayAttr>()[0].dyn_cast<IntegerAttr>().getInt();std::vector<mlir::Type> elementF64TensorTypes{mlir::UnrankedTensorType::get(builder.getF64Type()),mlir::UnrankedTensorType::get(builder.getF64Type())};auto struct_con_result_f64tensor_type =mlir::emitcext::StructType::get(elementF64TensorTypes); ArrayRef<Attribute> f64_values{builder.getF64FloatAttr(1.0),builder.getF64FloatAttr(1.0)};auto f64TensorDataType = RankedTensorType::get({}, builder.getF64Type());auto f64DataAttribute = DenseElementsAttr::get(f64TensorDataType, f64_values);builder.create<mlir::emitcext::StructConstantOp>(op->getLoc(), struct_con_result_f64tensor_type, f64DataAttribute);
::mlir::Value operand
此operand指作为参数传入的op
::llvm::ArrayRef<::mlir::NamedAttribute> attributes_{};Operation* newOp = rewriter.replaceOpWithNewOp<emitc::CallOp>(op,TypeRange{},ValueRange{}, attributes_);
从operand/result获取其数据类型和shape cast之前要先get type
getOperands().back().getType().dyn_cast<RankedTensorType>().getShape()getResult(0).getType().dyn_cast<mlir::RankedTensorType>().getElementType()
构建结构体属性
// 创建标识符属性auto meshAttr = SymbolRefAttr::get(&context, "mesh0");// 创建仿射映射属性auto affineMap = builder.getAffineMap(1, 0, {});// 创建仿射映射属性auto affineMapAttr = AffineMapAttr::get(affineMap);// 创建一个 ArrayAttr,包含这两个属性SmallVector<Attribute, 2> shardMappingEntries = {meshAttr, affineMapAttr};auto shardMappingAttr = ArrayAttr::get(&context, shardMappingEntries);auto affineMapAttr = rewriter.getAffineMapArrayAttr({combinedMap});IntegerAttr intAttr1 = rewriter.getI64IntegerAttr(0);SmallVector<Attribute, 4> attrs = {affineMapAttr, intAttr1};auto arrayAttr = rewriter.getArrayAttr(attrs);arrayAttr.print(llvm::outs());
DictionaryAttr
构造
auto dictAttr = rewriter.getDictionaryAttr({{rewriter.getStringAttr(ttuLoopValueOp.getBaseAddrAttrName().str()),rewriter.getStringAttr(staticAndDynAddr.dynInputBaseAddrStr)}});u2uOp->setAttr(kDynamicValuesAttr, dictAttr);
获取
dynAttr = dyn_cast<DictionaryAttr>(u2uOp->getAttr(kDynamicValuesAttr));
if (auto valueAttr = dyn_cast<IntegerAttr>(dynAttr.get("batch"))) {batch = valueAttr.getInt();
}for (const auto &attr : transposeOutMemorySpace) {}memrefType
auto viewMemRefType = MemRefType::get(dynSizes, viewType.getElementType());
获取memref 或 tensor里的字典属性
getType()).getMemorySpace()
构造memref 或 tensor里的字典属性
MemRefType::get(allocShape, eleType, MemRefLayoutAttrInterface{},cast<MemRefType>(originOutAlloc->getResult(0).getType()).getMemorySpace());