2014-03-05 10 views
5

Für eine einfache llvm IR als:Verständnis llvm SelectionDAG

define i32 @test(i32 %X, i32 %Y) { 
    %Z = udiv i32 %X, %Y 
    ret i32 %Z 
    } 

der SelectionDAG Graph ist komplexer, als ich dachte:

image of SelectionDAG graph

Warum CopyFromReg benötigt wird, schließen Sie, warum nicht vreg0 und vreg1 zu udiv direkt?

Wie soll ich die Grafik lesen, von EntryToken bis GraphRoot oder die Gegenrichtung?

Antwort

1

Eingabe-Token ist der Eintrag für die Funktion, es wird verwendet, um alle Operationen, die Nebenwirkungen haben, zu "verketten" (der blaue Link). Ich denke, dass die CopyFromReg und CopyToReg hier sind, um die Aufrufkonventionen für die Funktion zu implementieren.

+0

Jeder Beweis, dass EntryToken der Eintrag der Funktion ist? Ich habe eine Frage dazu, da SelectionDAG für einen Basisblock ist, nicht funktioniert. – Thomson

+0

Nun, in dem gegebenen Beispiel gibt es sowieso nur einen Basisblock in der Funktion. Ich verstand seine Frage ebenso wie das Eintritts-Token den Anfang vom Ende, als er fragte "Wie soll ich den Graphen lesen?". – Joky

2

Funktionsargumente Konvention spezifische fordern, und sie sind in den Bauprozess von SelectionDAG (SelectionDAGISel::SelectAllBasicBlocks Anrufe SelectionDAGISel::LowerArguments), die architekturspezifischen LowerArguments in der Regel gesenkt schafft CopyFromReg die Argumente in virtuellen Register als SDValue und Kette der CopyFromReg zu vertreten SelectionDAG.

Die zusätzliche CopyFromReg angebracht ist, die Kette zu EntryToken, und Speichern der anderen Information zu erhalten, die wie DebugLoc nicht als Teil RegisterSDNode, ausgelegt ist.

Hier ist ein Beispiel, dass CopyFromReg nicht angebracht ist (blau gepunktete Pfeile fehlen):

enter image description here

-1

http://llvm.org/docs/doxygen/html/ISDOpcodes_8h_source.html Sie können hier die Referenz aller Label finden

CopyToReg
CopyToReg - Dieser Knoten hat drei Operanden: eine Kette, eine Registernummer, die auf diesen Wert gesetzt wird, und einen Wert.

CopyFromReg
CopyFromReg - Dieser Knoten zeigt an, dass der Eingabewert ein virtuelles oder physisches Register ist, das außerhalb des Bereichs dieses SelectionDAG definiert ist. Das Register steht über das RegisterSDNode-Objekt zur Verfügung.

http://llvm.org/docs/doxygen/html/namespacellvm_1_1ISD.html#a22ea9cec080dd5f4f47ba234c2f59110a93bc27ca4d9e211c54b0d9efb660f080 Handbuch.

P.S Es tut mir leid, ich bin ein sehr neuer Benutzer.

+0

Anstatt nur einen Link zu posten, sollten Sie die relevanten Informationen aus diesem Link zitieren. Dies stellt sicher, dass die Information nicht verloren geht, wenn die Verbindung tot wird. –