最適化オンルベツ
LW9.xで問題無いPivotRotHelperがLW75/85で即死するようになってた。
msgFuncで何処で落ちてるのか確認するも、落ちてる所に怪しいところは無し。
Dr.Watsonのログを見るとUSER32との絡みでframe云々と書いて有るけど意味わかんねぇ(;・з・)
if(LW9) foo(c);
else bar(c);
func(a,b,c);
func(a, b, c){ // 実際は配列でポインタだけど省略
x1,x2, y, z;
y = -b;
func2(x1, y);
z = -c;
func2(x2, z);
func3(x1, x2);
func4(x1, a);
}
てな流れなんだけど、y=やz=の前にmsgFuncを仕込んでると落ちない。
y=の前だけだと落ちるけど、z=前だけだと落ちない。
ワトソン先生がframe云々言ってたからと、-fomit-frame-pointerを削ってみるも変化なし。
幸い、b,cは書き換えて構わない要素だったからy=,z=の変わりにb=,c=としたら落ちなくなった。
以前に「ちょっと違う内容での繰り返し動作」の最適化でおかしくなるのを体験してたし、最適化を切ってみたら案の定正常動作するようになった。
if(LW9)を通った時のみ問題が出ないコンパイルがされるようになってたっぽい(;;・з・)
2箇所から呼ばれる関数だけど、msgFuncが無い時はベタに展開した方が良いと判断されて親関数に取り込みはしたけどスタック操作が変で死亡。とかだったのかねぇ。
まぁ、なんの事はない、いや~んまいっちんぐだったとさ、というお話し。
----
MinGW GCC -O2に関数のインライン展開は含まれてなかった(;;・з・)
-O3にして展開するようにしたら上記の問題は出なくなった。
むぅ(;;・з・)何故だ。
msgFuncで何処で落ちてるのか確認するも、落ちてる所に怪しいところは無し。
Dr.Watsonのログを見るとUSER32との絡みでframe云々と書いて有るけど意味わかんねぇ(;・з・)
if(LW9) foo(c);
else bar(c);
func(a,b,c);
func(a, b, c){ // 実際は配列でポインタだけど省略
x1,x2, y, z;
y = -b;
func2(x1, y);
z = -c;
func2(x2, z);
func3(x1, x2);
func4(x1, a);
}
てな流れなんだけど、y=やz=の前にmsgFuncを仕込んでると落ちない。
y=の前だけだと落ちるけど、z=前だけだと落ちない。
ワトソン先生がframe云々言ってたからと、-fomit-frame-pointerを削ってみるも変化なし。
幸い、b,cは書き換えて構わない要素だったからy=,z=の変わりにb=,c=としたら落ちなくなった。
以前に「ちょっと違う内容での繰り返し動作」の最適化でおかしくなるのを体験してたし、最適化を切ってみたら案の定正常動作するようになった。
if(LW9)を通った時のみ問題が出ないコンパイルがされるようになってたっぽい(;;・з・)
2箇所から呼ばれる関数だけど、msgFuncが無い時はベタに展開した方が良いと判断されて親関数に取り込みはしたけどスタック操作が変で死亡。とかだったのかねぇ。
まぁ、なんの事はない、いや~んまいっちんぐだったとさ、というお話し。
----
MinGW GCC -O2に関数のインライン展開は含まれてなかった(;;・з・)
-O3にして展開するようにしたら上記の問題は出なくなった。
むぅ(;;・з・)何故だ。
この記事へのコメント