天天看點

編譯器優化--1--概述簡介編譯器優化–1--概述簡介

編譯器優化–1--概述簡介

編譯優化的度量有很多種,包括運作時間減少,代碼長度變短,執行期間處理器能耗更低等等。優化編譯器除了生成高效的代碼,還應該具備使輸入的小改動不應該導緻性能出現較大變動。

多遍疊代可能會生成更好的代碼,因為編譯器實際上可以在一個階段中研究代碼并記錄相關細節,那麼在後續階段中,編譯器可以利用這些記下來的知識來提高轉換的品質。這種政策要求在第一個Pass獲得知識并将之記錄儲存,後續各個Pass可以查找并利用這些知識。LLVM架構的優化就是這麼做的。

​ 第一個Pass往往稱之為分析Pass,後面的若幹Pass都稱為轉換Pass。分析Pass可以判斷代碼在何處安全地應用優化技術且有利可圖。編譯器的常見優化分析技術:

1. 資料流分析,在編譯時推斷運作時值的流動。資料流分析器通常需要解一個聯立方程組,該方程組是根據被轉換代碼的結構得出的。
2. 相關性分析(dependence analysis)使用數論中的測試方法來推斷下标表達式的可能值。它用于消除引用數組元素時的歧義。
           

優化器的設計中,轉換趟的選擇和順序的确定,對于優化器的整體有效性具有非常關鍵的作用。變換的選擇決定了優化器能夠發現IR程式中的哪些低效性,已經優化器如何重寫代碼以消除這些低效性。編譯器應用變換的順序則決定了各"趟處理(Pass)"之間的互動方式。

分析Pass和轉換Pass的關系如下圖所示:

編譯器優化--1--概述簡介編譯器優化–1--概述簡介

每個趟(Pass)以IR形式的代碼作為輸入,都生成IR代碼的一個重寫版本作為輸出。這樣的結構将實作劃分為若幹個小片段,允許獨立地建構并測試各個處理趟,簡化開發、測試和維護。在實際編譯器應用中,某些趟隻會運作一次,而其它趟可能需要在優化過程中的不同時機多次運作。

優化器設計與實作中的若幹難題

優化器設計和構造方面的第一個障礙是概念上的。優化文獻描述了數百種用于改進IR程式的不同算法。編譯器編寫者必須從這些變換算法中選擇一個子集來實作并應用到代碼上。雖然閱讀原始論文有助于實作,但這無法為決策過程提供什麼洞察力,因為大多數論文都主張采用他們所說的轉換。

其次,編譯器編寫者需要領會編譯器轉換的應用程式中會出現哪些低效性,以及這些低效性對應用程式有何影響。給定一組需要解決的具體缺陷,編譯器編寫者接下來為其選擇處理這些缺陷的具體變換。實際上,許多變換都能夠解決多種低效性,是以缜密的選擇可以減少所需的趟數。因為大多數優化器都是建立在有限資源上的,編譯器編寫者可以根據變換對最終代碼的影響,按優先次序列出各個變換。

此外,相比與編譯器前端,優化階段和代碼生成包含了幾個需要更多時間的問題。對于程式分析和優化來說,我們考察的許多算法,其複雜度都超過O(n)。因而,與編譯器前端相比,優化器和代碼生成器中算法的選擇對編譯實踐有更大的影響。編譯器編寫者可能需要進行一些折中,以分析準确性和優化有效性的下降來阻止編譯時間的上升。進行此類決策時,需要進行明智且審慎的考慮。

繼續閱讀