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 ').
Bạn không quên chữ '% 0' trong chữ ký' @ makeGenericStructOuter'? – arrowd
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 –