5

上記を参照。私はサンプル関数に書きました:

source.ll:

define i32 @bleh(i32 %x) {
entry:
  %addtmp = add i32 %x, %x
  %addtmp1 = add i32 %addtmp, %x
  %addtmp2 = add i32 %addtmp1, %x
  %addtmp3 = add i32 %addtmp2, %x
  %addtmp4 = add i32 %addtmp3, 1
  %addtmp5 = add i32 %addtmp4, 2
  %addtmp6 = add i32 %addtmp5, 3
  %multmp = mul i32 %x, 3
  %addtmp7 = add i32 %addtmp6, %multmp
  ret i32 %addtmp7
}

source-fp.ll:

define double @bleh(double %x) {
entry:
  %addtmp = fadd double %x, %x
  %addtmp1 = fadd double %addtmp, %x
  %addtmp2 = fadd double %addtmp1, %x
  %addtmp3 = fadd double %addtmp2, %x
  %addtmp4 = fadd double %addtmp3, 1.000000e+00
  %addtmp5 = fadd double %addtmp4, 2.000000e+00
  %addtmp6 = fadd double %addtmp5, 3.000000e+00
  %multmp = fmul double %x, 3.000000e+00
  %addtmp7 = fadd double %addtmp6, %multmp
  ret double %addtmp7
}

両方の関数を使用して最適化すると、なぜですか

opt -O3 source[-fp].ll -o opt.source[-fp].ll -S

最適化されi32ますが、最適化されdoubleませんか?faddが1つに結合されることを期待していましたfmul。代わりに、まったく同じように見えます。

フラグの設定が違うためですか?私は、のために可能であり、のために実行できi32ない特定の最適化を知っていdoubleます。しかし、単純な定数畳み込みがないことは、私の理解を超えています。

LLVM3.1を使用しています。

4

1 に答える 1

7

最適化が不可能であると言うのは正確ではありません。最初の数行を見て、変換が許可されている場所と許可されていない場所を示します。

  %addtmp = fadd double %x, %x

この最初の行は安全にに変換できますがfmul double %x 2.0e+0、これは実際にはほとんどのアーキテクチャでの最適化ではありません(fadd通常、と同じかそれよりも高速でfmulあり、定数を生成する必要はありません2.0)。オーバーフローを除いて、この操作は正確であることに注意してください(2の累乗によるすべてのスケーリングと同様)。

  %addtmp1 = fadd double %addtmp, %x

この行はに変換できますfmul double %x 3.0e+0。なぜこれが法的な変革なのですか?生成された計算は正確であったため、これがとして計算されるか%addtmp、として計算されるかにかかわらず、1回の丸めのみが発生します。これらはIEEE-754の基本操作であり、したがって正しく丸められるため、結果はどちらの方法でも同じです。オーバーフローはどうですか?もう一方もオーバーフローしない限り、どちらもオーバーフローすることはありません。x * 3x + x + x

  %addtmp2 = fadd double %addtmp1, %x

これは、法的に定数*xに変換できない最初の行です。 4 * xは、丸めなしで正確に計算しますが、2つの丸めが発生しますx + x + x + x。1回丸めx + x + xられた後、加算xすると2回目の丸めが発生する場合があります。

  %addtmp3 = fadd double %addtmp2, %x

ここに同上。5 * x1回の丸めが発生します。x + x + x + x + x3つ発生します。

有益に変換される可能性のある唯一の行は、に置き換えるx + x + xこと3 * xです。ただし、部分式x + xはすでに他の場所に存在するため、オプティマイザーはこの変換を使用しないことを簡単に選択できます(使用しない場合は既存の部分的な結果を利用できるため)。

于 2012-08-13T21:56:30.060 に答える