2016-10-04 3 views
1

https://idea.popcount.org/2013-07-24-ir-is-better-than-assembly/IR LLVM Form vs Montage

Hallo,

Ich greife eine Idee von IR aber ein Problem ist nicht klar.

Warum ist die IR besser als eine Baugruppe? Ich habe gelesen, was der Autor darüber gesagt hat, und ich sehe, dass es im Allgemeinen im Sinne der Abstraktion höher ist. Es erlaubt eine Typprüfung. Aber ich möchte über etwas anderes fragen:

Insbesondere LLVM IR ist eine Art Zwischenform. Aber, warum wird die Optimierung auf diesem Formular durchgeführt? Ist es nicht möglich, den Montageoutput zu optimieren? Tatsächlich ist es möglich? Warum ist der LLVM IR so großartig, ihn in diesem Kontext zu verwenden? Ich vermute, dass die Analyse der IR Form einfach einfacher und "mehr möglich" ist.

+2

Sicher, Sie könnten Assembly optimieren (Compiler tun.) LLVM fragt, warum schreiben Optimierer für alle Plattformen, wenn Sie einen Optimierer für die Zwischendarstellung schreiben und dann auf Ihre Plattform übersetzen können (Montageanleitung?) – Chris

+1

@ChrisStathis: die meisten Compiler * nicht * Assembly optimieren, sie optimieren ihre eigene interne Darstellung, in der Regel eine SSA-Darstellung des Verhaltens der Quelle. Die Eingabe von asm als Eingabe führt zu dem schwierigen Problem, herauszufinden, welche Werte in den Registern oder im Speicher als Eingaben für entfernte Teile des Programms übrig sind und welche nur tote Provisorien sind. Ein asm-Optimierer kann nicht davon ausgehen, dass sich jede Funktion auf die Standard-ABI-/Aufrufkonvention zum Weiterleiten von Daten zwischen Codeblöcken beschränkt. –

Antwort

2

So habe ich Ihre Frage gelesen: Warum übersetzen Compiler keine schnelle Übersetzung in eine nicht optimierte Baugruppe und optimieren diese dann.

Die Optimierung der Montage unterliegt einigen ernsthaften Einschränkungen. Wie Chris Stathis bereits erwähnt hat, ist ein Assembly Optimizer auf eine einzige Plattform beschränkt. Der IR-Optimierer ist unabhängig von der Plattform.

Außerdem sind zu viele hardwarespezifische Details in der Baugruppe codiert. Compiler-Optimierungen sind bereits schwierig, daher gibt es keinen Grund, dieses Problem zu komplizieren, indem irrelevante Hardware-Details hinzugefügt werden. Zum Beispiel haben Sie im Assemblercode eine begrenzte Anzahl von Registern bestimmter Größe. In IR können Sie beliebig viele Register verwenden. Es gibt keinen Grund, Ihren Optimierungsalgorithmus komplizierter zu machen, indem er gezwungen wird, Hardware-Register zu verfolgen.

LLVM IR hat einige Vorteile gegenüber anderen Compiler-IRs, die ich kenne. Ein wichtiger Vorteil ist, dass LLVM IR in SSA-Form vorliegt. Das bedeutet, dass eine Variable nur einmal definiert werden kann und ihr Wert sich niemals ändern kann. Dies vereinfacht Compiler-Optimierungen in einem sehr signifikanten Ausmaß.

Mit Blick auf LLVM IR Handbuch kann es nicht offensichtlich sein, dass es in SSA-Form ist. Wenn Sie sich jedoch einmal die Datenstrukturen ansehen, die zur Darstellung der IR in der LLVM-Bibliothek verwendet werden, werden Sie feststellen, dass Sie in LLVM IR keinen Nicht-SSA-Code schreiben können.