2012-10-23 18 views
9

Zastanawiam się dlaczego LLVM nie trafia do optymalizacji następujący kod IR (używając PassManagerBuilder z optymalizacją ustawiony na „3”, a także za pomocą LLVM jest "opt Tool):LLVM Struct Powrót Optymalizacja

%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) 

oczekiwany kod to:

%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) 

Czy obecnie nie ma dostępnych optymalizacji do obsługi tej sprawy? Czy nie mogę produkować (ten kod jest generowany z rozwijanego interfejsu) odpowiedniej IR, która pozwoliłaby na optymalizację?

Zanim to zasugeruję, nie mogę wytworzyć kodu, który zwraca wartość, ponieważ funkcje te muszą być możliwe do wywołania z innych modułów/bibliotek, które nie znają rozmiaru lub zawartości "GenericStruct" (i będą lokalnie deklarować "TestClass" "as" struct opaque ").

+0

Czy nie zapomniałeś '% 0' w sygnaturze' @ makeGenericStructOuter'? – arrowd

+2

Zastanawiam się również nad tym, ponieważ poprawiłoby to jakość kodu generowanego przez Emscripten w kilku przypadkach. Oto zatwierdzenie, w którym usunięto odpowiednią przepustkę optymalizacji LLVM: http://llvm.org/viewvc/llvm-project?view=revision&revision=129314 –

Odpowiedz

1

Jeśli uważasz, że optymalizacja powinna mieć miejsce, zgłoś błąd w LLVM Bug Tracker. Programiści LLVM są zazwyczaj bardzo szczęśliwi i zainteresowani, gdy zgłaszane są problemy z optymalizacją.