Как справиться с Alias ​​Registers в анализе потока данных с использованием формы SSA? (например, EAX / AX / AH / AL в X86)

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 содержит топор, есть неявный шаг между 2 и 3

  1. EAX @ 0 = ...
  2. EAX @ 1 = 0
  3. ax @ 1 = 0 (потому что топор не может быть ненулевым, если EAX равен нулю)
  4. AX @ 2 = AX @ 1 + 1

Шаг 2, потому что любое число XOR'ело с собой равно 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

Если верхние 16 битов EBX не доминируют в этом ниже этого, вы также можете удалить шаг 2.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top