gcc 4.4.6
ドキュメントには次のように記載されています。
-funroll-all-loops: Unroll all loops, even if their number of iterations is uncertain when the loop isentered.
私はこのコードをコンパイルしています:
int unroll(){
int i = 0;
int array[1000];
do {
use(i,array);
i++;
}while(i<1000);
return(0);
}
void use(int i, int *array){
int x = i*5;
array[i] = x;
}
...一度はfunroll-all-loops
最適化あり、一度はなし:
OPT = -funroll-all-loops
NOOPT = -O0
次にdiff
、それぞれのアセンブリ コード (を使用して作成) を比較し-S -fverbose-asm
ます。
生成されるコードは同じです。
ループをdo while
;に変更してみました。ループ カウンターの調整 (最大 100)。ループ本体内のステートメントを変更します。
何が欠けている可能性がありますか?このループが展開されないのはなぜですか?
アップデート
Nikos C--param max-unroll-times=N
は、N を上限としてループ登録パラメータを上げることを提案しました。これは賢明な提案でしたが、動作は変わりませんでした。また、ループの反復回数を 10 回に減らしました。また、実際に何かを「実行」するようにコードを更新しましたが、変更はありません。