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.
Beachten Sie, dass nicht jeder Benutzer eine Anweisung ist, d. H. Ein Benutzer kann auch ein Ausdruck sein. – benben