048、从MemRef到LLVM的最终降级路径 048、从MemRef到LLVM的最终降级路径昨晚调试一个MLIR生成的向量化代码,跑在RISC-V开发板上,发现内存访问总是错位。GDB进去一看,MemRef的offset计算完全不对——明明是个二维数组的连续内存,结果每次load都跳到奇怪的位置。折腾到凌晨两点,最后发现是MemRef降级到LLVM时,strides和sizes的映射顺序搞反了。这个坑,今天必须写清楚。MemRef在MLIR中的真实面目很多人把MemRef当成“带形状的指针”,这个理解在高层优化阶段勉强能用,但到了降级阶段会害死人。MemRef本质上是一个结构化描述符,它包含的不只是数据指针,还有一组描述内存布局的元数据。看一个典型的MemRef类型:memref2x3xf32。在MLIR内部,它被表示为一个包含以下字段的结构体:allocatedPtr:分配内存的起始地址(用于deallocation)alignedPtr:对齐后的数据起始地址(实际访问用这个)offset:相对于alignedPtr的偏移量(通常为0,但动态形状时会变)sizes:每个维度的长度strides:每个维度在内存中的步长(以元素为单位)这里踩过坑:很多人以为strides就是siz