setn命令をサポートしたら速度が落ちた

YARVにはsetnという命令があります。これをずっとサポートしていなかったのですが、なぜかAOベンチはこの命令を使っているのに動いていました。それはこういう状況で使っているからです。

            if isect.hit then
              col = ambient_occlusion(isect)
              rad.x = rad.x + col.x
              rad.y = rad.y + col.y
              rad.z = rad.z + col.z
            end

ここで、if式の値はrad.z + col.zなんですが、この値はrad.zに格納するのにも使っています。そこで、こんなコードを生成しています。

   NILをPUSH                                                                    (1)
   radをPUSH                                                                    
   rad.z + col.zを計算してその結果をPUSH                                        (2)
   setn命令でスタックトップから2つ下((1)でPUSHしたNIL)を(2)の値で書き換える
   rad#z=メソッドを呼び出す
   rad#z=の戻り値を捨てる

結局、AOベンチではif式の値を使っていないのでsetnをサポートしていなくても問題なかったのでした。
ところが、昨日setnをサポートしたらAOベンチの速度が1割落ちてしまいました。これまで、NILを返すだけだったメソッドがDouble型を返すようになったためだと思いますが、これだけで1割速度低下とは驚きです。メソッドの型が変わっただけで処理が増えたわけじゃないですが。

そういうことで、setnをどうサポートすればいいか悩んでいます。サポートしないとif式の値が使えないし・・・。