(cppcon)当零抽象失败 怎么把编译器问题解决掉?
14 Jun 2020
|
|
这个演讲者写了个python to c++的程序 pythran,牛逼阿 这个演讲是pythran生成代码有个bug,抓bug的故事,涉及到llvm
演示了一个简单的add代码,性能差很多,编译器问题(怎么定界的这么快)
首先找最小复现代码片 c的实现是向量化的,但是llvm生成的ir没有向量化
用clang的 -Rpass-missed=loop-vectoreze -Rpass-analysis=loop-vectorize
分析得到没有循环优化
然后看llvm的代码,编译debug版本看打印
PHI node检测有问题
看checker的条件
inttoptr <=> ptrtoint 逻辑有问题?
这里我就跟不太上了,llvm不了解。得看一下llvm相关的东西
作者做了个去掉的patch,验证,结果向量化了
深层问题 SROA 已经提bug修了
回到标题,零成本抽象是牛逼的,但是需要编译器来达成这个优化
编译器有没有保证的最低程度优化?没。所以需要了解这个东西,了解优化程度 作者的建议就是看ir结果,对比,跑omit, analyze,以及了解c 的llvm ir。简单
ref
- https://github.com/serge-sans-paille/pythran
- https://www.bilibili.com/video/BV1pJ411w7kh?p=154
- PPT没找到
todo
看看llvm的资料