SSEバグ

SSEを使ってプログラムの最適化をしていたんですが,ある変数の値を読むときに不定期にアクセス違反が発生するという問題が起きてました.それで6時間ぐらい悩まされ続けた結果,ようやく結論を発見.

Visual Studio 2005のTeamSuiteとExpressバージョンのC++で試しましたが、 WIN32コンソールプロジェクトを作成し、以下のようなコードを書いて実行すると、最適化したときのみ、実行時に例外が発生します。
#include 

float a[4]={0,0,0,0};
float b[4];

int main()
{
 __m128 m = _mm_loadu_ps( a );
 _mm_storeu_ps( b,m );
 return 0;
}
実行すると、「0x00401006 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xffffffff を読み込み中にアクセス違反が発生しました。」のような例外が発生します。 最適化をかけた時のみ例外が発生し、デバッグビルド時には発生せず、逆アセンブラを見ると、本来、movupsになっていないといけないはずのところが、movapsになっています。 VS2003 C++では、ちゃんと動作していました。

なんだかホッとしたようなそうでないような.逆アセコードとずっとにらめっこしてたんですが,なかなか気づきませんでした.これでやっと先に進めます.