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 ").
Czy nie zapomniałeś '% 0' w sygnaturze' @ makeGenericStructOuter'? – arrowd
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 –