2016-03-12 5 views
1

У меня есть следующие LLVM IR программа:LLVM в не оптимизирует глобальную переменные

@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.

Должен ли я запускать опцию с некоторыми проходами анализа до или почему пропуск не выполняется, как я ожидаю?

ответ

4

Из linkage section of the langref (курсив):

common
«common» связь является наиболее близким к «weak» связь, но они используются для предварительных определений в C, например, «int X;» в глобальный охват. Символы с привязкой «common» сливаются таким же образом, как и символы weak, и они не могут быть удалены, если не указано. common символы могут не иметь явного раздела, должны иметь нулевой инициализатор и не могут быть помечены «constant». Функции и псевдонимы могут не иметь общей связи.
...
external
Если ни один из вышеперечисленных идентификаторов не используются, глобальный является видимым снаружи, а это означает, что он участвует в связи и может использоваться для разрешения внешних ссылок символов.

Так @test1 внешне видно, что означает, что не гарантируется постоянная (может быть изменен снаружи), и @test2 имеет тип связи, который явно говорит, что это не может быть удален, даже если без ссылок.