続 vorbisencとbcc32

どうもalloca()前後のコードがおかしい感じです。
C++BuilderのCPUウィンドウからのコピペです。

mapping0.c.614: sortindex[i]=alloca(sizeof(**sortindex)*n/2);
00430A26 6A00             push $00
00430A28 8B55C8           mov edx,[ebp-$38]
00430A2B C1E202           shl edx,$02
00430A2E D1EA             shr edx,1
00430A30 52               push edx
00430A31 E8CC240500       call $00482f02
00430A36 59               pop ecx
00430A37 8B8DE0FEFFFF     mov ecx,[ebp-$00000120]
00430A3D 8B45C0           mov eax,[ebp-$40]
00430A40 890481           mov [ecx+eax*4],eax

ebp-$40」はi、つまりループカウンタです。
最後のmovはalloca()の結果をsortindex[i]に代入しているつもりなんでしょうが、直前のmovでiの値に書き換えられています。これでは、

alloca(sizeof(**sortindex)*n/2);
sortindex[i]=i;

という意味になってしまいます。駄目元で、

void* tmp = alloca(sizeof(**sortindex)*n/2);
sortindex[i]=tmp;

と書き換えたところ、とりあえず(ここは)動きました。最適化の設定如何によっては動かないかもしれません。
というわけで、どうも原因はコンパイラのバグっぽいです。