toge's diary

コンピュータ関連の趣味をつらつらと。

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ばっかりな私としては朗報です。