
x86エミュレータチーム、ひどいコンパイラ最適化を手作業で修正
x86エミュレータチームは、コンパイラのループ展開により64キロバイトのデータ初期化に256キロバイトものコードを生成するプログラムを発見。エミュレータの翻訳器に特別なコードを追加して、この関数を検出し、効率的なループに置き換えた。
Windowsの非x86システム向けx86-32プロセッサエミュレータが搭載されていた時代、x86エミュレータチームはバイナリ翻訳を用いてネイティブコードを生成していた。あるプログラムでは、スタック上に約64キロバイトのメモリを割り当てて初期化する必要があった。
コンパイラの過度な最適化
通常のアプローチでは、スタックプローブを実行してスタックポインタから65536を減算し、ループで初期化を行う。ところがこのプログラムに使用されたコンパイラは、ループを展開して65,536個の個別の「メモリへバイト書き込み」命令に変換した。各命令は4バイト長であり、合計すると64キロバイトのデータを初期化するために256キロバイトものコードが生成されることになった。
エミュレータチームの対応
「このようなことは何度も起きた。ただし、この特定の話がどのプロセッサに適用されたかは知らない」と、この事案に関わった関係者の述べている通り、同様の問題は複数回発生していた。256キロバイトの無駄なコードサイズはエミュレータチームの怒りを買い、彼らは翻訳器にこの悪質な関数を検出して等価の効率的なループに置き換える特別なコードを追加することになった。
この記事は元記事の事実のみに基づいて自動生成されました。
出典
The Old New Thing、「The time the x86 emulator team found code so bad that they fixed it during emulation」、https://devblogs.microsoft.com/oldnewthing/20260615-00/?p=112419