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

[原创]llvm: InstSimplifyPass

2026-3-15 10:22
2604

简化和移除冗余的指令

依旧从入口函数开始:

来到 runImpl:

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

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

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

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

在看一下 foldOrCommuteConstant 常量折叠:

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

只看 ConstantFoldBinaryInstruction:

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

实验一下:


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

收藏
免费 25
支持
分享
最新回复 (11)
雪    币: 76
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
看看
2026-3-16 15:25
0
雪    币: 434
活跃值: (574)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
666
2026-3-22 20:14
0
雪    币: 3731
活跃值: (8823)
能力值: ( LV7,RANK:102 )
在线值:
发帖
回帖
粉丝
4
222
2026-3-22 20:24
0
雪    币: 3786
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
666
2026-3-22 20:42
0
雪    币: 102
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
666
2026-3-23 10:10
0
雪    币: 6554
活跃值: (6450)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
66
2026-3-23 10:12
0
雪    币: 2790
活跃值: (6053)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2026-3-23 16:27
0
雪    币: 1855
活跃值: (1865)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
666
2026-3-23 16:49
0
雪    币: 1440
活跃值: (5852)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
6
2026-3-23 17:33
0
雪    币: 179
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
mark
2026-3-30 21:19
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
666
2026-4-1 22:29
0
游客
登录 | 注册 方可回帖
返回