« si tu fais "c=a+b-a" en C, avec des flottants, le compilateur fera vraiment a+b-a. il ne cherchera pas à simplifier. »
Non. Ce genre de comportement (éliminer les 'a') est totalement dépendant du compilateur. Par exemple, avec la plâtrée de transformations optimisantes qu'on trouve dans icc par exemple, je ne suis pas certain que ce que tu affirmes soit vrai (je vais tester demain, je te tiendrai au courant :-) ).
En fait tout dépend de l'ordre dans lequel les transformations ont été effectuées : une fois toutes les fausses dépendances éliminées (grâce à SSA ou autre), on peut très bien couper les branches inutiles de l'AST, et examiner plus en détail les expressions arithmétiques de chaque noeud restant de l'arbre.
Évidemment, sur des cas bien plus complexes (car « cachés »), l'optimisation n'aura pas forcément lieu.
« Et même si le CPU effectue plusieurs opération en parallèle, il ne réordonne JAMAIS les instructions, »
Si. Typiquement sur les x86, les instructions sont exécutées dans le désordre du moment qu'il n'y a pas de dépendance de donnée (les dépendances WAR dont parlait nicO) et que les unités fonctionnelles sont disponibles. Ceci évidemment sans parler de la spéculation sur les branchements, qui provoquent le vidage du pipeline lorsque la machine a mal spéculé.
« il "délivre" les instructions dans le même ordre que celui avec lequel elles arrivent. »
Non, il y a un Reorder Buffer (ROB) qui se charge de remettre le résultat des instructions dans l'ordre pour garder la sémantique du programme, mais avant ça, les instructions peuvent parfaitement avoir été exécutées dans un ordre différent.
[^] # Re: Quelques infos
Posté par lasher . En réponse au journal Comment les programmeurs écrivent du code flottant ?. Évalué à 3.
Non. Ce genre de comportement (éliminer les 'a') est totalement dépendant du compilateur. Par exemple, avec la plâtrée de transformations optimisantes qu'on trouve dans icc par exemple, je ne suis pas certain que ce que tu affirmes soit vrai (je vais tester demain, je te tiendrai au courant :-) ).
En fait tout dépend de l'ordre dans lequel les transformations ont été effectuées : une fois toutes les fausses dépendances éliminées (grâce à SSA ou autre), on peut très bien couper les branches inutiles de l'AST, et examiner plus en détail les expressions arithmétiques de chaque noeud restant de l'arbre.
Évidemment, sur des cas bien plus complexes (car « cachés »), l'optimisation n'aura pas forcément lieu.
« Et même si le CPU effectue plusieurs opération en parallèle, il ne réordonne JAMAIS les instructions, »
Si. Typiquement sur les x86, les instructions sont exécutées dans le désordre du moment qu'il n'y a pas de dépendance de donnée (les dépendances WAR dont parlait nicO) et que les unités fonctionnelles sont disponibles. Ceci évidemment sans parler de la spéculation sur les branchements, qui provoquent le vidage du pipeline lorsque la machine a mal spéculé.
« il "délivre" les instructions dans le même ordre que celui avec lequel elles arrivent. »
Non, il y a un Reorder Buffer (ROB) qui se charge de remettre le résultat des instructions dans l'ordre pour garder la sémantique du programme, mais avant ça, les instructions peuvent parfaitement avoir été exécutées dans un ordre différent.