[llvm-commits] [llvm] r63474 - in /llvm/trunk: lib/CodeGen/SelectionDAG/SelectionDAG.cpp test/CodeGen/X86/neg_fp.ll

Mon P Wang wangmp at apple.com
Fri Jan 30 22:07:51 PST 2009


Author: wangmp
Date: Sat Jan 31 00:07:45 2009
New Revision: 63474

URL: http://llvm.org/viewvc/llvm-project?rev=63474&view=rev
Log:
If unsafe FP optimization is not set, don't allow -(A-B) => B-A because
when A==B, -0.0 != +0.0.

Added:
    llvm/trunk/test/CodeGen/X86/neg_fp.ll
Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=63474&r1=63473&r2=63474&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Sat Jan 31 00:07:45 2009
@@ -2357,7 +2357,8 @@
       return Operand.getOperand(0);
     break;
   case ISD::FNEG:
-    if (OpOpcode == ISD::FSUB)   // -(X-Y) -> (Y-X)
+    // -(X-Y) -> (Y-X) is unsafe because when X==Y, -0.0 != +0.0
+    if (UnsafeFPMath && OpOpcode == ISD::FSUB)
       return getNode(ISD::FSUB, VT, Operand.getNode()->getOperand(1),
                      Operand.getNode()->getOperand(0));
     if (OpOpcode == ISD::FNEG)  // --X -> X

Added: llvm/trunk/test/CodeGen/X86/neg_fp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/neg_fp.ll?rev=63474&view=auto

==============================================================================
--- llvm/trunk/test/CodeGen/X86/neg_fp.ll (added)
+++ llvm/trunk/test/CodeGen/X86/neg_fp.ll Sat Jan 31 00:07:45 2009
@@ -0,0 +1,12 @@
+; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse41 -o %t -f
+; RUN: grep xorps %t | count 1
+
+; Test that when we don't -enable-unsafe-fp-math, we don't do the optimization
+; -0 - (A - B) to (B - A) because A==B, -0 != 0
+
+define float @negfp(float %a, float %b) {
+entry:
+	%sub = sub float %a, %b		; <float> [#uses=1]
+	%neg = sub float -0.000000e+00, %sub		; <float> [#uses=1]
+	ret float %neg
+}
\ No newline at end of file





More information about the llvm-commits mailing list