Modèle CDFG une proposition pour débattre... Philippe Coussy, Dominique Heller
Plan Bloc de base Branchement conditionnel Boucle Fonction Dépendances de données inter BB
CDFG Un CDFG est un graphe orienté hiérarchique G(V,E) avec V l ’ensemble des nœuds et E l ’ensemble des arcs. Les arcs représentent le flow de contrôle entre les nœuds. Les nœuds aussi nommés blocs sont de deux types: basiques notés BB ou hiérarchiques notés BH.
Suite linéaire d’instructions Bloc de base BB Suite linéaire d’instructions un BB ne contient pas de boucle un BB ne contient pas de branchement conditionnel hormis la première instruction, il n’y a pas d’instruction dans un BB qui est la cible d’un branchement pas de point d ’entrée intermédiaire dans un BB pas de point de sortie intermédiaire dans un BB un GOTO hors d ’un if serait donc la dernière instruction d ’un BB ??? Instruction possible appel de fonction affectation Un BB peut être représenté par un DFG
Branchement conditionnel Utilisation d’un modèle unique pour représenter les branchements conditionnels un branchement conditionnel est un bloc hiérarchique contenant Un nœud fork, un nœud join, un ensemble de blocs hiérarchiques, un ensemble d’arcs il est annoté avec le type de branchement conditionnel qu’il représente if(2) pour un if-then-else if(3) pour un if à trois branche switch(4) pour un switch-case à 4 cas
Branchement conditionnel Noeuds Fork (BB) contient le calcul des prédicats Join (BB) non fusionné avec le BB suivant contiendra les « PHY nodes » si la forme SSA est utilisée Ensemble de blocs hiérarchiques successeurs du nœud fork et prédécesseur du nœud join Arcs Les arcs de contrôle entre le nœud fork et l’ensemble des blocs hiérarchiques sont annotés avec les prédicats évalués dans le nœud fork
Branchement conditionnel : représentation Tag if(2) Tag switch(N) x = c*2; ‘ y= (x==0); ‘ z= (x== 1); ... ‘ x = c*2; ‘ y = a<b; ‘ z = !y; P(y) P(z) P(y) P(z) P(...) ... ... ... ... ... ... join join If-then-else Switch-case
Branchement conditionnel : représentation Tag if(3) ‘ x = (a<b); ‘ y = (a>b); ‘ z = (a==b); P(x) P(y) P(z) ... ... ... join If « à 3 branches »
Branchement conditionnel: switch avec un break manquant Tag switch(N) x = c*2; ‘ y= (x==0); ‘ z= (x== 1); ... P(y) P(z) P(...) ... ... ... ... join
Représentation unique Boucle Représentation unique Init test de condition d ’arrêt Corps de boucle Next test de condition d ’arrêt Bloc suivant
Boucle avec continue Init OK ssi le code est de la forme suivante test de condition d ’arrêt OK ssi le code est de la forme suivante BB1 IF(2) If (cond) continue; else BB2; FORK BB2 Cont Join Next test de condition d ’arrêt Bloc suivant
Boucle avec continue Init NOK si le code à un else implicite. Il faudra une transformation lors de la création du graphe pour utiliser le modèle du slide précédent test de condition d ’arrêt BB1 IF(2) FORK vide Cont If (cond) continue; BB2; Join BB2 Next test de condition d ’arrêt Bloc suivant
Boucle avec continue Init NOK si le code à un else implicite. Il faudra une transformation lors de la création du graphe pour utiliser le modèle du slide précédent test de condition d ’arrêt BB1 IF(2) FORK BB2 Cont If (cond) continue; else BB2; BB3; Join BB3 Next test de condition d ’arrêt Bloc suivant
Boucle avec Break Init test de condition d ’arrêt BB1 FORK BB2 Break Next test de condition d ’arrêt Bloc suivant
Fonction Mise en ligne Non mise en ligne duplication de chaque appel un CDFG par appel de fonction (i.e. des nœuds hiérarchiques) Non mise en ligne c’est une opération atomique et le BB n ’est pas scindé
Dépendances de données Expression des dépendances de données entre BB pour les live in et live out par exemple A REGARDER POUR LA PROCHAINE REUNION dépendances producteur consommateur nécessaires Par défaut utilisation de la forme SSA ou non SSA ? Si un BB utilise une fonction dont on ne connais pas le code => ignorer ce BB ou ajouter dans live in et live out les variables globales