亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么clang用-O0產生低效率的asm(對于這個簡單的浮點數總和)?

為什么clang用-O0產生低效率的asm(對于這個簡單的浮點數總和)?

C
慕慕森 2019-09-26 15:02:29
為什么clang用-O0產生低效率的asm(對于這個簡單的浮點數總和)?我正在llvm clang Apple LLVM版本8.0.0(clang-800.0.42.1)上反匯編以下代碼:int main() {     float a=0.151234;     float b=0.2;     float c=a+b;     printf("%f", c);}我沒有使用-O規范進行編譯,但是我也嘗試使用-O0(給出相同的值)和-O2(實際上是計算值并將其存儲為預先計算的)產生的拆卸如下(我刪除了不相關的零件)->  0x100000f30 <+0>:  pushq  %rbp    0x100000f31 <+1>:  movq   %rsp, %rbp    0x100000f34 <+4>:  subq   $0x10, %rsp    0x100000f38 <+8>:  leaq   0x6d(%rip), %rdi            0x100000f3f <+15>: movss  0x5d(%rip), %xmm0                0x100000f47 <+23>: movss  0x59(%rip), %xmm1             0x100000f4f <+31>: movss  %xmm1, -0x4(%rbp)       0x100000f54 <+36>: movss  %xmm0, -0x8(%rbp)     0x100000f59 <+41>: movss  -0x4(%rbp), %xmm0              0x100000f5e <+46>: addss  -0x8(%rbp), %xmm0    0x100000f63 <+51>: movss  %xmm0, -0xc(%rbp)     ...顯然,它正在執行以下操作:將兩個浮點數加載到寄存器xmm0和xmm1將它們放在堆棧中從堆棧中將一個值(不是xmm0之前的一個值)加載到xmm0執行添加。將結果存儲回堆棧。我發現效率低下是因為:一切都可以在注冊表中完成。我以后不會使用a和b,因此它可以跳過涉及堆棧的任何操作。即使它想使用堆棧,如果以不同的順序執行操作,也可以節省從堆棧中重新加載xmm0的時間??紤]到編譯器總是正確的,為什么選擇這種策略?
查看完整描述

2 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

請注意,至少clang實際上是從每個變量開始的,每個變量在堆棧上為其分配了內存。-O0如果可能的話,第一個優化過程之一(我想省略了)可以將它們變成一堆SSA變量。因此,至少在clang上,沒有進行“反優化”,只是關閉了正常的優化。

查看完整回答
反對 回復 2019-09-26
  • 2 回答
  • 0 關注
  • 824 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號