Sun Studio コンパイラを使用して、最適化をひどく台無しにすることなく、認識可能なコード シーケンスを挿入する方法を知っている人はいますか?
Sun Studio (12.1) コンパイラがいくつかのインスタンスでコードの一部をどのように処理するかを確認したいと考えており、生成されたコードを認識可能な一連の no-op 命令でマークする方法を探していたので、私のコードの断片を見つけることができました。私の最初の試みは次を使用しました:
asm volatile ("nop ; nop ; nop ") ;
// ... <stuff I want to look at here> ...
asm volatile ("nop ; nop ; nop ; nop ; nop") ;
ただし、これを使用すると、コンパイラは最適化されていないコードを nop ブロック内に生成します。例:
nop
nop
nop
ld [%sp + 0x8bf], %g2
srl %g2, 0x0, %g3
sllx %g3, 0x2, %g4
ld [%sp + 0x8c3], %g5
ldx [%sp + 0x8c7], %o2
st %g5, [%o2 + %g4]
ld [%sp + 0x8b7], %o3
ldx [%sp + 0x8c7], %o4
st %o3, [%o4 + 0x28]
nop
nop
nop
nop
nop
問題のコードは、2 つの店舗だけです。sparc アセンブリについてはよくわかりませんが、これはコンパイラが nop ブロック内のコードの最適化を完全にあきらめたようです。ldx [%sp + 0x8c7], %o4
たとえば、ストアのベース アドレスを ですでに再計算しているのに、新しいロード を生成するのはなぜでしょう%02
か。
周囲のコードを一目見ただけで、使用されている asm volatile の近くのどこでも最適化されていない可能性があります。
代わりに次のことを試し、このインライン asm で .il ファイルを作成しました。
.inline DO_Nop3,0
nop
nop
nop
.end
.inline DO_Nop5,0
nop
nop
nop
nop
nop
.end
私のソースで次のように:
extern "C" void DO_Nop3() ;
extern "C" void DO_Nop5() ;
これを使用すると、逆の問題が発生します。コンパイラは賢すぎて、nop 命令を完全に排除します (ブロック内の命令の副作用を見て、.inline
後で、正しくこれを決定すると推測しています)。何もせず、そのコードを投げ捨てます)。
より良い方法はありますか?