【问题标题】:How to deal with alias registers in data-flow analysis using SSA form? (e.g. EAX/AX/AH/AL in x86)如何使用 SSA 形式处理数据流分析中的别名寄存器? (例如 x86 中的 EAX/AX/AH/AL)
【发布时间】:2010-04-23 08:32:25
【问题描述】:

例如:

如何在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)

但我认为它太冗长了

【问题讨论】:

  • “SSA 表格”是什么意思?
  • 对简化这个没有任何建议,但我很好奇它在哪里被使用。您是否正在尝试优化/翻译现有的编译应用程序? ***** 看上面的例子,你不是需要在每一步都保持 eax、ax、al 和 ah 同步吗?例如,如果下一条指令是一条路径使用 ax 而另一条使用 eax 的条件分支,该怎么办?然后,您需要更加详细地更新此寄存器的所有版本!
  • @Gautham Ganapathy:我正在反编译(高度混淆)二进制文件。对于分支,SSA 引入了 phi 功能,详见 wiki。

标签: compiler-construction x86 alias dataflow ssa


【解决方案1】:

使用您的符号:

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

【讨论】:

  • 是的,你说得对。我试图避免冗长,但冗长可能是 SSA 的特性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2021-06-12
  • 1970-01-01
  • 2016-09-11
相关资源
最近更新 更多