Poiché Instruction
è derivato da Value
, eredita entrambe le funzioni users
e uses
. La differenza è che un utente di Value
ha il Value
come uno dei suoi operandi.
Quando si sta chiamando uses
si ottiene un elenco di tutte le istanze Use
in possesso di un riferimento dal Value
a ciascuno degli utenti del particolare Value
. Chiamando il numero users
si ottiene direttamente un elenco di User
. Il codice seguente mostra come usare users
e uses
.
for(auto U : V->users()){ // U is of type User*
if (auto I = dyn_cast<Instruction>(U)){
// an instruction uses V
}
}
Si può vedere users
come scorciatoia, perché si può fare lo stesso con gli usi:
for(auto U : V->uses()){ // U is of type Use*
if (auto I = dyn_cast<Instruction>(U.getUser())){
// an instruction uses V
}
}
Comunemente è sufficiente utilizzare users
per ottenere tutte le dipendenze di un Value
.
Tutti i valori utilizzati da un Value
sono gli operandi. Questa direzione di dipendenza non fa parte dell'elenco degli usi di Value
.
Alla seconda domanda relativa alle istruzioni che producono un valore: non vi è alcuna garanzia che l'assenza di utilizzi risulti dal non produrre un valore. Un'istruzione morta può produrre un valore e non ha utenti. Inoltre, un'istituzione che non produce un valore può essere utilizzata dai metadati.
fonte
2016-02-13 18:55:15
Nota che non tutti gli utenti sono un'istruzione, ad esempio, un utente può essere anche un'espressione. – benben