上一篇文章示范了从混合Dialect的MLIR表达式Lowering到LLVM IR Dialect的MLIR表达式,并且最终输出LLVM IR表达式,同时也可以使用JIT编译引擎来执行。至此已经实现了完整的编译流程,本文将会介绍MLIR如何扩展源语言。
前面的一系列文章中源语言都只用了简单的数据类型,在对整个编译流程有了认识之后,本文介绍向源语言中添加较为复杂的数据类型:struct
结构体。在Toy语言中,结构体的定义以及使用方式如下图所示:
本文将会继续使用之前的转置对应元素相乘的例子,只不过加入了struct
数据结构,向multiply_transpose
函数传入结构体,将结构体中的两个成员进行转置再对应元素相乘:
struct Struct {
var a;
var b;
}
def multiply_transpose(Struct value) {
return transpose(value.a) * transpose(value.b);
}
def main() {
Struct value = {[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]};
var c = multiply_transpose(value);
print(c);
}
由于MLIR中没有提供struct
类型,要实现对上述Toy源程序的分析,需要自定义struct
类型。
定义Type类
首先,我们需要在ToyType
命名空间中,在Types
枚举类型中添加Struct
枚举常