2016-09-16 5 views
0

Je travaille à l'analyse des instructions utilisées. Étant donné que j'ai trouvé une instruction d'intérêt, je veux revenir en arrière toutes les opérations utilisées et variables. Donné par exemple la boucle suivante dans LLVM IR.Opérations de retour arrière et opérandes dans LLVM

%i.01 = phi i32 [ 0, %0 ], [ %4, %2 ] 
%3 = icmp eq i32 %i.01, 0 
%bar.foobar.i = select i1 %3, void()* @bar, void()* @foobar 
tail call void %bar.foobar.i() #2 
%4 = add nuw nsw i32 %i.01, 1 
%exitcond = icmp eq i32 %4, 10 
br i1 %exitcond, label %1, label %2 

Je suis intéressé par exemple dans toutes les données impliquées dans la dernière branche. La condition est calculée une instruction avant d'utiliser un ICompInst qui implique la variable %4 et une constante 10. %4 est calculé une étape avant d'utiliser un ajout. Et ainsi de suite et ainsi de suite ...

Étant donné que j'ai trouvé l'instruction d'intérêt, dans ce cas le BranchInst, je veux commencer mon backtracking.

if(BranchInst* BI = dyn_cast<BranchInst>(&I)) { 
    if(BI->isConditional()) { 
    backtrack(BI, &I); 
    } 
} 

Pour implémenter un tel algorithme, j'ai deux questions. Avoir l'instruction de branchement, comment puis-je obtenir la condition pour commencer le backtracking? Deuxièmement, comment puis-je déterminer si la condition est utilisée dans une instruction précédente? Pour comprendre plus facilement, je le pseudo code suivant:

void backtrack(BranchInst* BI, Instruction* I) { 
    Value* condition = BI->getCondition(); 
    Instruction* prevInst = I; 

    do { 
    prevInst = prev(prevInst); 
    if(prevInst->prevInst(condition)) { 
     backTrackOperand(prevInst->getOperand(0), prevInst); 
     backTrackOperand(prevInst->getOperand(1), prevInst); 
     break; 
    } 
    } while(1); 
} 

void backTrackOperand(Value* operand, Instruction* I) { 
    Instruction* prevInst = I; 

    do { 
    prevInst = prev(prevInst); 
    if(prevInst->usesOperand(operand)) { 
     ... 
    } 
    } 
} 

Alors, comment pourrais-je mettre en œuvre la fonction getCondition(), computesCondition() et usesOperand()?

Répondre

0
  • getCondition() est getOperand (0).
  • Je ne vois pas computesCondition() dans votre code?
  • usesOperand() est quelque chose comme llvm::find_if(prevInst->operands(), [&] (Uses &U) { return isa<Instruction>(&U) && cast<Instruction>(&U) == I; });. Mais notez aussi que du conditionnel ou n'importe quelle valeur, vous pouvez facilement trouver toutes les utilisations.