Wie mit Alias-Register in Datenfluss-Analyse unter Verwendung von SSA Form umgehen? (Beispielsweise EAX / AX / AH / AL in x86)
-
01-10-2019 - |
Frage
Für exmaple:
Wie stellen die folgenden x86 in SSA Form :
xor eax, eax
inc ax
Durch einige Pseudo-Funktionen einzuführen, ich komme mit:
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)
Aber ich denke, es ist zu viel ausführliche
Lösung
Verwenden Sie Ihre Schreibweise:
- EAX @ 0 = ... was auch immer es schon mal hier war ...
- EAX @ 1 = 0
- Axt @ 2 = ax @ 1 + 1
Weil eax ax enthält, gibt es einen impliziten Schritt zwischen 2 und 3
- EAX @ 0 = ...
- EAX @ 1 = 0
- ax @ 1 = 0 (weil ax nicht ungleich Null sein kann, wenn EAX null)
- Axt @ 2 = ax @ 1 + 1
Schritt 2, weil jede Zahl mit sich selbst EXOR'ed 0 ... EAX @ 0 ist an dieser Stelle tot, und damit EAX @ 1 umbenannt werden kann (unter Verwendung von ebx als Umbenennung so ist es lesbar, natürlich würden Sie einen virtuellen verwenden Register, keine echte):
- --- gelöscht, EAX nicht mehr relevant
- ebx @ 0 = 0
- bx @ 0 = 0
- bx @ 1 = bx @ 0 + 1
Sie könnten dann beachten, dass, weil Schritt 3 eine konstante Funktion ist, so ist Schritt 4 (Hinzufügen einer Konstanten zu einer Konstante) und die beiden zusammenzudrücken (d.h. Konstantenfaltung)
- - gelöscht, EAX nicht mehr relevant
- ebx @ 0 = 0
- bx @ 0 = 1
Wenn die oberen 16 Bits von ebx nicht dominieren etwas darunter, man könnte auch löschen Schritt 2.