如何使用SSA表单处理数据流分析中的别名寄存器? (例如x86中的EAX / AX / AH / AL)

时间:2010-04-23 08:32:26

标签: compiler-construction x86 alias dataflow ssa

例如:

如何在SSA form中表示以下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)

但我认为这太冗长了

1 个答案:

答案 0 :(得分:2)

使用您的符号:

  1. eax @ 0 = ......不管在此之前是什么......
  2. eax @ 1 = 0
  3. ax @ 2 = ax @ 1 + 1
  4. 因为eax包含ax,所以在2到3之间有一个隐含的步骤

    1. eax @ 0 = ...
    2. eax @ 1 = 0
    3. ax @ 1 = 0(因为如果eax为零,ax不能为非零)
    4. ax @ 2 = ax @ 1 + 1
    5. 步骤2因为任何与自身xor的数字都是0 ... eax @ 0在那时已经死了,因此可以重命名eax @ 1(使用ebx作为重命名以便它可读;显然你会使用虚拟注册,而不是真实的):

      1. ---删除,eax不再相关
      2. ebx @ 0 = 0
      3. bx @ 0 = 0
      4. bx @ 1 = bx @ 0 + 1
      5. 然后你可以注意到,因为第3步是一个常数函数,所以步骤4(向常数添加常数)并将两者压缩在一起(即常数折叠)

        1. - 删除,eax不再相关
        2. ebx @ 0 = 0
        3. bx @ 0 = 1
        4. 如果ebx的高16位不支配低于此值的任何内容,您也可以删除第2步。