Implement the 'store FPIMM, Ptr' -> 'store INTIMM, Ptr' optimization for
authorChris Lattner <sabre@nondot.org>
Sat, 8 Jan 2005 06:25:56 +0000 (06:25 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 8 Jan 2005 06:25:56 +0000 (06:25 +0000)
all targets.

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

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

index 996f116f8ddf0dd9da2ae42c2017089b2df5d4e5..4d6d0ebacaed0f6863b54f5038692c5cae336065 100644 (file)
@@ -424,6 +424,31 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
     Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
     Tmp2 = LegalizeOp(Node->getOperand(2));  // Legalize the pointer.
 
+    // Turn 'store float 1.0, Ptr' -> 'store int 0x12345678, Ptr'
+    if (ConstantFPSDNode *CFP =
+        dyn_cast<ConstantFPSDNode>(Node->getOperand(1))) {
+      if (CFP->getValueType(0) == MVT::f32) {
+        union {
+          unsigned I;
+          float    F;
+        } V;
+        V.F = CFP->getValue();
+        Result = DAG.getNode(ISD::STORE, MVT::Other, Tmp1,
+                             DAG.getConstant(V.I, MVT::i32), Tmp2);
+      } else {
+        assert(CFP->getValueType(0) == MVT::f64 && "Unknown FP type!");
+        union {
+          uint64_t I;
+          double   F;
+        } V;
+        V.F = CFP->getValue();
+        Result = DAG.getNode(ISD::STORE, MVT::Other, Tmp1,
+                             DAG.getConstant(V.I, MVT::i64), Tmp2);
+      }
+      Op = Result;
+      Node = Op.Val;
+    }
+
     switch (getTypeAction(Node->getOperand(1).getValueType())) {
     case Legal: {
       SDOperand Val = LegalizeOp(Node->getOperand(1));