Le code intermédiaire généré par un compilateur à la forme suivante.
01 | i=m-1 | début de bloc 0 (avant boucle ) |
02 | j = n | |
03 | T1 = 4*n | |
04 | v =a [T1] | fin de bloc 0 car un autre bloc démarre à la ligne suivante |
05 | i = i+1 | début de bloc 1 (cible de goto remontant) |
06 | T2 = 4*i | |
07 | T3 = a[T2] | |
08 | if T3 < v goto 5 | fin de bloc (car branchement) |
09 | j = j - 1 | début de bloc 2 |
10 | T4 = 4*j | |
11 | T5 = a[T4] | |
12 | if T5 > v goto 9 | |
13 | if i >= j goto 23 | fin de bloc 2, car branchement |
14 | T6 = 4*i | |
15 | x = a[T6] | |
16 | | T7 ↔ T6 et T6 n'est pas modifié avant utilisation de T7 : éliminer T7 |
17 | T8 = 4*j | |
18 | T9 = a[T8] | |
19 | a[ | |
20 | | T8 ↔ T10 et T8 n'est pas modifié avant utilisation de T10 : éliminer T10 |
21 | a[ | |
22 | goto 5 | fin de bloc 3 : on sort pour aller dans bloc 1. |
23 | T11 = 4*i | début de bloc 4 , qu'on peut entrer par branchement depuis la ligne 13. |
24 | x = a[T11] | |
25 | T12 ↔ T11 et T11 n'est pas modifié avant utilisation de T12 : éliminer T12 | |
26 | T13 = 4*n | |
27 | T14 = a[T13] | |
28 | a[ | |
29 | | T15 ↔ T13 et T13 n'est pas modifié avant utilisation de T15 : éliminer T15 |
30 | a[ | fin de bloc 4? on ne connait pas la suite… |
on a
24 x = a[T11] 30 a[T15] = x
Alors, en supposant que l'assembleur permet des affectations de tableau à tableau, on peut écrire à la place
24 noop 30 a[T15] = a[T11]
Ensuite, on note que
04 v = a[T1] 08 if a[T2] < v... 12 if a[T4 > v ...
pourrait donner, puisque la valeur de v ne sert pas ailleurs et la valeur de a[T1] n'est pas modifiée depuis l'affectation de v jusqu'à ces lignes,
04 noop 08 if a[T2] < a[T1]... 12 if a[T4 > a[T1] ...