5

Ich habe auf lokale Optimierung Compiler-Techniken gelesen, aber ich bekomme nicht, wie sie implementiert werden. Die Idee ist, dass der Optimierer jedes Mal ein "Fenster" des Codes betrachtet und Muster irgendwie erkennt und durch optimierte Versionen ersetzt.Guckloch Optimierungsmuster

Meine Frage ist, wie entdeckt man diese Muster? (Nehmen wir an, Ihre Plattform ist eine VM, die Assemblercode für einen erfundenen Computer ausgibt, wie Schocken's Hack).

Wird der Code tatsächlich manuell geprüft (mithilfe von Steuerungsflussdiagrammen oder DAGs oder was auch immer) und alle identifizierten Muster werden gesammelt und in den Optimierer codiert? Oder gibt es einen automatischen Weg?

Zum Beispiel füttern Sie den zu optimierenden Code in einem Analysator und spuckt diese Muster aus. Wenn ja, wie kann man damit anfangen?

+0

Ich denke, das wird allgemein 'Inline-Caching' genannt. Sie werden viel Literatur für aktuelle JavaScript-Engines finden, die diese Technik zur Laufzeit verwenden. Siehe http://wingolog.org/archives/2012/05/29/inline-cache-applications-in-scheme. – leppie

+0

Das ist interessant, das erste Mal, dass ich darauf stoße. Ich dachte generell an Operationen wie Kraftabbau, konstante Auswertung, Kontrollfluss opt., Etc .. – gfountis

+0

Dies scheint auf "Laufzeit" ausgerichtet zu sein ja? Oder wird es verwendet, um engeren Assemblercode zu generieren? – gfountis

Antwort

3

Bei den klassischen Peephole-Optimierungen geht es nicht um die Reduzierung der Stärke und die anderen Dinge, die Sie nennen. Sie sind 2-3 Befehlsfolgen wie zum Beispiel

BRANCH FALSE $1 
BRANCH $2 
$1: 

, die

reduziert werden kann
BRANCH TRUE $2 

Sequenzen wie dies in naiven Codegeneratoren wie kommen mit Single-Pass-Compiler entstehen können, die nicht tun generieren ASTs, wie einige COBOL-Compiler, an denen ich gearbeitet habe.

+0

Ich sehe, aber wie kann man diese Sequenzen entdecken? Gibt es eine Liste von veröffentlichten Mustern? Komponieren die Leute Zufallscode und beginnen sie dann selbst zu suchen? – gfountis

+0

War das nicht auch ein Kontrollfluss-Optimierungsbeispiel?=) – gfountis

+1

@gfountis Sicher war es, aber die Compiler, von denen ich spreche, machen keine Durchflussanalyse. Die Peephole-Sequenzen wären für jeden anständigen Assembly-Programmierer offensichtlich, wenn es noch welche gibt. Sie überprüfen nur die Ausgabe und denken "hmm ...". Das ist alles in den üblichen Büchern. – EJP

1

Es hängt von Ihnen ab, ob Sie Ihren eigenen Analysator schreiben oder die vorhandenen verwenden. In beiden Fällen überprüft Ihr Analysator den Code, bis er nicht mehr optimiert ist. Wenn Sie ein Beispiel von GCC nehmen, hat es spezifische Durchläufe für die Optimierung. Diesen Pässen, die nacheinander ausgeführt werden und Ihren Code optimieren, wird der Zwischencode Ihres Programms übergeben. Auch jeder Durchlauf kann mehr als einmal ausgeführt werden.
Wenn Sie wirklich durchgehen möchten, wie diese Optimierungen geschrieben werden, gehen Sie einfach passes.h Datei in GCC.

+0

Also, im Fall der Optimierung für nicht-x86-Code-Generierung (für eine Spielzeug-Plattform) ist die einzige Möglichkeit, entweder schreiben Sie Ihre eigenen Analysator, oder tun Sie es mit "Hand" richtig? – gfountis

+0

Die Frage ist, Peephole-Optimierung, und Sie haben es nicht beantwortet. – EJP