diff options
author | Duncan Sands <baldrick@free.fr> | 2012-04-08 18:08:12 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2012-04-08 18:08:12 +0000 |
commit | 3ef3fcfc0414b96d626b706c6151596684b7d134 (patch) | |
tree | d3be66c997afe87dfd18329a2c371ba40fde5bb6 | |
parent | f873dde50264ffab16f3d12eaec8be91edfcc131 (diff) |
Only have codegen turn fdiv by a constant into fmul by the reciprocal
when -ffast-math, i.e. don't just always do it if the reciprocal can
be formed exactly. There is already an IR level transform that does
that, and it does it more carefully.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154296 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 8 | ||||
-rw-r--r-- | test/CodeGen/X86/fdiv.ll | 15 |
2 files changed, 7 insertions, 16 deletions
diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index ebffb8562e..f1b9f4385e 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -5725,16 +5725,14 @@ SDValue DAGCombiner::visitFDIV(SDNode *N) { if (N0CFP && N1CFP && VT != MVT::ppcf128) return DAG.getNode(ISD::FDIV, N->getDebugLoc(), VT, N0, N1); - // fold (fdiv X, c2) -> fmul X, 1/c2 if there is no precision loss or if - // losing precision is acceptable. - if (N1CFP && VT != MVT::ppcf128) { + // fold (fdiv X, c2) -> fmul X, 1/c2 if losing precision is acceptable. + if (N1CFP && VT != MVT::ppcf128 && DAG.getTarget().Options.UnsafeFPMath) { // Compute the reciprocal 1.0 / c2. APFloat N1APF = N1CFP->getValueAPF(); APFloat Recip(N1APF.getSemantics(), 1); // 1.0 APFloat::opStatus st = Recip.divide(N1APF, APFloat::rmNearestTiesToEven); // Only do the transform if the reciprocal is not too horrible (eg not NaN). - if (st == APFloat::opOK || (st == APFloat::opInexact && - DAG.getTarget().Options.UnsafeFPMath)) + if (st == APFloat::opOK || st == APFloat::opInexact) return DAG.getNode(ISD::FMUL, N->getDebugLoc(), VT, N0, DAG.getConstantFP(Recip, VT)); } diff --git a/test/CodeGen/X86/fdiv.ll b/test/CodeGen/X86/fdiv.ll index 553f14efa1..82b9190b9a 100644 --- a/test/CodeGen/X86/fdiv.ll +++ b/test/CodeGen/X86/fdiv.ll @@ -1,22 +1,17 @@ -; RUN: llc < %s -march=x86-64 | FileCheck %s -; RUN: llc < %s -march=x86-64 -enable-unsafe-fp-math | FileCheck -check-prefix=UNSAFE %s +; RUN: llc < %s -march=x86-64 -enable-unsafe-fp-math | FileCheck %s define double @exact(double %x) { -; Exact division by a constant always converted to multiplication. +; Exact division by a constant converted to multiplication. ; CHECK: @exact ; CHECK: mulsd -; UNSAFE: @exact -; UNSAFE: mulsd %div = fdiv double %x, 2.0 ret double %div } define double @inexact(double %x) { -; Inexact division by a constant converted to multiplication if unsafe-math. +; Inexact division by a constant converted to multiplication. ; CHECK: @inexact -; CHECK: divsd -; UNSAFE: @inexact -; UNSAFE: mulsd +; CHECK: mulsd %div = fdiv double %x, 0x41DFFFFFFFC00000 ret double %div } @@ -25,8 +20,6 @@ define double @funky(double %x) { ; No conversion to multiplication if too funky. ; CHECK: @funky ; CHECK: divsd -; UNSAFE: @funky -; UNSAFE: divsd %div = fdiv double %x, 0.0 ret double %div } |