我不明白為什么需要窺視孔優化?因為編譯器足夠聰明,可以優化代碼?你能給我一些需要窺視孔優化的例子嗎?
uj5u.com熱心網友回復:
窺視孔通常是針對特定目標的。
它們可能僅對目標暫存器 (RTL) 有意義,而不是 IR。
例如,例如 x86xor eax, eax而不是mov eax,0. (在 x86 匯編中將暫存器設定為零的最佳方法是什么:xor、mov 或 and?)。沒有理由在 IR 中執行此操作,并且在最后一刻(最終代碼生成)之前執行此操作會混淆其他優化的值為零的事實。對除 x86 以外的任何機器執行此操作都是反優化(創建錯誤的依賴項)。OTOH,您不想讓它太晚,否則您可能無法在設定 FLAGS 的東西之前重新排序它,例如
xor eax,eax
cmp ecx, edx
sete al ; boolean 0 or 1 zero-extended to 64-bit RAX
代替
cmp ecx, edx
sete al ; false dependency on old RAX
movzx eax, al ; no mov-elimination, extra critical path latency
或者
cmp ecx, edx
mov eax, 0 ; less efficient instruction to leave FLAGS untouched
sete al ; later reads of RAX will have partial-register stalls on P6-family
或者作為另一個示例,x86 可以使用 LEA 乘以 3、5 或 9,以利用 2 位移位并添加 2 暫存器尋址模式。優化器知道這是一個有效的構建塊可能很??有用,并且旨在將事物重新分解為乘以 9,但實際上將乘以 10 轉換(x * 5) * 2為并不是您想要的方式目標在哪里(x<<3) (x<<1)更有效(x*10 = x*8 x*2)。
看
- 對不是地址/指標的值使用 LEA?
- 如何在 x86 中僅使用 2 個連續的 leal 指令將暫存器乘以 37? - 顯示某些編譯有時會錯過窺視孔優化,并討論
imul與 2x的權衡lea以及快速的現代 CPU 如何imul使其只值得花費最多 2 條指令替換乘法,或者如果瓶頸是吞吐量而不是延遲則只花費 1 條指令. 除非你可以像 LEA 那樣在其中加入一個附加項……
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/459714.html
