如何使用SSA表格处理数据流分析中的别名寄存器? (例如,x86中的eax/ax/ah/al)
-
01-10-2019 - |
题
对于Exmaple:
如何表示以下x86 SSA形式:
xor eax, eax
inc ax
通过引入一些伪功能,我想到:
eax@1 = eax@0 ^ eax@0
ax@1 = LOWORD(eax@1)
al@1 = LOBYTE(ax@1)
ah@1 = HIBYTE(ax@1)
hax@1 = HIWORD(eax@1)
ax@2 = ax@1 + 1
eax@2 = MAKEDWORD(ax@2, HIWORD(eax@1))
al@2 = LOBYTE(ax@2)
ah@2 = HIBYTE(ax@2)
但是我认为这太冗长了
解决方案
使用您的符号:
- eax@0 = ...在这里不论...
- eax@1 = 0
- ax@2 = ax@1 + 1
由于EAX包含AX,因此在2到3之间有一个隐式的步骤
- eax@0 = ...
- eax@1 = 0
- AX@1 = 0(因为EAX为零,AX不能非零)
- ax@2 = ax@1 + 1
第2步,因为任何数字Xor's本身为0 ... eax@0在此时死亡,因此可以重命名eax@1(将EBX用作重命名,因此可以阅读;显然您会使用虚拟寄存器,而不是使用虚拟寄存器一个真实的):
- ---已删除,EAX不再相关
- EBX@0 = 0
- BX@0 = 0
- BX@1 = BX@0 + 1
然后,您可以注意,因为步骤3是一个恒定函数,因此步骤4(将常数添加到常数)并将两者压缩在一起(即常数折叠)
- - 已删除,EAX不再相关
- EBX@0 = 0
- BX@0 = 1
如果EBX的上部16位不主导此之下,则还可以删除步骤2。
不隶属于 StackOverflow