2016-03-12 79 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是一个联动装置类型,其中明确指出,即使未引用它可以不被去除的。