MLIR中type必须写在冒号后、操作数或结果声明末尾,不加引号,如%x = arith.constant 42 : i32;attribute是编译期常量,位于操作名后、类型前,分字面量(如"slt")和字典(如{inplace = true}),关键字不加引号,字符串值需加双引号。

MLIR中type的写法:紧跟在冒号后面,不带引号
MLIR里type不是字符串,是语法层面的一等公民,必须出现在:之后、操作数或结果声明的末尾。写错位置或加引号会直接报expected ':'或unknown type错误。
常见误写:%x = arith.constant 42 : "i32"(带引号)→ 错;%x = arith.constant 42 i32(缺冒号)→ 错。
-
i32、f64:标量基本类型 -
tensor:张量类型,维度和元素类型紧贴,无空格 -
memref:内存引用类型,注意不是memref -
vector:向量类型,仅限SIMD语义场景 - 函数类型用
(i32, f64) -> f32,括号不可省,箭头是->不是=>
MLIR中attribute的写法:字典形式或字面量,区分固有与普通属性
attribute本质是编译期常量,必须出现在操作名后、类型前的位置。有两种常见形态:字面量(如整数、浮点、字符串)和字典{key = value}。但要注意——是固有属性(inherent),{key = value}是普通属性(discardable),二者解析逻辑不同,混用会触发unexpected attribute kind。
- 字面量attribute直接跟在操作名后:
arith.constant 3.14 : f64里的3.14就是value属性 - 比较操作的
predicate必须用字面量关键字:arith.cmpi "slt", %a, %b : i32,不能写成"slt"字符串或{predicate = "slt"} - 自定义布尔开关用普通字典:
"toy.transpose"(%t) {inplace = true} : (tensor) -> tensor - 固有属性只在tablegen定义的操作中出现,例如
"func.call"(%x),尖括号不能漏 - 字符串attribute值要加双引号,但关键字(如
eq、slt)不加
容易混淆的边界:哪些是type,哪些是attribute
最常踩坑的是把本该是type的地方写成attribute,或反过来。核心判断依据只有一条:是否参与SSA值的类型系统。如果它决定一个值能被怎么用(比如做加法、存入memref、传给函数参数),那就是type;如果它只是配置操作行为(比如“是否原地转置”“用什么比较方式”),那就是attribute。
-
arith.addi %a, %b : i32→i32是type(规定%a/%b和结果的位宽) -
arith.cmpi "eq", %a, %b : i32→"eq"是attribute(控制比较逻辑),i32是type(规定%a/%b类型) -
memref.alloc() : memref→memref是type(描述分配内存的布局) -
affine.store %v, %m[0] {nontemporal = true}→nontemporal是attribute(提示缓存策略),不影响%v或%m的type
多层嵌套时尤其要盯住冒号位置:冒号左边全是operation及其attribute,右边才是type——这个分界线一旦画错,整个IR就无法parse。

















