私はコードの最適化に取り組んでおり、gccの内部を調べています。プログラムで簡単な式を作成し、その式のgimple表現を確認したところ、gccがこれを行った理由がわかりませんでした。式があるとしましょう:
if(i < 9)
次に、gimple表現では、次のように変換されます。
if(i <= 8)
gccがこれを行う理由がわかりません。それはある種の最適化ですか?そうであれば、誰かが私たちのプログラムを最適化する方法を教えてもらえますか?
私はコードの最適化に取り組んでおり、gccの内部を調べています。プログラムで簡単な式を作成し、その式のgimple表現を確認したところ、gccがこれを行った理由がわかりませんでした。式があるとしましょう:
if(i < 9)
次に、gimple表現では、次のように変換されます。
if(i <= 8)
gccがこれを行う理由がわかりません。それはある種の最適化ですか?そうであれば、誰かが私たちのプログラムを最適化する方法を教えてもらえますか?
次の C コードを検討してください。
int i = 10;
if(i < 9) {
puts("1234");
}
また、同等の C コード:
int i = 10;
if(i <= 8) {
puts("asdf");
}
最適化なしでは、どちらもまったく同じアセンブリ シーケンスを生成します。
40052c: c7 45 fc 0a 00 00 00 movl $0xa,-0x4(%rbp)
400533: 83 7d fc 08 cmpl $0x8,-0x4(%rbp)
400537: 7f 0a jg 400543 <main+0x1f>
400539: bf 3c 06 40 00 mov $0x40063c,%edi
40053e: e8 d5 fe ff ff callq 400418 <puts@plt>
400543: .. .. .. .. .. .. ..
私は GCC の実装に精通していないので、変換が行われる理由について推測することしかできません。単一のケースのみを処理する必要があるため、コード ジェネレーターの作業が容易になる可能性があります。誰かがより明確な答えを思い付くことができると思います。