2012-10-23 32 views
9

Tôi đang tự hỏi tại sao LLVM thất bại trong việc tối ưu hóa mã IR sau (sử dụng PassManagerBuilder với tối ưu hóa thiết lập để '3', và cũng có thể sử dụng LLVM của 'từ chối' công cụ):LLVM Struct Return Tối ưu hóa

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

Các mã dự kiến ​​là:

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

Có đơn giản là không có tối ưu hóa nào sẵn có để xử lý trường hợp này? Hoặc tôi không sản xuất (mã này được tạo ra từ một front-end tôi đang phát triển) các IR quyền mà sẽ cho phép tối ưu hóa?

Trước khi được đề xuất, tôi không thể tạo mã trả về theo giá trị vì các hàm này phải được gọi từ các mô-đun/thư viện khác không biết kích thước hoặc nội dung của 'GenericStruct' (và họ sẽ khai báo cục bộ 'TestClass 'as' struct opaque ').

+0

Bạn không quên chữ '% 0' trong chữ ký' @ makeGenericStructOuter'? – arrowd

+2

Tôi cũng tự hỏi về điều này, bởi vì nó sẽ cải thiện chất lượng của mã tạo ra Emscripten trong một số trường hợp. Dưới đây là cam kết trong đó thẻ vượt qua tối ưu hóa LLVM có liên quan đã bị xóa: http://llvm.org/viewvc/llvm-project?view=revision&revision=129314 –

Trả lời

1

Nếu bạn tin rằng tối ưu hóa sẽ diễn ra, hãy báo cáo lỗi trong LLVM Bug Tracker. Các nhà phát triển LLVM thường rất hạnh phúc và quan tâm khi báo cáo cơ hội tối ưu hóa bị bỏ qua.