035、LLVM Dialect:与LLVM IR的桥梁昨晚调一个跨平台算子时,LLVM IR生成阶段报了个“invalid use of function with same name but different type”的错误。盯着屏幕看了半小时,最后发现是MLIR的LLVM Dialect里一个类型转换没处理好——我把!llvm.ptri8直接当成了!llvm.ptrvoid用,LLVM后端不认账。这种坑,踩过一次就记住了。为什么需要LLVM DialectMLIR的生态里,Dialect层层降级,最终总要落到硬件能执行的指令上。LLVM IR作为工业级中间表示,后端优化和代码生成已经打磨了二十年。MLIR设计者没打算重新发明轮子,而是通过LLVM Dialect把MLIR的世界和LLVM的世界连接起来。这个Dialect不是简单地把LLVM IR的指令翻译成MLIR的Operation。它做了两件事:一是提供了与LLVM IR一一对应的操作和类型系统,二是保留了MLIR的多级抽象能力。换句话说,你在MLIR里写LLVM Dialect代码,本质上是在写带类型信息的LLVM IR,但还能利用MLIR的Pass框架做自定义优化。类型系统的映射LLVM Dialect的类型命名规则很直白:所有类型前面加!llvm.前缀。比如!llvm.i32对应LLVM的
035、LLVM Dialect:与LLVM IR的桥梁
035、LLVM Dialect:与LLVM IR的桥梁昨晚调一个跨平台算子时,LLVM IR生成阶段报了个“invalid use of function with same name but different type”的错误。盯着屏幕看了半小时,最后发现是MLIR的LLVM Dialect里一个类型转换没处理好——我把!llvm.ptri8直接当成了!llvm.ptrvoid用,LLVM后端不认账。这种坑,踩过一次就记住了。为什么需要LLVM DialectMLIR的生态里,Dialect层层降级,最终总要落到硬件能执行的指令上。LLVM IR作为工业级中间表示,后端优化和代码生成已经打磨了二十年。MLIR设计者没打算重新发明轮子,而是通过LLVM Dialect把MLIR的世界和LLVM的世界连接起来。这个Dialect不是简单地把LLVM IR的指令翻译成MLIR的Operation。它做了两件事:一是提供了与LLVM IR一一对应的操作和类型系统,二是保留了MLIR的多级抽象能力。换句话说,你在MLIR里写LLVM Dialect代码,本质上是在写带类型信息的LLVM IR,但还能利用MLIR的Pass框架做自定义优化。类型系统的映射LLVM Dialect的类型命名规则很直白:所有类型前面加!llvm.前缀。比如!llvm.i32对应LLVM的