2017-01-11 7 views
0

На рисунке ниже слева вы можете увидеть код C, а часть справа показывает неоптимизированную форму LLVM IR.Чтение после проверки зависимости в LLVM Анализ зависимости памяти

The Figure

Запуск MemoryDependenceAnalysis на ИК находит зависимости памяти. Одна зависимость показана как в исходном коде, так и в его ИК-эквиваленте, используя линию стрелок.

Вот результат анализа, который включает в себя указанную зависимость:

Printing analysis 'Print MemDeps of function' for function 'main': 
    Def from: %retval = alloca i32, align 4 
    store i32 0, i32* %retval, align 4 

    Def from: %d = alloca i32, align 4 
    store i32 0, i32* %d, align 4 

    Def from: %a = alloca i32, align 4 
    store i32 0, i32* %a, align 4 

    Def from: store i32 0, i32* %a, align 4 
    %0 = load i32, i32* %a, align 4 

    Def from: %b = alloca i32, align 4 
    store i32 %0, i32* %b, align 4 

    Def from: %0 = load i32, i32* %a, align 4 
    %1 = load i32, i32* %a, align 4 

    Def from: store i32 0, i32* %d, align 4 
    %2 = load i32, i32* %d, align 4 

    Def from: %c = alloca i32, align 4 
    store i32 %add, i32* %c, align 4 

    Def from: %2 = load i32, i32* %d, align 4 
    store i32 2, i32* %d, align 4 

В выходе из анализа, мы имеем:

Def from: %0 = load i32, i32* %a, align 4 
    %1 = load i32, i32* %a, align 4 

Переменная a считывается в обоих утверждений, которые является зависимостью RAR. Как показано в фрагменте кода (LLVM-3.9.0 в lib/Analysis/MemoryDependenceAnalysis.cpp: 549-551) LLVM рассматривает эти нагрузки как defs друг от друга. Что это значит?

// Must aliased loads are defs of each other. 
    if (R == MustAlias) 
     return MemDepResult::getDef(Inst); 

Также обратите внимание, что анализ выполняется на ИК-дисплее, а не на источнике C.

ответ

0

Я никогда не использовал LLVM, но на основе вашего предоставленного кода C и LLVM IR переменная a считывается 2 раза. Я не вижу никакой ошибки. Могу ли я ошибаться?

enter image description here