gcc 4.3.0 評価4
gcc 4.3.0 評価1 gcc 4.3.0 評価2 gcc 4.3.0 評価3
Yet Another Ranha経由で、末尾再帰 - odz bufferにあたりました。
確かにこんな話があったような気がするけどちゃんと見てなかったなぁ。
情報を総合するとgcc -O2なら以前のgccでも末尾再帰っぽい関数は展開されてたけれど、gcc -O3にしたら他の最適化が影響して展開されてなかった。でもgcc 4.3.0は-O3でも展開するよん。
ってとこかしら?実際にやってみないとな。gcc 4.2.3 -O2での結果です。
ちゃんとループに変わってますね。
_Z4factii: pushl %ebp cmpl $1, %eax movl %esp, %ebp jle .L3 .L6: imull %eax, %edx subl $1, %eax cmpl $1, %eax jne .L6 .L3: popl %ebp movl %edx, %eax ret _Z3fooi: pushl %ebp testl %eax, %eax movl %esp, %ebp movl $1, %edx jle .L14 .L13: imull %eax, %edx subl $1, %eax jne .L13 .L14: popl %ebp movl %edx, %eax ret
ちなみにgcc 4.3.0との違いはstaticな関数が4.2.3ではcallされるけど、4.3.0ではmainに展開されちゃっていることぐらいかな?
まあ結論としては4.3.0になって-O3が付けやすくなったということですかね。昔から-O3ばっかりな私としては朗報です。