compiler-construction - 溢出符号不会提高可着色性
问题描述
假设我有一些代码的中间表示:
t1 = 1
t2 = 2
t3 = 3
t4 = t1 + t2
t5 = t3 + t4
use t5
r0
最终目标是仅使用两个 ARM 寄存器和进行寄存器分配r1
,并且可能会溢出一些符号。
第一步是计算每条指令的有效范围:
t1 = 1 |
t2 = 2 | t1
t3 = 3 | t1, t2
t4 = t1 + t2 | t1, t2, t3 (this is going to become a problem)
t5 = t3 + t4 | t3, t4
use t5 | t5
注册干涉图
t2
/ \
/ \
/ \
t1----------t3
|
|
t5 t4
通过图形着色注册分配
现在在它上面使用 Chaitin 的算法来用两个寄存器给它上色:
- 查找边数少于 2 的节点
- 找到 =>
t5
- 从图表中删除它
- 将其压入堆栈:
[t5]
- 找到 =>
- 查找边数少于 2 的节点
- 找到 =>
t4
- 从图中删除它,推:
[t5, t4]
- 找到 =>
- 没有少于 2 条边的节点!(我们正在看
t1 - t2 - t3
三角形)- 随机选择一个(或具有最高程度(所有剩余节点为 2))=>
t3
(这可能是一个问题) - 从图中删除它,推:
[t5, t4, t3]
- 随机选择一个(或具有最高程度(所有剩余节点为 2))=>
- 查找边数少于 2 的节点
- 成立
t2
- 从图中删除它,推:
[t5, t4, t3, t2]
- 成立
- 推送最后一个节点:
[t5, t4, t3, t2, t1]
现在以相反的顺序分配寄存器:
- 流行符号 =>
t1
- 冲突节点:无
- 分配:
t1 => r0
- 放回
t1
图中
- 流行音乐
t2
- 冲突节点:
{t1: r0}
- 我们还有一个免费注册
- 分配:
t2 => r1
- 放回
t2
图中
- 冲突节点:
- 流行音乐
t3
- 冲突节点:
{t1: r0, t2: r1}
- 哎呀!没有更多的免费注册!
- 洒它=>
t3 => m0
- 放回
t3
图中
- 冲突节点:
- 不再需要溢出!
最终任务:
t1 -> r0
t2 -> r1
t3 -> m0 (spilled)
t4 -> r0 (or r1)
t5 -> r0 (or r1)
插入溢出物
在使用 [溢出符号
t3
] 的每个操作之前,插入t3 := load m0
在定义 [溢出符号
t3
] 的每个操作之后,插入store t3, m0
让我们这样做并计算生存范围:
t1 = 1 |
t2 = 2 | t1
t3 = 3 | t1, t2
// STORE
store t3, m0 | t1, t2, t3 (STILL 3 SYMBOLS!)
t4 = t1 + t2 | t1, t2
// LOAD
t3 = load m0 | t4
t5 = t3 + t4 | t3, t4
use t5 | t5
问题
如您所见,我们仍然有一个指令,其中三个符号相互干扰,并且我们还将获得与以前相同的 RIG。
所以溢出没有用!
现在,我暴力破解了手动溢出的可能候选对象,发现如果我们溢出任何一个符号,RIG 仍然不是2-colorable ,但如果我们溢出这些符号对中的任何一个,它就会变成 2-colorable:
t1
和t3
t2
和t3
...and 还有t1
, t2
and t3
,但只溢出两个符号看起来更简单。
实际问题
我如何决定要溢出什么?我使用什么启发式方法?我还希望算法进行全局寄存器分配,因此简单的生存范围和线性扫描分配(而不是构建 RIG)似乎是一种非常麻烦的方法。
此外,如果我在溢出的代码上重新运行相同的算法,结果将t3
再次“溢出”,即使它已经完成,所以代码将永远循环。更有什者,如果我继续溢出t3
和插入load
/store
代码,我会得到越来越多的指令 wheret1
和干扰t2
,t3
所以情况会越来越糟。
这是假设我可以t3 = load m0
,而在 ARM 上(我的目标)m0
应该首先存储在它自己的寄存器中。
解决方案
推荐阅读
- stm32 - 带有 DMA 的 STM32 I2C 传输已完成,但 DMA 中断程序不工作
- reactjs - 如何在 React TS 中为组件库创建声明文件?
- javascript - 我的 React 函数被调用了两次,第二次调用设置值不正确
- java - 为什么我得到 java.lang.NullPointerException?
- python-3.x - 使用 Pymodbus (Modbus RTU) 读取寄存器
- c# - 从包含对象的 API 调用 JSON 数组
- javascript - 创建一个二维码图像然后转换为base64
- macos - MacOS 音频:使用子图的 AUGraph API 的多个输出?
- excel - VBA:仅当系列存在时按名称着色图表系列
- python - Anaconda Navigator 无法启动任何应用程序