Tun Sie es einfach nicht. LLVM DAG wurde speziell für die Registermaschinen entwickelt und ist für die Zusammenstellung einer Stapelmaschine von geringem Wert. Sie benötigen stattdessen ein benutzerdefiniertes Back-End.
Ein Ansatz war ich für ein ähnliches Problem mit (LLVM IR -> Stack weichen Kern auf einem FPGA) folgt:
1) Aus SSA (reg2mem)
2) Bauen Sie sich ein Zwischen Baum Repräsentation (dh alle Single-Use-Registerzuweisungen in Bäume quetschen, wenn es die Reihenfolge erlaubt). Dies ist der größte Optimierungsengpass, je weniger Registerzuordnungen Sie hinterlassen, desto besser.
3) "Registerzuweisung" für die verbleibenden Register, die alle als Stack-allokierte Variablen dargestellt werden (hoffe, dass Ihre Stack-Maschine ISA dies zulässt).
4) Übersetzen Sie den Baum direkt, ohne irgendeine Anweisung Auswahl (Sie können es auf LLVM IR-Ebene statt mit intrinsics und einem benutzerdefinierten instcombine pass).
EDIT: Es ist nicht einfach, dies mit dem DAG-basierten Backend zu tun, es sollte nie so verwendet werden.
Die nächste Sache, über die ich nachdenken kann, ist die Verwendung des DAG-Backends, um einen Zwischenregister-Maschinencode zu erzeugen, und dann einen Post-Processing-Durchlauf zu verwenden, um die Befehle nach Möglichkeit neu zu ordnen und sonst den Stack zugewiesenen Variablen zu injizieren. D.h., sie repräsentieren jeden der Stapelmaschinenbefehle als einen Pseudobefehl mit 1 oder 2 Registerargumenten und 1 Registerergebnis.
[Verwandte Frage] (http://stackoverflow.com/questions/6203323/llvm-backend-for-stack-based-machine) – KolesnichenkoDS