2013-02-19 101 views
8

出於好奇黑客,我不知道如何gcc可以管理優化低於這個巧妙的功能?gcc的優化的說明

int c() { 
     int i, j = 0; 
     for (i = 0; i < 10; i++) { 
       j += i; 
     } 
     return j; 
} 

$objdump -D c.o下面是爲arm而x86在邏輯上沒有什麼不同。

00000000 <c>: 
    0: 202d  movs r0, #45 ; 0x2d 
    2: 4770  bx lr 

我主要想知道這是優化鏈或類似模板匹配的結果嗎?有沒有關於這種優化的文檔?

+0

用C retaging將atract更多的人... – qPCR4vir 2013-02-19 09:23:22

回答

10

優化程序在階段/通過時執行此操作...當您指定-O2時,會啓用許多優化。在這裏發揮作用的主要優化是

  1. loop unrolling
  2. constant propagation
  3. constant folding
  4. dead-code elimination

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

所以這段代碼

int i, j = 0; 
for (i = 0; i < 10; i++) { 
    j += i; 
} 
return j; 

循環展開後常數傳播通

int i, j = 0; 
i=0; j += 0; 
i=1; j += 1; 
i=2; j += 2; 
i=3; j += 3; 
i=4; j += 4; 
i=5; j += 5; 
i=6; j += 6; 
i=7; j += 7; 
i=8; j += 8; 
i=9; j += 9; 
return j; 

後死代碼消除之後變爲

int i, j = 0; 
i=0; j += i; 
i=1; j += i; 
i=2; j += i; 
i=3; j += i; 
i=4; j += i; 
i=5; j += i; 
i=6; j += i; 
i=7; j += i; 
i=8; j += i; 
i=9; j += i; 
return j; 

j = 0; 
j += 0; 
j += 1; 
j += 2; 
j += 3; 
j += 4; 
j += 5; 
j += 6; 
j += 7; 
j += 8; 
j += 9; 
return j; 

constant folding

j = 45; 
return j; 

最後,

return 45; 
+2

只是真棒... – NeonGlow 2013-02-19 09:57:40

+0

對不起,在一箇舊的答案下來的選票,但是這不是一個準確的描述GCC轉換(儘管它確實有效,並且是各種編譯器優化的明智近似和簡潔演示)。如果你想看看GCC的內部工作,你可以傳遞-fdump-tree-cunroll-all並讀取輸出。我的主要反對意見是,大多數這些分析是交織在一起的,GCC只決定展開,因爲它知道它可以摺疊歸納變量,並且cunroll可以摺疊/傳播,所以從來沒有任何死代碼可以消除。 – 2014-03-27 08:08:15