La valeur 1 provient du codage du booléen true, qui est restée dans l'accumulateur contenant le résultat final, à la fin de l'évaluation de l'expression.
En effet 2 optimisations se sont téléscopées, l'une permet de supprimer l'appel à not en inversant les branches des alternatives:
if not true then 2 else 0 => if true then 0 else 2L'autre optimisation détecte que la branche else ne nécessite pas d'émission de code, puisqu'après le test l'accumulateur contient forcément la valeur false (c'est-à-dire 0) et qu'il n'y a pas lieu de produire d'instructions pour remettre 0 dans l'accumulateur. Le code engendré devenait:
if not true then 2 else 0 => if not true then 2 else returnLes deux optimisations successives produisaient un code équivalent à:
if true then return else 2et la valeur true était renvoyée en tant que nombre entier, d'où le résultat 1 ...
Contacter l'auteur Pierre.Weis@inria.fr