OSDN Git Service

revert r243687: enable fast-math-flag propagation to DAG nodes
authorSanjay Patel <spatel@rotateright.com>
Wed, 5 Aug 2015 15:12:03 +0000 (15:12 +0000)
committerSanjay Patel <spatel@rotateright.com>
Wed, 5 Aug 2015 15:12:03 +0000 (15:12 +0000)
commit3e95f497780a669b4c770e784f9d437cd55a1128
tree58fd60f332433116565d7605f3ba7a07fbe4e458
parent7e16546ad8e3a854365e3b3ace33c78d98666f11
revert r243687: enable fast-math-flag propagation to DAG nodes

We can't propagate FMF partially without breaking DAG-level CSE. We either need to
relax CSE to account for mismatched FMF as a temporary work-around or fully propagate
FMF throughout the DAG.

Surprisingly, there are no existing regression tests for this, but here's an example:

  define float @fmf(float %a, float %b) {
    %mul1 = fmul fast float %a, %b
    %nega = fsub fast float 0.0, %a
    %mul2 = fmul fast float %nega, %b
    %abx2 = fsub fast float %mul1, %mul2
    ret float %abx2
  }

$ llc -o - badflags.ll -march=x86-64 -mattr=fma -enable-unsafe-fp-math -enable-fmf-dag=0
...
    vmulss    %xmm1, %xmm0, %xmm0
    vaddss    %xmm0, %xmm0, %xmm0
    retq

$ llc -o - badflags.ll -march=x86-64 -mattr=fma -enable-unsafe-fp-math -enable-fmf-dag=1
...
    vmulss    %xmm1, %xmm0, %xmm2
    vfmadd213ss    %xmm2, %xmm1, %xmm0  <--- failed to recognize that (a * b) was already calculated
    retq

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244053 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp