3 votes

Pré-évaluation de la RI de LLVM

Supposons que nous ayons des expressions comme :

  %rem = srem i32 %i.0, 10
  %mul = mul nsw i32 %rem, 2
  • %i.0 est un llvm::PHINode dont je peux obtenir les limites.

La question est la suivante : existe-t-il un moyen d'obtenir la valeur de %mul au moment de la compilation ? J'écris une passe llvm et j'ai besoin d'évaluer certaines expressions qui utilisent %i.0. Je cherche une fonction, une classe ou quelque chose d'autre à laquelle je donnerais une valeur à %i.0 et qui évaluerait l'expression et renverrait le résultat.

2voto

Oak Points 10667

Vous pouvez cloner le code (la fonction qui le contient ou le module entier, selon le contexte dont vous avez besoin), puis remplacer %i.0 avec une valeur constante, exécuter la passe de propagation des constantes sur le code, et enfin vérifier si %mul est affectée à une valeur constante et, si c'est le cas, l'extraire.

Ce n'est pas très élégant, mais je pense que cela fonctionnerait. Il suffit de faire attention à :

  1. Assurez-vous que %mul n'est pas éludé - par exemple, le renvoyer de la fonction, ou stocker sa valeur en mémoire, ou autre.
  2. Il faut savoir que la propagation constante suppose certaines choses sur le code, en particulier qu'il est déjà passé par mem2reg.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X