2013-05-06 2 views
1

Я реализую проход, который использует анализатор псевдонимов, специально используя AliasSetTracker. Я просто хочу вывести все наборы псевдонимов в функцию.LLVM alias analyzer weird results

Код проход очень прост, он работает на функциях, и это так:

virtual bool runOnFunction(Function &F) { 
    AliasAnalysis &AA = getAnalysis<AliasAnalysis>(); 

    AliasSetTracker tr(AA); 
    for(Function::iterator i=F.begin();i!=F.end();++i){ 

    for(BasicBlock::iterator j=i->begin();j!=i->end();++j){ 
    if(dyn_cast<StoreInst>(j)){ 
      StoreInst *ai=dyn_cast<StoreInst>(j); 
    //errs().write_escaped(ai->getName()); 
     tr.add(ai); 
    } 
    if(dyn_cast<LoadInst>(j)){ 
      LoadInst *ai=dyn_cast<LoadInst>(j); 
    //errs().write_escaped(ai->getName()); 
     tr.add(ai); 
    } 
} 

int counter=0; 
for(AliasSetTracker::iterator it=tr.begin();it!=tr.end();++it){ 
    errs() << "Set " << counter++ << "\n"; 
    AliasSet *s=dyn_cast<AliasSet>(it); 
    if(s->isMustAlias()) 
    errs() << " set is must alias\n"; 
    if(s->isMayAlias()) 
    errs() << " set is may alias\n"; 
    for(AliasSet::iterator ra=s->begin();ra!=s->end();++ra){ 

    errs() << ra.getPointer()->getName() << " "; 
    } 

} 
    } 
    return true; 
} 

Я проверить проход с помощью следующей тестовой функции реализации в hello.cpp:

void testfuncion(int *given){ 
    int *o,*i; 
    o=given; 
    i=NULL; 
} 

Я запускаю плагин с использованием различных проходов АА, например:

clang -emit-llvm -o hello.bc -c hello.cpp -> compile the test code 
./opt -load ../lib/AliasTest.so -globalsmodref-aa -aliastoprolog < hello.bc OR 
./opt -load ../lib/AliasTest.so -basicaa -aliastoprolog < hello.bc 

В тестовой функции, как вы можете видеть i и o не являются псевдонимами. С globalsmodref пропущенные отпечатки могут быть псевдонимом. С basicaa O и я в отдельных наборах (правильно), но когда я изменить строку я = NULL для г = о в тестовой функции, basicaa еще возвращает отдельные наборы для о и i, globalsmodref говорит, что o и i могут быть псевдонимом, хотя это должен быть псевдоним. Так что я делаю неправильно здесь?

ответ

0

Я не думаю, что AliasSet *s=dyn_cast<AliasSet>(it); - это правильный способ получить AliasSet. Используйте метод getAliasSets(), как показано в приведенной ниже ссылке.

http://llvm.org/docs/doxygen/html/classllvm_1_1AliasSetTracker.html#a8f3b5f5d7978436b03d3e4b8597d9bc4

ли разница?

+0

нет не работает. Результаты те же. – virvir

+0

Я в основном проверил сгенерированный ir, и я вижу в коде основной шаблон сглаживания. С утверждением вроде i = o, ir имеет% 3 = load i32 ** o, выровняйте 4, затем сохраните i32 *% 3, i32 **% i, выровняйте 4. Однако результат анализа алиаса говорит, что i и o не являются псевдонимами (No Alias). Это очень странно. – virvir