Parfois, les compilateurs de générer du code avec bizarre instruction des duplications qui peuvent être retirés. Envisager le morceau de code suivant:
int gcd(unsigned x, unsigned y) {
return x == 0 ? y : gcd(y % x, x);
}
Voici le code assembleur (généré par clang 5.0 avec les optimisations activées):
gcd(unsigned int, unsigned int): # @gcd(unsigned int, unsigned int)
mov eax, esi
mov edx, edi
test edx, edx
je .LBB0_1
.LBB0_2: # =>This Inner Loop Header: Depth=1
mov ecx, edx
xor edx, edx
div ecx
test edx, edx
mov eax, ecx
jne .LBB0_2
mov eax, ecx
ret
.LBB0_1:
ret
Dans l'extrait suivant:
mov eax, ecx
jne .LBB0_2
mov eax, ecx
Si le saut ne se produit pas, eax
est réaffecté pour aucune raison évidente.
L'autre exemple est deux ret à la fin de la fonction: on pourrait parfaitement fonctionner aussi bien.
Est le compilateur simplement pas assez intelligent ou il y a une raison de ne pas supprimer les doublons?