OSDN Git Service

If unsafe FP optimization is not set, don't allow -(A-B) => B-A because
authorMon P Wang <wangmp@apple.com>
Sat, 31 Jan 2009 06:07:45 +0000 (06:07 +0000)
committerMon P Wang <wangmp@apple.com>
Sat, 31 Jan 2009 06:07:45 +0000 (06:07 +0000)
when A==B, -0.0 != +0.0.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63474 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAG.cpp
test/CodeGen/X86/neg_fp.ll [new file with mode: 0644]

index bda9d93..f5287b0 100644 (file)
@@ -2357,7 +2357,8 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,
       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
diff --git a/test/CodeGen/X86/neg_fp.ll b/test/CodeGen/X86/neg_fp.ll
new file mode 100644 (file)
index 0000000..55c7654
--- /dev/null
@@ -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