En los primeros días de gcc (2.8, etc.) y en los tiempos de egcs, y redhat 2.96 -O3 era bastante defectuoso a veces. Pero esto fue hace más de una década, y -O3 no es muy diferente a otros niveles de optimizaciones (en errores).
Sin embargo, tiende a revelar casos en los que las personas confían en un comportamiento indefinido, debido a que se basan más estrictamente en las reglas, y especialmente en los casos esquimales, de los idiomas.
Como nota personal, llevo muchos años ejecutando software de producción en el sector financiero con -O3 y todavía no he encontrado un error que no hubiera estado allí si hubiera usado -O2.
Por demanda popular, aquí una adición:
-O3 y especialmente indicadores adicionales como -funroll-loops (no habilitado por -O3) a veces pueden generar más código de máquina. Bajo ciertas circunstancias (por ejemplo, en una CPU con caché de instrucciones L1 excepcionalmente pequeña) esto puede causar una desaceleración debido a todo el código de, por ejemplo, algún bucle interno que ahora ya no se ajusta a L1I. En general, gcc se esfuerza por no generar tanto código, pero como generalmente optimiza el caso genérico, esto puede suceder. Las opciones especialmente propensas a esto (como el desenrollado de bucle) normalmente no se incluyen en -O3 y se marcan en consecuencia en la página de manual. Como tal, generalmente es una buena idea usar -O3 para generar código rápido, y solo recurrir a -O2 u -Os (que intenta optimizar el tamaño del código) cuando sea apropiado (por ejemplo, cuando un generador de perfiles indica que L1I falla).
Si desea llevar la optimización al extremo, puede modificar gcc a través de --param los costos asociados con ciertas optimizaciones. Además, tenga en cuenta que gcc ahora tiene la capacidad de poner atributos en las funciones que controlan la configuración de optimización solo para estas funciones, por lo que cuando encuentre que tiene un problema con -O3 en una función (o si desea probar indicadores especiales solo para esa función), no necesita compilar todo el archivo o incluso todo el proyecto con O2.
otoh parece que se debe tener cuidado al usar -Ofast, que establece:
-Ofast habilita todas las optimizaciones de -O3. También permite optimizaciones que no son válidas para todos los programas compatibles estándar.
lo que me hace concluir que -O3 está destinado a cumplir totalmente con los estándares.