如何使用SSA表格处理数据流分析中的别名寄存器? (例如,x86中的eax/ax/ah/al)

StackOverflow https://stackoverflow.com/questions/2697172

对于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)

但是我认为这太冗长了

有帮助吗?

解决方案

使用您的符号:

  1. eax@0 = ...在这里不论...
  2. eax@1 = 0
  3. ax@2 = ax@1 + 1

由于EAX包含AX,因此在2到3之间有一个隐式的步骤

  1. eax@0 = ...
  2. eax@1 = 0
  3. AX@1 = 0(因为EAX为零,AX不能非零)
  4. ax@2 = ax@1 + 1

第2步,因为任何数字Xor's本身为0 ... eax@0在此时死亡,因此可以重命名eax@1(将EBX用作重命名,因此可以阅读;显然您会使用虚拟寄存器,而不是使用虚拟寄存器一个真实的):

  1. ---已删除,EAX不再相关
  2. EBX@0 = 0
  3. BX@0 = 0
  4. BX@1 = BX@0 + 1

然后,您可以注意,因为步骤3是一个恒定函数,因此步骤4(将常数添加到常数)并将两者压缩在一起(即常数折叠)

  1. - 已删除,EAX不再相关
  2. EBX@0 = 0
  3. BX@0 = 1

如果EBX的上部16位不主导此之下,则还可以删除步骤2。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top