2012-10-23 4 views
9
내가 (LLVM의 '옵트'도구를 사용하여도 '3'으로 설정 최적화와 PassManagerBuilder을 사용하고) LLVM은 다음 IR 코드를 최적화하지 못하는 이유를 궁금하네요

:LLVM 구조체 반환 최적화

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

예상 코드 :

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

현재이 케이스를 처리하는 데 사용할 수있는 최적화가 없습니다. 아니면 (이 코드는 개발중인 프런트 엔드에서 생성 된) 최적화를 허용 할 올바른 IR을 생산하지 못하고 있습니까?

제안되기 전에 'GenericStruct'의 크기 나 내용을 모르는 다른 모듈/라이브러리에서 호출 할 수 있어야하므로 값으로 반환되는 코드를 생성 할 수 없습니다 (그리고 'TestClass '로'struct opaque ').

+0

'@ makeGenericStructOuter' 서명에'% 0'을 잊지 않았습니까? – arrowd

+2

몇 가지 경우에 Emscripten이 생성 한 코드의 품질을 향상시킬 수 있기 때문에 이에 대해서도 궁금합니다. 관련 LLVM 최적화 단계가 제거 된 커밋은 다음과 같습니다. http://llvm.org/viewvc/llvm-project?view=revision&revision=129314 –

답변

1

최적화가 수행되어야한다고 생각하면 LLVM Bug Tracker에 버그를 신고하십시오. LLVM 개발자는 누락 된 최적화 기회를보고 할 때 대개 매우 행복하고 관심이 있습니다.