LLVM 编译器学习笔记之十二 -- pass manager

1、测试验证发现Unable to schedule pass问题的解决方法:将相应的依赖pass添加到后面即可,具体原因未知

参考http://llvm.1065342.n5.nabble.com/Unable-to-schedule-Dominator-Tree-Construction-required-by-Module-Verifier-td47617.html#a47645

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就能进行优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值