Dead code elimination Pass
源码如下,发现llvm cookbook用的api挺老的,把旧的api换成新的了
1 | #include "llvm/Transforms/Scalar.h" |
测试用IR如下
1 | declare i32 @strlen(i8*) readonly nounwind |
Pass首先是遍历Instruction,寻找这4类Instruction:TerminatorInst,DbgInfoIntrinsic,LandingPadInst,mayHaveSideEffects,也就是最后有意义的指令,然后用bfs反向遍历回去,类似于污点传播的感觉,把所有有意义的指令都插入到Alive里面,最后把不在Alive里面的指令都去除掉
Inlining Transformation Pass
源码如下,因为cookbook的都是旧版本的,所以我下了源码,用lib/Transforms/IPO/InlineSimple.cpp魔改了下cookbook的例子
1 | #include "llvm/Transforms/IPO.h" |
测试IR如下
1 | define i32 @inner1() alwaysinline { |
运行效果
这个Pass是将标志了alwaysinline的函数全部都内联,其他都不内联