Starofus

你好呀,我是Sans

【HPC 08】如何用LLVM 插件调试 Pass

2025-12-18

用llvm插件调试loopVectorize pass

代码:https://github.com/mrzhuzhe/peasant/tree/main/llvm/pass-test/vectorize

1. 概述

  • 1. llvm pass 调试需要重编,用插件调试节约编译时间
  • 2. llvm codegen 也会用到 passes 可以 load plugin
  • 3. 熟悉loop Vectorize 流程 alias PHI 分析
  • 4. 为开发LLVM后端适配自定义硬件做准备
  • 5. PASS 也可以用来实现自定义runtime库

2. 相关工作

3. 实验设计

3.1 提取 llvm loopVectorize 插件中遇到的实际问题

版本 llvm 22.0

  • 1. RTTI 选项问题
  • 2. .ll中 attribute 设置问题

3.2 Debug loopVectorize 插件中遇到的世纪问题

  • 1. cl 和 pass 类名不能重复
  • 2. 上下游的插件依赖

4. 实验结果

4.1 一些GCC中遇到过的能手工向量化却不能自动向量化的问题,LLVM中是如何处理的?

  • 1. Alias 分析深度限制:循环中是否有数据是相互依赖的
  • 2. Control in loop: 循环中有判断
  • 3. Gather in loop: 循环中数据访问不连续

5. 总结和展望

编译器的一些严格却又合理的行为

一些思考

  • 为什么要有IR和方言,我把所有信息保存下来不行吗?
    答:不行,内容太多不分层会难以维护,例如:向量化阶段不做指令选择
  • 为什么要有虚拟机存在
    答:对硬件资源和数学过程的建模
  • 编译器如何与硬件协同设计

后续计划

  • 1. 开发自定义LLVM后端支持新硬件
  • 2. JIT 虚拟机 和 浏览器
  • 3. 如何跟上LLVM 的 roadMap ?

6. 参考资料

  • 1. 如何实现一个llvm前端 LLVM kaleidoscope
  • 2. LLVM CPU0 Backend
  • 3. GCC internal GIMPLE auto-vectorize
  • 4. 一生一芯 集成电路前后端
  • 5. PLCT 实验室的 V8 引擎流程解释 torque ignite ...
  • 6. ROCm / qemu / Linuv divice driver / Stm32 driver / tcp ip illustrate
编译器