最適化の有無で変わった事と言うと、この前こんなことがあった。 (以下の A, B は typedef された構造体)
A *p = NULL; B *q = NULL;
if (...) { A x;
/* x の初期化などをする。 */
p = &x; }
if (...) { B y;
/* y の初期化などをする。 */
q = &y; }
この後で p が NULL でなければ p の指す先を使おうとして死亡。
まあ、ブロック(というかスコープ)から外れた所で使ってるんだから当然と言えば当然ではあるが、 最適化しない場合は x, y はその他のブロック外の自動変数と同じようにスタックに領域が取られ ていて変化する事がなかった。そのため内容は保たれた。 しかし最適化したら A の領域は A のあるブロックから外に出たら破棄されたと解釈され、そして B のあるブロックの B の領域として上の A の領域を使用するようになっていた。そのため x と y の指す先は union のように重なってしまっておかしくなったと。