Как справиться с Alias Registers в анализе потока данных с использованием формы SSA? (например, EAX / AX / AH / AL в X86)
-
01-10-2019 - |
Вопрос
Для 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)
Но я думаю, что это слишком много многословных
Решение
Использование вашей записи:
- EAX @ 0 = ... Что бы это было раньше здесь ...
- EAX @ 1 = 0
- AX @ 2 = AX @ 1 + 1
Потому что EAX содержит топор, есть неявный шаг между 2 и 3
- EAX @ 0 = ...
- EAX @ 1 = 0
- ax @ 1 = 0 (потому что топор не может быть ненулевым, если EAX равен нулю)
- AX @ 2 = AX @ 1 + 1
Шаг 2, потому что любое число XOR'ело с собой равно 0 ... EAX @ 0 мертв в этой точке, и, таким образом, EAX @ 1 можно переименовать (с помощью EBX как переименования, так что это читается; очевидно, вы будете использовать виртуальный регистр, а не одиноки):
- --- Удалили, EAX больше не актуальны
- EBX @ 0 = 0
- bx @ 0 = 0
- bx @ 1 = bx @ 0 + 1
Затем вы можете обратить внимание, что, поскольку шаг 3 является постоянной функцией, поэтому является шагом 4 (добавляя постоянную в постоянную) и сжимайте два вместе (то есть постоянная складывание)
- - Удалено, EAX больше не актуальны
- EBX @ 0 = 0
- bx @ 0 = 1
Если верхние 16 битов EBX не доминируют в этом ниже этого, вы также можете удалить шаг 2.