1、测试验证发现Unable to schedule pass问题的解决方法:将相应的依赖pass添加到后面即可,具体原因未知
a) 重复添加时以第一个出现的位置AU.addRequired为准
b) AU.addPreserved是一个独立的属性,不能解决问题
2、Pass 和 PassManager 是两者pass的维护方式,比如addVectorPasses,目前两套是独立存在的,不知道后续是否可以通过一种去调用另一种?
3、llvm12->14选项变更, 迁移到新的Pass参考D93863 (LLVM PassManager对C++程序设计的思考 - 知乎)
opt -debug-pass=Structure变更为-debug-pass-manager=Structure或者-enable-new-pm=0
注意:pass也并非完全独立,比如发现对同一个中间IR进行处理时,clang的处理结果和opt可能不一样,这个时候大部分是因为opt在分析处理的之前一些pass 暴露了一些分析过程 AnalysisPass 的内容引起的,分析时可以简单的通过disable AU.addPreserved 或者PA.preserve确认是哪个分析未更新导致, 参考https://www.cs.cmu.edu/afs/cs/academic/class/15745-s15/public/lectures/L6-LLVM2-1up.pdf P24
4、测试验证依赖的pass是否执行在于 AU.addRequiredID 语句是否存在?而非INITIALIZE_PASS_DEPENDENCY
3、在 PassManagerBuilder.cpp 中也有很多选项控制pass是否执行,比如EnableLoopInterchange,也就是相关的优化控制并不一定在对应的实现文件LoopInterchange.cpp中
4、 Passes/PassBuilder.cpp和Passes/PassBuilderPipelines.cpp主要管理的是中端的优化
IPO/PassManagerBuilder.cpp:430 FPM.add(createEarlyCSEPass())
,后端的优化在Target/AArch64/AArch64TargetMachine.cpp中维护,比如
AArch64TargetMachine.cpp:721: addPass(createAArch64AdvSIMDScalar());
5、由 -mllvm -opt-bisect-limit=-1 -S -emit-llvm可以看到不变量外提LICM在向量化Loop Vectorization之前,因此向量化本身如果创建的IR在一个BB内,则Combine就能进行优化