-
-
[原创]llvm: InstSimplifyPass
-
-
[原创]llvm: InstSimplifyPass
简化和移除冗余的指令
依旧从入口函数开始:
来到 runImpl:
InstSimplifyPass 的核心逻辑相比 DCEPass 只是多了一个调用 simplifyInstruction 尝试简化指令, 然后在对简化后的指令进行死代码删除.
isInstructionTriviallyDead 与 RecursivelyDeleteTriviallyDeadInstructions, 这里不在讲, 和 DCEPass 中的逻辑基本一致, 只看 simplifyInstruction 方法:
就是做了一件事: 根据 opcode 做不同的常量折叠的处理, 我们跟着 simplifyAddInst 看一下:
这些处理函数都以 simplify 开头, 而 simplifyAddInst 这个处理函数比较全面也不是很长, 所以选择了写这个, 在这些处理函数中还会调用别的处理, 这样会出现递归调用, 我调用你, 你在调用回来这种, 所以用 MaxRecurse 限制最大递归次数, 防止无限递归. 总的来说是进行模式匹配进行化简, 列出了大量的匹配.
在看一下 foldOrCommuteConstant 常量折叠:
我们就看下通用常量折叠 ConstantFoldBinaryOpOperands, 浮点常量折叠 ConstantFoldFPInstOperands 是同样要使用了 ConstantFoldBinaryOpOperands, 可以确定的是 Op0 Op1 都是常量是才会调用 ConstantFoldBinaryOpOperands:
只看 ConstantFoldBinaryInstruction:
这里的常数折叠就是对各种情况进行处理, 按优先级一一处理, 特殊值特殊处理.
实验一下:
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!