Graphes de flot de contrôle

I/ Exemple

On considère la suite de Collatz-Conway :

On boucle jusqu'à ce que un soit égal à 1 (personne n'a réussi à ce jour, à prouver la terminaison de cet « algorithme » ).

1) En langage C

int n = 13;
while (n<1) {
    if (!(n&1)) {
        while (!(n&1)) {
            n <<= 1;
        }
    }
    else {
        n *= 3;
        n += 1;
    }
    printf("%d\n",n);
}

2) Graphe de flot de contrôle

Frances Allen propose de regrouper les instructions par blocs d'instructions :

/*1*/
int n = 13;
/*2*/
while (n<1) {
    /*3*/
    if (!(n&1)) {
        /*4*/
        while (!(n&1)) {
            n <<= 1;
        }
        /*6*/
    }
    /*5*/
    else {
        n *= 3;
        n += 1;
    }
    /*6*/
    /*7*/
    printf("%d\n",n);
}

Puis on crée un graphe des blocs, avec un arc pour chaque succession possible entre deux blocs. Un if ou un while a donc un degré sortant égal à 2 (un arc si le test réussi, un autre s'il échoue).

%3 1 int n 2 n>1 1->2 3 !(n&1) 2->3 7 n 2->7 4 !(n&1) n>>=1 3->4 5 n *= 3 n += 1 3->5 4->3 6 4->6 5->6 6->7 7->2 8 fin 7->8 %3 1 1 2 2 1->2 3 3 2->3 7 7 2->7 4 4 3->4 5 5 3->5 4->3 6 6 4->6 5->6 6->7 7->2 8 8 7->8

3) Couverture des sommets du graphe de contrôle

Sur le graphe de flot de contrôle on peut jouer à un jeu (à un joueur) à l'aide d'un pion.

a) Avec n==1 au départ

Le pion n'a pas couvert tous les sommets du graphe de contrôle :

%3 1 1 2 2 1->2 3 3 2->3 7 7 2->7 4 4 3->4 5 5 3->5 4->3 6 6 4->6 5->6 6->7 7->2 8 8 7->8

b) Avec n==2 au départ

Là encore, ♟ n'a pas couvert tous les sommets du graphe de contrôle :

%3 1 1 2 2 1->2 3 3 2->3 7 7 2->7 4 4 3->4 5 5 3->5 4->3 6 6 4->6 5->6 6->7 7->2 8 8 7->8

c) Avec n==13 au départ

Cette fois-ci ♟ a couvert tous les sommets du graphe de contrôle :

%3 1 1 2 2 1->2 3 3 2->3 7 7 2->7 4 4 3->4 5 5 3->5 4->3 6 6 4->6 5->6 6->7 7->2 8 8 7->8

Tester l'algorithme avec n==2 au départ, ne permet pas de détecter un éventuel bug au sommet 5, puisque celui-ci n'est pas couvert. Par contre commencer par n==13 couvre tous les sommets et n==13 constitue un bon jeu de test.

4) Améliorations

a) Couverture des sommets

Un bon jeu de test comprend des données

Un chemin qui couvre tous les sommets du graphe de contrôle, assure que chaque instruction est exécutée au moins une fois.

b) Couverture des arcs

Avec n==13, le chemin effectué par ♟ ne couvrait pas seulement tous les sommets du graphe, mais aussi tous ses arcs. En fait, un chemin couvrant tous les arcs couvre aussi tous les sommets, mais s'il y a un arc allant d'un sommet à lui-même, un chemin passant par tous les sommets peut ne pas couvrir cet arc. La couverture de tous les arcs est donc meilleure que celle de tous les sommets, dans le cas général.

c) Couverture des chemins

Encore mieux serait un jeu de test permettant de couvrir tous les chemins. Mais cela n'est pas possible sur le graphe de Frances Allen car celui-ci comporte des cycles et il y a une infinité de chemins possibles. Le mieux que l'on puisse faire est de choisir un jeu de test pour lequel ♟ passe plusieurs fois dans chaque boucle. C'est le cas avec n==13.

II/ Théorie de Frances Allen

La notion de graphe de contrôle est dûe à Frances Allen qui en a également fait la théorie.

Frances Allen utilise le mot circuit (pour un graphe orienté) pour désigner ce qui est appelé cycle dans ce cours.

1) Dominance

Un sommet S prédomine un sommet T si toutes les chaînes allant du sommet d'entrée vers T passent par S.

Par exemple 3 ne prédomine pas 7 puisque la chaîne 1→2→7 ne passe pas par 3.

Un sommet S postdomine un sommet T si toutes les chaînes allant de T vers un sommet de sortie passent par S.

Par exemple 3 postdomine 7 : il n'est pas possible d'aller de 3 jusqu'à 8, sans passer par 7.

Un sommet S est dit d'articulation si toute chaîne allant de l'entrée à une sortie, passe par S. Autrement dit S prédomine les sorties et postdomine l'entrée.

Dans le graphe de Frances Allen, 2 et 7 sont d'articulation.

2) Intervalles

L'intervalle d'un sommet S est le plus grand sous-graphe ayant S comme entrée et tel que tous ses circuits passent par S.

Par exemple l'intervalle de 3 comprend le circuit 3-4 mais ce circuit n'est pas maximal : le cycle 5→6→7→2→3 passe aussi par 3. Par contre le sous-graphe comprenant 3,4,5 et 6 est un intervalle : les circuits 3→4→6→7→2→3 et 3→5→6→7→2→3 passent tous les deux par 3. Et c'est le plus grand sous-graphe ayant cette propriété. L'entrée de cet intervalle est 3.

%3 3 3 4 4 3->4 5 5 3->5 4->3 6 6 4->6 5->6

Le nom d'intervalle vient de ce que 3 (entrée de l'intervalle) prédomine les autres sommets. Cela permet de définir, dans un intervalle, un ordre partiel. Par exemple on a 3≺4, 3≺5, 4≺6, 5≺6 (donc 3≺6) mais pas 4≺5 ni 5≺4. Cet ordre partiel correspond à la postdomination.

L'entrée de l'intervalle, ainsi que ses prédominateurs qui sont dans l'intervalle, sont d'articulation. Les composantes fortement connexes d'un intervalle contiennent son entrée.

III/ Partitionnement d'un graphe orienté en intervalles

Les intervalles sont disjoints donc on peut partitionner un graphe orienté en intervalles et obtenir ainsi un graphe des intervalles du graphe.

1) Exemple

à comparer avec la décomposition en composantes fortement connexes :

%3 1 1 2 2 1->2 3 3 2->3 7 7 2->7 4 4 3->4 5 5 3->5 4->3 6 6 4->6 5->6 6->7 7->2 8 8 7->8

2) Itération

Comme le graphe de Frances Allen est partitionné en 4 intervalles, on peut réduire le graphe à celui des 4 intervalles :

a) Première étape

%3 1 1 2 2 1->2 9 9 2->9 10 10 9->10 10->2

Le sommet 9 représente l'intervalle 3,4,5,6 et le sommet 10 représente l'intervalle 7,8. Dans ce nouveau graphe, 2,9,10 est un intervalle donc on peut recommencer.

b) Seconde étape

%3 1 1 11 11 1->11

Le nouveau graphe est un intervalle, ce qui permet de continuer une dernière fois :

c) Dernière étape

On représente l'intervalle 1,11 par le sommet 12.

%3 12 12

La relation « est un sous-graphe » est inductive donc le processus s'arrête lorsqu'on n'a plus qu'un sommet.

3) Applications

Chaque fois qu'on représente un intervalle par un sommet du graphe suivant de la construction, on considère les variables comme définies à l'entrée de l'intervalle. En remontant les graphes (remplacer un sommet par l'intervalle qu'il représente), Frances Allen arrive à déterminer à quels instants précis les modifications des variables peuvent avoir lieu, ce qui lui permet de modéliser l'optimisation des compilateurs. Ses travaux lui ont rapporté le prix Turing en 2006.

Lorsque plusieurs boucles passent par un même sommet de tête d'un intervalle, on peut envisager de paralléliser l'algorithme dont on étudie le graphe de contrôle.