while(1){LOVE++;}を最適化

最近ツイッター
"while(1){LOVE++}"と書き込まれてる指輪があって、
そのソースは最適化でLOVEが消えてただの無限ループになる云々という話があったので検証。
http://togetter.com/li/144840


用意したソースはこちら。

int main()
{
    int LOVE = 0;
    while(1){LOVE++;}
}


それじゃアセンブラを見てみましょ。
まずは最適化抜き。


gcc -O0 -s hoge.c

	.file	"hoge.c"
	.text
.globl main
	.type	main, @function
main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$16, %esp
	movl	$0, -4(%ebp)    ;LOVE=0
.L2:
	addl	$1, -4(%ebp)    ;LOVE++
	jmp	.L2             ;JUMP TO L2
	.size	main, .-main
	.ident	"GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
	.section	.note.GNU-stack,"",@progbits

LOVEは残ってますね。


gcc -O1 -s hoge.c

	.file	"hoge.c"
	.text
.globl main
	.type	main, @function
main:
	pushl	%ebp
	movl	%esp, %ebp
.L2:
	jmp	.L2           ;JUMP TO L2
	.size	main, .-main
	.ident	"GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
	.section	.note.GNU-stack,"",@progbits

愛は最適化によって消滅しました。

追記

なんかvolatileで最適化抑制すんじゃねっつー話らしいです。
あーvolatileね。あーうん、あれね。あれでしょ。あれ。
知ってる知ってる。えーとね。あれでしょ。


マルチスレッド云々書いてると最適化されたら困る時があるらしくって、そーいうのにつかうんだそーです。
ここが詳しかった。
http://proger.blog10.fc2.com/blog-entry-20.html