2

例如:

如何以SSA 形式表示以下 x86 :

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)

但我认为它太冗长了

4

1 回答 1

2

使用您的符号:

  1. eax@0 = ... 不管这里之前是什么...
  2. eax@1 = 0
  3. 斧头@2 = 斧头@1 + 1

因为 eax 包含 ax,所以在 2 和 3 之间有一个隐含的步骤

  1. eax@0 = ...
  2. eax@1 = 0
  3. ax@1 = 0(因为如果 eax 为零,则 ax 不能为非零)
  4. 斧头@2 = 斧头@1 + 1

第 2 步,因为任何与自身异或的数字都是 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 步。

于 2010-07-09T00:15:53.350 回答