2016-02-12 25 views
5

Sono nuovo in LLVM e ho controllato le classi Value e Instruction. Vedo che entrambe queste classi hanno i metodi uses e user. Quali sono le differenze tra loro? Inoltre, per quanto riguarda this post, posso utilizzare questi metodi per determinare se un'istruzione produce un valore?LLVM: differenza tra "usi" e "utente" nelle classi Istruzione o Valore

tnx.

+0

Nota che non tutti gli utenti sono un'istruzione, ad esempio, un utente può essere anche un'espressione. – benben

risposta

2

Ho trovato questa risposta nel libro "Guida introduttiva al LLVM Core Libraries".

Non abbiamo ancora presentato l'aspetto più potente dell'LLVM IR (abilitato da il modulo SSA): il valore e le interfacce utente; questi ti consentono di navigare facilmente nelle catene use-def e def-use di . Nell'IR LMVM in memoria, una classe che eredita dal valore significa che definisce un risultato che può essere utilizzato da altri, mentre una sottoclasse di Utente indica che questa entità utilizza una o più interfacce Valore. Funzione e Le istruzioni sono sottoclassi sia di Valore che di Utente, mentre BasicBlock è una sottoclasse di appena Valore. Analizziamo queste due classi in profondità:

• La classe Value definisce i metodi use_begin() e use_end() per consentire a di iterare attraverso gli utenti, offrendo un modo semplice per accedere alla sua catena di utilizzo . Per ogni classe Value, è anche possibile accedere al suo nome tramite il metodo getName() . Ciò spiega il fatto che a qualsiasi valore LLVM può essere associato un identificatore distinto . Ad esempio,% add1 può identificare il risultato di un'istruzione add , BB1 può identificare un blocco di base e myfunc può identificare una funzione. Value ha anche un potente metodo chiamato replaceAllUsesWith (Value *), , che consente di navigare tra tutti gli utenti di questo valore e di sostituirlo con lo di un altro valore. Questo è un buon esempio di come il modulo SSA consente di facilmente sostituire le istruzioni e scrivere ottimizzazioni veloci. È possibile visualizzare l'interfaccia completa allo LLVM Value Class.

• La classe Utente ha i metodi op_begin() e op_end() che consente a di accedere rapidamente a tutte le interfacce Valore che utilizza. Si noti che questo rappresenta la catena use-def. È anche possibile utilizzare un metodo di supporto chiamato replaceUsesOfWith (Valore * Da, Valore * A) per sostituire uno dei valori di utilizzati. È possibile visualizzare l'interfaccia completa a LLVM User Class.

4

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.

+0

Quindi, Uses fornisce tutte le istruzioni/i valori che dipendono dal valore specifico e gli utenti forniscono tutte le istruzioni/i valori che dipendono da quel particolare valore, giusto? – Carlos

+0

Ho modificato la mia risposta. Speriamo sia più chiaro ora. L'utente –

+0

ottiene le istruzioni e utilizza i valori specifici. Quando vuoi sostituire una 'variabile' (valore) con un'altra, devi sostituire ogni uso. –