ループ不変式の移動
loop-invariant code motion
ループの各繰り返しで不変な計算をループの外へくくり出す
不変式を全て外に出すことができるわけではない
意外と考えることが多そうなので、ちゃんと勉強するときは『コンパイラとバーチャルマシン』.icon p.101~を読み直すmrsekut.icon
例
code:c
i=1;
do{
c=a/b;x=i*c;...i++;
}while(i<n)
↓
i=1;t=a/b; // ループの外へくくりだした. a/bの計算が1回のみ行われる
do{
c=t;x=i*c;,...i++;
}while(i<n);
↓
i=1;c=a/b; // 一時変数tの導入は不要なので、さらに最適化できた
do{
x=i*c;,...i++;
}while(i<n);
参考
アルゴリズムなど