続 gcc-4.2.1-dw2-2でビルドしたbjamがクラッシュする問題

sjlj版でも再現したので、gcc4.2.1のバグと見なして追っかけてみました。
file_dirscan()では、

  • ディレクトリエントリのキャッシュを調べる
  • キャッシュされていなければ、_findfirst/_findnext使ってディレクトリエントリを作成、キャッシュに入れる

ということをやっているので、初回呼び出し時は_findfirst/_findnextの呼び出しに移るはずなのですが、いきなりキャッシュヒットしちゃっています。
原因は、

file_info_t * file_info(char * filename)
{
    file_info_t finfo_, *finfo = &finfo_;
    
    if ( !filecache_hash )
        filecache_hash = hashinit( sizeof( file_info_t ), "file_info" );
    
    finfo->name = filename;
    if ( hashenter( filecache_hash, (HASHDATA**)&finfo ) )
    {
        /* printf( "file_info: %s\n", filename ); */
        finfo->name = newstr( finfo->name );
        finfo->is_file = 0;
        finfo->is_dir = 0;
        finfo->size = 0;
        finfo->time = 0;
        finfo->files = 0;
    }
    
    return finfo;
}
filesys.c

の「〜 = 0」の部分が、最適化器のバグでごっそり消えていることでした。
この問題は次のコードで再現できました。

struct hoge
{
    int a;
};

void bar(struct hoge** p);

struct hoge* foo()
{
   struct hoge _h, *h = &_h;
   bar(&h);
   h->a = 0;
   return h;
}

「-fdump-tree-all」オプションで中間結果を確認すると、dce1のフェーズで「h->a = 0」が消えています。(dce=Dead Code Elimination)
で、Bugzillaで検索したらこんなのが見つかりました。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32328
多分、これでしょう。