Я реализую проход, который использует анализатор псевдонимов, специально используя 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 могут быть псевдонимом, хотя это должен быть псевдоним. Так что я делаю неправильно здесь?
нет не работает. Результаты те же. – virvir
Я в основном проверил сгенерированный ir, и я вижу в коде основной шаблон сглаживания. С утверждением вроде i = o, ir имеет% 3 = load i32 ** o, выровняйте 4, затем сохраните i32 *% 3, i32 **% i, выровняйте 4. Однако результат анализа алиаса говорит, что i и o не являются псевдонимами (No Alias). Это очень странно. – virvir