Nos primeiros dias do gcc (2.8 etc.) e nos tempos do egcs, e redhat 2.96 -O3 às vezes era bastante complicado. Mas isso foi há mais de uma década, e -O3 não é muito diferente de outros níveis de otimizações (em buggy).
No entanto, tende a revelar casos em que as pessoas confiam em comportamento indefinido, devido a confiar mais estritamente nas regras, e especialmente nos casos de canto, do (s) idioma (s).
Como observação pessoal, estou executando o software de produção no setor financeiro há muitos anos com o -O3 e ainda não encontrei um bug que não existiria se eu tivesse usado o -O2.
Pela demanda popular, aqui está uma adição:
-O3 e sinalizadores especialmente adicionais como -funroll-loops (não ativados por -O3) às vezes podem levar à geração de mais código de máquina. Sob certas circunstâncias (por exemplo, em uma CPU com cache de instrução L1 excepcionalmente pequeno), isso pode causar uma desaceleração devido a todo o código de, por exemplo, algum loop interno que agora não se encaixa mais no L1I. Geralmente, o gcc tenta bastante não gerar tanto código, mas como geralmente otimiza o caso genérico, isso pode acontecer. Opções especialmente propensas a isso (como desenrolar o loop) normalmente não são incluídas em -O3 e são marcadas de acordo na página de manual. Como tal, geralmente é uma boa ideia usar -O3 para gerar código rápido, e somente voltar a -O2 ou -Os (que tenta otimizar o tamanho do código) quando apropriado (por exemplo, quando um criador de perfil indica que L1I está ausente).
Se você quiser levar a otimização ao extremo, poderá ajustar o gcc via --param os custos associados a determinadas otimizações. Além disso, observe que o gcc agora tem a capacidade de colocar atributos em funções que controlam as configurações de otimização apenas para essas funções. Portanto, quando você encontrar um problema com -O3 em uma função (ou quiser experimentar sinalizadores especiais para essa função), você não precisa compilar o arquivo inteiro ou mesmo o projeto inteiro com o O2.
parece que é preciso ter cuidado ao usar -Ofast, que afirma:
-Ofast permite todas as otimizações de -O3. Ele também permite otimizações que não são válidas para todos os programas compatíveis com o padrão.
o que me leva a concluir que o -O3 deve ser totalmente compatível com os padrões.