首页
社区
课程
招聘
[原创]llvm: InstSimplifyPass
发表于: 2026-3-15 10:22 682

[原创]llvm: InstSimplifyPass

2026-3-15 10:22
682

简化和移除冗余的指令

依旧从入口函数开始:

来到 runImpl:

InstSimplifyPass 的核心逻辑相比 DCEPass 只是多了一个调用 simplifyInstruction 尝试简化指令, 然后在对简化后的指令进行死代码删除.

isInstructionTriviallyDeadRecursivelyDeleteTriviallyDeadInstructions, 这里不在讲, 和 DCEPass 中的逻辑基本一致, 只看 simplifyInstruction 方法:

就是做了一件事: 根据 opcode 做不同的常量折叠的处理, 我们跟着 simplifyAddInst 看一下:

这些处理函数都以 simplify 开头, 而 simplifyAddInst 这个处理函数比较全面也不是很长, 所以选择了写这个, 在这些处理函数中还会调用别的处理, 这样会出现递归调用, 我调用你, 你在调用回来这种, 所以用 MaxRecurse 限制最大递归次数, 防止无限递归. 总的来说是进行模式匹配进行化简, 列出了大量的匹配.

在看一下 foldOrCommuteConstant 常量折叠:

我们就看下通用常量折叠 ConstantFoldBinaryOpOperands, 浮点常量折叠 ConstantFoldFPInstOperands 是同样要使用了 ConstantFoldBinaryOpOperands, 可以确定的是 Op0 Op1 都是常量是才会调用 ConstantFoldBinaryOpOperands:

只看 ConstantFoldBinaryInstruction:

这里的常数折叠就是对各种情况进行处理, 按优先级一一处理, 特殊值特殊处理.

实验一下:


[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

收藏
免费 14
支持
分享
最新回复 (3)
雪    币: 74
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
看看
6天前
0
雪    币: 416
活跃值: (513)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
666
14分钟前
0
雪    币: 3636
活跃值: (8678)
能力值: ( LV7,RANK:102 )
在线值:
发帖
回帖
粉丝
4
222
4分钟前
0
游客
登录 | 注册 方可回帖
返回