[llvm-commits] [llvm] r37842 - /llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Dan Gohman djg at cray.com
Mon Jul 2 08:48:56 PDT 2007


Author: djg
Date: Mon Jul  2 10:48:56 2007
New Revision: 37842

URL: http://llvm.org/viewvc/llvm-project?rev=37842&view=rev
Log:
Teach GetNegatedExpression to negate 0-B to B in UnsafeFPMath mode, and
visitFSUB to fold 0-B to -B in UnsafeFPMath mode. Also change visitFNEG
to use isNegatibleForFree/GetNegatedExpression instead of doing a subset
of the same thing manually.

This fixes test/CodeGen/X86/negative-sin.ll.

Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=37842&r1=37841&r2=37842&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Jul  2 10:48:56 2007
@@ -429,6 +429,11 @@
   case ISD::FSUB:
     // We can't turn -(A-B) into B-A when we honor signed zeros. 
     assert(UnsafeFPMath);
+
+    // -(0-B) -> B
+    if (ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(Op.getOperand(0)))
+      if (N0CFP->getValue() == 0.0)
+        return Op.getOperand(1);
     
     // -(A-B) -> B-A
     return DAG.getNode(ISD::FSUB, Op.getValueType(), Op.getOperand(1),
@@ -3025,6 +3030,12 @@
   // fold (fsub c1, c2) -> c1-c2
   if (N0CFP && N1CFP)
     return DAG.getNode(ISD::FSUB, VT, N0, N1);
+  // fold (0-B) -> -B
+  if (UnsafeFPMath && N0CFP && N0CFP->getValue() == 0.0) {
+    if (isNegatibleForFree(N1))
+      return GetNegatedExpression(N1, DAG);
+    return DAG.getNode(ISD::FNEG, VT, N1);
+  }
   // fold (A-(-B)) -> A+B
   if (isNegatibleForFree(N1))
     return DAG.getNode(ISD::FADD, VT, N0, GetNegatedExpression(N1, DAG));
@@ -3297,18 +3308,10 @@
 
 SDOperand DAGCombiner::visitFNEG(SDNode *N) {
   SDOperand N0 = N->getOperand(0);
-  ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0);
-  MVT::ValueType VT = N->getValueType(0);
 
-  // fold (fneg c1) -> -c1
-  if (N0CFP)
-    return DAG.getNode(ISD::FNEG, VT, N0);
-  // fold (fneg (sub x, y)) -> (sub y, x)
-  if (N0.getOpcode() == ISD::SUB)
-    return DAG.getNode(ISD::SUB, VT, N0.getOperand(1), N0.getOperand(0));
-  // fold (fneg (fneg x)) -> x
-  if (N0.getOpcode() == ISD::FNEG)
-    return N0.getOperand(0);
+  if (isNegatibleForFree(N0))
+    return GetNegatedExpression(N0, DAG);
+
   return SDOperand();
 }
 





More information about the llvm-commits mailing list