Au début de gcc (2.8 etc.) et à l'époque des egcs, et redhat 2.96 -O3 était parfois assez buggé. Mais cela fait plus d'une décennie, et -O3 n'est pas très différent des autres niveaux d'optimisations (en buggyness).
Il a cependant tendance à révéler des cas où les gens s'appuient sur un comportement indéfini, car ils s'appuient plus strictement sur les règles, et en particulier les cas de coin, de la ou des langues.
À titre personnel, j'exécute depuis plusieurs années un logiciel de production dans le secteur financier avec -O3 et je n'ai pas encore rencontré de bug qui n'aurait pas existé si j'aurais utilisé -O2.
À la demande générale, voici un ajout:
-O3 et en particulier des indicateurs supplémentaires tels que -funroll-loops (non activé par -O3) peuvent parfois entraîner la génération de plus de code machine. Dans certaines circonstances (par exemple sur un processeur avec un cache d'instructions L1 exceptionnellement petit), cela peut provoquer un ralentissement en raison de tout le code, par exemple d'une boucle interne qui ne correspond plus à L1I. Généralement, gcc essaie assez fort de ne pas générer autant de code, mais comme il optimise généralement le cas générique, cela peut arriver. Les options particulièrement sujettes à cela (comme le déroulement de boucle) ne sont normalement pas incluses dans -O3 et sont marquées en conséquence dans la page de manuel. En tant que tel, c'est généralement une bonne idée d'utiliser -O3 pour générer du code rapide, et de ne retomber sur -O2 ou -Os (qui essaie d'optimiser la taille du code) que lorsque cela est approprié (par exemple lorsqu'un profileur indique que L1I manque).
Si vous souhaitez pousser l'optimisation à l'extrême, vous pouvez modifier dans gcc via --param les coûts associés à certaines optimisations. Notez également que gcc a maintenant la possibilité de mettre des attributs sur des fonctions qui contrôlent les paramètres d'optimisation uniquement pour ces fonctions, donc lorsque vous trouvez que vous avez un problème avec -O3 dans une fonction (ou que vous voulez essayer des drapeaux spéciaux pour cette fonction uniquement), vous n'avez pas besoin de compiler tout le fichier ou même tout le projet avec O2.
otoh il semble que des précautions doivent être prises lors de l'utilisation de -Ofast, qui stipule:
-Ofast permet toutes les optimisations -O3. Il permet également des optimisations qui ne sont pas valides pour tous les programmes conformes aux normes.
ce qui me fait conclure que -O3 est censé être entièrement conforme aux normes.