2012-10-23 9 views
9

mi chiedo perché LLVM non riesce ad ottimizzare il seguente codice IR (utilizzando il PassManagerBuilder con l'ottimizzazione impostata su '3', e anche utilizzando di LLVM 'opt' utensile):LLVM Struct ritorno ottimizzazione

%GenericStruct = type { i32 } 

define void @makeGenericStructOuter(%GenericStruct* noalias nocapture sret) { 
entry: 
    %1 = alloca %GenericStruct 
    call void @makeGenericStructInner(%GenericStruct* %1) 
    %2 = load %GenericStruct* %1 
    store %GenericStruct %2, %GenericStruct* %0 
    ret void 
} 

declare void @makeGenericStructInner(%GenericStruct* noalias nocapture sret) 

Il il codice previsto è:

%GenericStruct = type { i32 } 

define void @makeGenericStructOuter(%GenericStruct* noalias nocapture sret) { 
entry: 
    call void @makeGenericStructInner(%GenericStruct* %0) 
    ret void 
} 

declare void @makeGenericStructInner(%GenericStruct* noalias nocapture sret) 

Non ci sono semplicemente ottimizzazioni attualmente disponibili per gestire questo caso? O non riesco a produrre (questo codice è generato da un front-end che sto sviluppando) l'IR giusto che consentirebbe l'ottimizzazione?

Prima che venga suggerito, non riesco a produrre codice che ritorni per valore poiché queste funzioni devono essere richiamabili da altri moduli/librerie che non conoscono la dimensione o il contenuto di 'GenericStruct' (e dichiarerebbero localmente 'TestClass 'come' struct opaque ').

+0

Non hai dimenticato un '% 0' nella firma' @ makeGenericStructOuter'? – arrowd

+2

Mi chiedo anche questo, perché migliorerebbe la qualità del codice generato da Emscripten in diversi casi. Ecco il commit in cui è stato rimosso un passaggio di ottimizzazione LLVM rilevante: http://llvm.org/viewvc/llvm-project?view=revision&revision=129314 –

risposta

1

Se ritieni che l'ottimizzazione debba aver luogo, segnala un errore in LLVM Bug Tracker. Gli sviluppatori di LLVM di solito sono molto felici e interessati quando segnalano opportunità di ottimizzazione perse.