2012-03-14 2 views
5

Ho la lima IR followint LLVMCancellare una prima istruzione in Basic Block da LLVM IR?

%1 = load i32* %i, align 4 
    %2 = load i32* %j, align 4 
    %3 = icmp sgt i32 %1, %2 
    br i1 %3, label %4, label %6 

; <label>:4          ; preds = %0 
    %5 = load i32* %i, align 4 
    store i32 %5, i32* %k, align 4 
    br label %6 

; <label>:6          ; preds = %5, %0 
    ret i32 0 

In esso sto primo caricamento vairable "i" in% 1 e "j" variabile in% 2 allora io sto paragonando il maggiore di condizione che è (i> j). Sulla base di ciò esiste un ramo per etichettare 4 o etichetta 6. Il mio problema è che ci sono due istruzioni di caricamento per la variabile "i" una nel primo blocco di base e altre nel 2o blocco di base. Qui voglio rimuovere la seconda istruzione di caricamento. Per quello sto facendo come quando arrivo alla seconda istruzione di caricamento per la variabile "i" Sto sostituendo tutti gli usi della 2a istruzione con la prima istruzione, quindi sto cancellando l'istruzione corrente, cioè 2a. Qui non riesco a impostare il puntatore iteratore dell'istruzione. Non desidero impostare le istruzioni successive (memorizza i32% 5, i32 *% k, allinea 4). C'è un altro modo? Se lo sai per favore fammelo sapere.

+0

Non capisco la tua domanda. Ma sono abbastanza sicuro che i passaggi successivi dovrebbero essere in grado di rimuovere facilmente quel carico per te, quindi non mi preoccuperei molto. Se hai un valido motivo per eliminare il carico, ti preghiamo di riaffermare la domanda, perché non sono in grado di capire qual è il tuo problema. – CAFxX

+0

Il mio problema è che dopo aver cancellato la seconda istruzione di caricamento, voglio impostare l'iteratore di istruzioni in modo tale che nell'iterazione successiva debba raggiungere (memorizzare i32% 5, i32 *% k, allineare 4) perché in ciclo sto incrementando l'iteratore di istruzioni . – damrudhard

+0

Perché non ottenere semplicemente un nuovo iteratore chiamando 'BB-> begin()' immediatamente dopo 'inst-> eraseFromParent()'? – CAFxX

risposta

10

Se ho capito bene, tutto ciò che serve è solo per cancellare un'istruzione e continuare a scorrere il codice. Se è vero, dare un'occhiata a questo esempio dal DeadInstElimintation passaggio (che vive in lib/Transforms/Scalar/DCE.cpp):

virtual bool runOnBasicBlock(BasicBlock &BB) { 
    bool Changed = false; 
    for (BasicBlock::iterator DI = BB.begin(); DI != BB.end();) { 
    Instruction *Inst = DI++; 
    if (isInstructionTriviallyDead(Inst)) { 
     Inst->eraseFromParent(); 
     Changed = true; 
     ++DIEEliminated; 
    } 
    } 
    return Changed; 
} 

La cosa interessante da notare è come l'iteratore viene incrementato. Lo DI++ non viene eseguito all'interno dell'ultima clausola di for, ma piuttosto separatamente, con l'attuale DI assegnato a Inst. Ciò garantisce che anche se si cancella Inst, DI punti già all'istruzione successiva in modo che il ciclo continui a scorrere sulle istruzioni successive.

+0

Ho ottenuto una soluzione da CAFxX. Grazie anche a te per il tuo aiuto. – damrudhard

+0

@damrudhard: l'impostazione del nuovo iteratore su 'BB-> begin()' funzionerà solo se la nuova istruzione è la prima nel blocco di base. Altrimenti tornerai indietro con alcune istruzioni. Se questo va bene per te, allora nessun problema. Penso che la soluzione indicata nella mia risposta sia più generale, comunque. –

+0

In altri casi sto impostando l'iteratore di istruzioni sull'istruzione precedente in modo che nella prossima iterazione indicherà l'istruzione subito dopo quella cancellata. – damrudhard