1、MLIR区分三种整数类型
IntegerType::get(context, 32, IntegerType::Signless); // 简写IntegerType::get(context, 32)
IntegerType::get(context, 32, IntegerType::Signed);
IntegerType::get(context, 32, IntegerType::Unsigned);
在 mlir/include/mlir/IR/BuiltinTypes.td中定义,所以td中i32/si32/ui32 是三种不同的数据类型
在开源CppEmitter::shouldMapToUnsigned中定义映射,Signless保存和Signed一致
在 mlir/include/mlir/Dialect/Arith/IR/ArithOps.td中Arith_IndexCastOp仅支持不带符号信息的数据类型SignlessInteger
2、自定义结构图类型:
hlc.struct_def @DemoKernelL1dAddr {
"totalBytes" : i32,
"bdAddrBase" : i32,
"buffer0" : i64,
"buffer1" : i64
}
hlc.struct_def @DemoKernelPara {
"l1dAddr" : !hlc.struct<@DemoKernelL1dAddr>
}
在主函数中需要将分离的参数和结构体进行绑定:结构体存储的是地址,get_field 取出地址,pointer_cast 转换为内存视图
3、MLIR 的 arith 方言只允许 i64(signless)
可以通过增加属性 constOp->setAttr("xxx", UnitAttr::get(rewriter.getContext())); 做区分