よく C/C++ で言われる (むしろ最近は見なくなった (観測範囲の問題?)) 「-O3 はプログラムが壊れるから -O2 までにしておくべき」みたいなのは、本当に壊れているのはプログラムの方で、未定義動作が -O3 でアグレッシブにコンパイルされて意図せぬ挙動に変化しているだけの場合がほとんど。
UB だと何も保証されないので、たとえばコンパイラや標準ライブラリを別のものに変えたりプラットフォームを変えたりコンパイラのバージョンを上げたりコンパイルオプションを変えたり、あるいは単に再コンパイルしたりなど、あらゆる場面で「今まで動いていたのに新しいバグが発生した」のような状況になりうる。しかも再現も難しい