5

我一直在閱讀本地優化編譯器技術,但我一直沒有得到它們如何實現。這個想法是,優化器每次都會查看代碼的「窗口」,並以某種方式檢測模式並用更優化的版本替換它們。窺視孔優化模式

我的問題是,如何發現這些模式? (假設你的平臺是一個虛擬機,可以輸出組裝好的計算機的彙編代碼,就像Schocken的Hack一樣)。

人們是否真的手動檢查代碼(使用控制流圖或DAG或其他),然後收集所有已識別的模式並將它們編碼到優化器中?或者有一種自動方式。

例如,您在分析器中提供要優化的代碼,並且會噴出所述模式。如果是這樣,那麼如何開始寫一個?

+0

我認爲這通常稱爲'inline caching'。您將在運行時發現使用此技術的近期JavaScript引擎的許多文獻。請參閱http://wingolog.org/archives/2012/05/29/inline-cache-applications-in-scheme。 – leppie 2012-08-05 16:32:26

+0

這很有趣,我第一次碰到這個。我一般都在考慮減少強度,不斷評估,控制流量選擇等操作。 – gfountis 2012-08-05 16:40:57

+0

這似乎是針對'運行時'是嗎?還是用於生成更緊密的彙編代碼? – gfountis 2012-08-05 16:44:09

回答

3

經典的窺視孔優化不是關於減少強度和其他你命名的事情。它們就像2-3指令序列例如

BRANCH FALSE $1 
BRANCH $2 
$1: 

這可以減少到

BRANCH TRUE $2 

序列這樣可以在幼稚碼發生器產生諸如來與不單程編譯器生成AST,比如我曾經工作的一些COBOL編譯器。

+0

我明白了,但是如何能發現這些序列呢?有沒有發佈過的模式列表?人們編譯隨機代碼,然後開始自己搜索它們嗎? – gfountis 2012-08-05 21:56:23

+0

另外,是不是一個控制流優化的例子?=) – gfountis 2012-08-05 21:59:40

+1

@gfountis當然,只是我所說的編譯器不做流分析。如果有任何這些剩餘的,那麼對於任何像樣的彙編程序員來說,窺孔序列都是顯而易見的。你只是檢查輸出,並認爲'嗯...'。這些都在通常的書籍中。 – EJP 2012-08-06 00:08:54

1

這取決於你是否編寫自己的分析儀或使用現有的分析儀。在任何一種情況下,您的分析器都會繼續檢查代碼,直到沒有更好的優化。如果您以GCC爲例,它具有特定的優化通道。你的程序的中間代碼被賦予這些傳遞,這些傳遞一個接一個地執行並優化你的代碼。任何通行證也可以執行多次。
如果您確實想要了解如何編寫這些優化,只需通過passes.h文件GCC

+0

因此,在想要針對非x86代碼生成(對於玩具平臺)進行優化的情況下,唯一的方法是編寫自己的分析器,還是通過「手動」來完成? – gfountis 2012-08-06 09:01:49

+0

這個問題是關於窺視孔優化,而你還沒有回答它。 – EJP 2016-01-05 08:24:50