g++ を使用して、ループ不変コードのモーション最適化の結果を確認することにしました。しかし、次のコードをコンパイルして-fmove-loop-invariants
そのアセンブリを分析しk + 17
たところ、ループ本体でまだ計算が実行されていることがわかりました。
コンパイラがそれを最適化するのを妨げるものは何ですか?
コンパイラは、再計算する方が効率的であると結論付けているのk + 17
でしょうか?
int main()
{
int k = 0;
std::cin >> k;
for (int i = 0; i < 10000; ++i)
{
int n = k + 17; // not moved out of the loop
printf("%d\n", n);
}
return 0;
}
g++ 4.6.3 と g++ 4.8.3 の両方を使用して試しg++ -O0 -fmove-loop-invariants
てみました。g++ -O3
g++ -O3 -fmove-loop-invariants