2011-10-05 136 views
10

我希望具體知道LLVM的各種優化級別對應的是什麼。LLVM執行哪種優化?

也就是說,我想知道在使用llvm(或clang或opt)的「-0x」選項時,哪些優化傳遞是正確執行的(前端之外)以及按何種順序執行。 相關工具的「人」在這個問題上沒有提供太多的信息(與gcc的相反)。

我知道這個有用的頁面:http://llvm.org/docs/Passes.html,但它沒有提供任何關於「-Ox」選項的信息。 我正在尋找一些調試或詳細選項(特別是使用「opt --help」中的信息),但我找不到任何有用的選項。

作爲補充,我注意到通過解析代碼,所有各種LLVM工具以及叮聲卡都使用不同的驅動程序,這些驅動程序以自己的方式解析選項。這些驅動程序是否與「-Ox」選項相似?

編輯:我發現了「選擇」工具,它提供了以下輸出選項「01」選項「-debug通=參數」:

Pass Arguments: -targetdata -no-aa -tbaa -targetlibinfo -basicaa -simplifycfg -domtree -scalarrepl -early-cse -lower-expect 
Pass Arguments: -targetlibinfo -targetdata -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -always-inline -functionattrs -scalarrepl-ssa -domtree -early-cse -simplify-libcalls -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa -loop-rotate -licm -lcssa -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -iv-users -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -instcombine -lazy-value-info -jump-threading -correlated-propagation -domtree -memdep -dse -adce -simplifycfg -instcombine -strip-dead-prototypes -preverify -domtree -verify 

這是什麼密切我想但仍然有兩個問題:

  • 爲什麼有兩個列表?

  • 是否有類似的選項用於其他工具,尤其是「clang」? (根據我的測試,「-debug通=參數」不鏗鏘工作)

編輯:選項「-debug通=構成」工具「選擇」給出更用戶友好的數據(來自http://llvm.org/docs/WritingAnLLVMPass.html

回答

11

爲什麼有兩個列表?

功能和模塊通道有自己的通道管理器,因此可以單獨打印。

有任何類似的選項等工具,尤其是「鐺」

鏗鏘,您可以使用-mllvm -debug通=參數。

+0

不夠公平!謝謝 ! –

+0

@echristo:你能詳細講解LLVM中函數和模塊傳遞之間的區別嗎?例如,我正在傳遞整個源代碼文件foo.c以選擇標準優化傳遞(O1,2,3,...)之一。接下來會發生什麼 ? – Amir

+1

@Amir對不起,只是看到了這一點。 無論如何,模塊通行證通常適用於所有功能等,並具有全局可見性。函數傳遞一次對單個函數起作用,並且不能像對單個函數進行分析那樣來回傳遞信息。 一般來說,數據佈局,全局代碼生成,過程間分析等是模塊,而gvn是函數遍。您可以查看每個傳球的來源,以瞭解其具體內容。你有更具體的問題或更多的信息? – echristo