2016-03-12 84 views
1

我有以下LLVM IR方案:LLVM的-globalopt通不優化的全局變量

@test1 = global i32 3, align 4 
@test2 = common global i32 0, align 4 

; Function Attrs: nounwind uwtable 
define i32 @main() #0 { 
    store i32 4, i32* @test2, align 4 
    %1 = load i32* @test1, align 4 
    ret i32 %1 
} 

當我使用選擇(3.3版)與-globalopt運行通過位碼保持不變。不過,我預計@test1被標記爲constant@test2淘汰,因爲該程序只存儲到@test2

我是否必須在某些分析階段之前運行opt,或者爲什麼該階段未按預期執行?

回答

4

linkage section of the langref(重點煤礦):

common
common」鍵是最相似的「weak」聯動,但它們被使用在C暫定定義,例如「int X;」在全球範圍。帶有「common」鏈接的符號以與weak符號相同的方式合併,並且如果未引用,則它們可能不會被刪除。 common符號可能沒有明確的部分,必須具有零初始值設定項,並且可能未標記爲'constant'。函數和別名可能沒有共同的聯繫。
...
external
如果使用沒有上述標識,全球的外部可見,這意味着參與聯動,可以用來解決外部符號引用。

所以@test1是外部可見的,這意味着它不能保證是一個常數(可從外部改變),並@test2是一個聯動裝置類型,其中明確指出,即使未引用它可以不被去除的。