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 ').
Non hai dimenticato un '% 0' nella firma' @ makeGenericStructOuter'? – arrowd
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 –