2016-02-12 3 views
5

: Ich bin in LLVM und habe Value und Instruction Klassen geprüft. Ich sehe, dass diese beiden Klassen die Methoden uses und user haben. Was sind die Unterschiede zwischen ihnen? Kann ich unter Verwendung dieser Methoden anhand von this post feststellen, ob ein Befehl einen Wert erzeugt?LLVM: Unterschied zwischen „Nutzungen“ und „Benutzer“ in Instruction oder Wertklassen

tnx.

+0

Beachten Sie, dass nicht jeder Benutzer eine Anweisung ist, d. H. Ein Benutzer kann auch ein Ausdruck sein. – benben

Antwort

2

ich gefunden habe, diese Antwort in Buch "mit LLVM Core-Bibliotheken Getting Started".

Wir haben immer noch nicht den leistungsstärksten Aspekt der LLVM IR vorgestellt (aktiviert durch das SSA-Formular): die Wert und Benutzerschnittstellen; Mit diesen können Sie einfach die Nutz-Def- und Def-Use-Ketten navigieren. In der LLVM speicherinternen IR bedeutet eine Klasse, die von Wert erbt, dass sie ein Ergebnis definiert, das von anderen verwendet werden kann, während eine Unterklasse von Benutzer bedeutet, dass diese Entität eine oder mehrere Value-Schnittstellen verwendet. Funktion und Instruction sind Subklassen von Wert und Benutzer, während BasicBlock eine Unterklasse nur Wert ist. Um dies zu verstehen, lassen Sie sich diese beiden Klassen in der Tiefe analysieren:

• Der Wert-Klasse definiert die use_begin() und use_end() Methoden zu ermöglichen Sie durch Benutzer zu durchlaufen, eine einfache Möglichkeit bietet seine def-use Kette zugreifen . Für jede Value-Klasse können Sie auch über die Methode getName() auf ihren Namen zugreifen. Dies modelliert die Tatsache, dass jedem LLVM-Wert ein eindeutiger Identifizierer zugeordnet sein kann. Zum Beispiel kann% add1 das Ergebnis eines add-Befehls identifizieren, BB1 kann einen Basisblock identifizieren und myfunc kann eine Funktion identifizieren. Value hat auch eine leistungsfähige Methode namens replaceAllUsesWith (Value *), , die durch alle Benutzer dieses Wertes navigiert und sie durch einen anderen Wert ersetzt. Dies ist ein gutes Beispiel dafür, wie Sie mit dem SSA-Formular einfach Anweisungen ersetzen und schnelle Optimierungen schreiben können. Sie können die vollständige Schnittstelle unter LLVM Value Class anzeigen.

• Die User-Klasse verfügt über die Methoden op_begin() und op_end(), mit denen Sie schnell auf alle von ihr verwendeten Value-Schnittstellen zugreifen können ( ). Beachten Sie, dass diese die Verwendung-Def-Kette darstellt. Sie können auch eine Hilfsmethode mit dem Namen replaceUsesOfWith (Wert * Von, Wert * Bis) verwenden, um alle verwendeten Werte zu ersetzen. Sie können die vollständige Schnittstelle unter LLVM User Class anzeigen.

4

Da Instruction von Value abgeleitet ist, erbt es beide Funktionen users und uses. Der Unterschied ist, dass ein Benutzer von Value den Value als einen seiner Operanden hat.

Wenn Sie uses rufen erhalten Sie eine Liste aller Use Instanzen einen Verweis von der Value zu jedem der Benutzer des jeweiligen Value halten. Wenn Sie users anrufen, erhalten Sie eine Liste von User direkt. Der folgende Code zeigt, wie Sie users und uses verwenden können.

for(auto U : V->users()){ // U is of type User* 
    if (auto I = dyn_cast<Instruction>(U)){ 
     // an instruction uses V 
    } 
} 

Sie users als Verknüpfung sehen können, weil Sie das gleiche mit Gebrauch tun können:

for(auto U : V->uses()){ // U is of type Use* 
    if (auto I = dyn_cast<Instruction>(U.getUser())){ 
     // an instruction uses V 
    } 
} 

Häufig ist es genug users zu verwenden, um alle Abhängigkeiten eines Value zu bekommen.

wurden von Value verwendeten Werte sind die Operanden. Diese Abhängigkeitsrichtung ist nicht Teil einer Verwendungsliste von Value.

auf die zweite Frage in Bezug auf Anweisungen, um einen Wert produzieren: Es gibt keine Garantie dafür, dass das Fehlen von Anwendungen ergibt sich aus keinen Wert erzeugen. Eine dead-Anweisung kann einen Wert erzeugen und hat keine Benutzer. Darüber hinaus kann eine Institution, die keinen Wert erzeugt, von Metadaten verwendet werden.

+0

Also, Uses gibt alle Anweisungen/Werte, von denen der jeweilige Wert abhängt und Benutzer geben alle Anweisungen/Werte, die von diesem bestimmten Wert abhängen, richtig? – Carlos

+0

Ich habe meine Antwort bearbeitet. Hoffentlich ist es jetzt klarer. –

+0

Benutzer erhalten die Anweisungen und verwendet die bestimmten Werte. Wenn Sie eine "Variable" (Wert) durch eine andere ersetzen wollen, müssen Sie jede Verwendung ersetzen. –

Verwandte Themen