In den frühen Tagen von gcc (2.8 usw.) und in den Zeiten von egcs und redhat 2.96 -O3 war es manchmal ziemlich fehlerhaft. Aber das ist über ein Jahrzehnt her und -O3 unterscheidet sich nicht wesentlich von anderen Optimierungsstufen (in Buggyness).
Es werden jedoch tendenziell Fälle aufgedeckt, in denen sich Menschen auf undefiniertes Verhalten verlassen, da sie sich strenger auf die Regeln und insbesondere Eckfälle der Sprache (n) stützen.
Persönlich betreibe ich seit vielen Jahren Produktionssoftware im Finanzsektor mit -O3 und bin noch nicht auf einen Fehler gestoßen, der nicht vorhanden gewesen wäre, wenn ich -O2 verwendet hätte.
Auf vielfachen Wunsch hier eine Ergänzung:
-O3 und insbesondere zusätzliche Flags wie -funroll-Schleifen (nicht von -O3 aktiviert) können manchmal dazu führen, dass mehr Maschinencode generiert wird. Unter bestimmten Umständen (z. B. auf einer CPU mit außergewöhnlich kleinem L1-Befehls-Cache) kann dies zu einer Verlangsamung führen, da der gesamte Code von z. B. einer inneren Schleife jetzt nicht mehr in L1I passt. Im Allgemeinen ist gcc sehr bemüht, nicht so viel Code zu generieren. Da dies jedoch normalerweise den generischen Fall optimiert, kann dies passieren. Besonders anfällige Optionen (wie das Abrollen von Schleifen) sind normalerweise nicht in -O3 enthalten und werden in der Manpage entsprechend gekennzeichnet. Daher ist es im Allgemeinen eine gute Idee, -O3 zum Generieren von schnellem Code zu verwenden und nur dann auf -O2 oder -Os (das versucht, die Codegröße zu optimieren) zurückzugreifen, wenn dies angemessen ist (z. B. wenn ein Profiler L1I-Fehler anzeigt).
Wenn Sie die Optimierung auf das Äußerste bringen möchten, können Sie gcc über --param anpassen, um die mit bestimmten Optimierungen verbundenen Kosten zu ermitteln. Beachten Sie außerdem, dass gcc jetzt die Möglichkeit hat, Funktionen, die die Optimierungseinstellungen nur für diese Funktionen steuern, Attribute zuzuweisen. Wenn Sie also ein Problem mit -O3 in einer Funktion haben (oder spezielle Flags nur für diese Funktion ausprobieren möchten), Sie müssen nicht die gesamte Datei oder das gesamte Projekt mit O2 kompilieren.
otoh es scheint, dass bei der Verwendung von -Ofast Vorsicht geboten ist, in der es heißt:
-Ofast aktiviert alle -O3-Optimierungen. Es ermöglicht auch Optimierungen, die nicht für alle standardkonformen Programme gültig sind.
was mich zu dem Schluss bringt, dass -O3 vollständig standardkonform sein soll.