[llvm-commits] [llvm] r42980 - /llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

Chris Lattner sabre at nondot.org
Sun Oct 14 22:46:06 PDT 2007


Author: lattner
Date: Mon Oct 15 00:46:06 2007
New Revision: 42980

URL: http://llvm.org/viewvc/llvm-project?rev=42980&view=rev
Log:
One xform performed by LegalizeDAG is transformation of "store of fp" to "store of int".
Make two changes:
1) only xform "store of f32" if i32 is a legal type for the target.
2) only xform "store of f64" if either i64 or i32 are legal for the target.
3) if i64 isn't legal, manually lower to 2 stores of i32 instead of letting a
   later pass of legalize do it.  This is ugly, but helps future changes I'm 
   about to commit.


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

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

==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Oct 15 00:46:06 2007
@@ -2026,7 +2026,8 @@
       // together.
       // We generally can't do this one for long doubles.
       if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(ST->getValue())) {
-        if (CFP->getValueType(0) == MVT::f32) {
+        if (CFP->getValueType(0) == MVT::f32 && 
+            getTypeAction(MVT::i32) == Legal) {
           Tmp3 = DAG.getConstant((uint32_t)CFP->getValueAPF().
                                           convertToAPInt().getZExtValue(),
                                   MVT::i32);
@@ -2034,11 +2035,32 @@
                                 SVOffset, isVolatile, Alignment);
           break;
         } else if (CFP->getValueType(0) == MVT::f64) {
-          Tmp3 = DAG.getConstant(CFP->getValueAPF().convertToAPInt().
-                                   getZExtValue(), MVT::i64);
-          Result = DAG.getStore(Tmp1, Tmp3, Tmp2, ST->getSrcValue(),
-                                SVOffset, isVolatile, Alignment);
-          break;
+          // If this target supports 64-bit registers, do a single 64-bit store.
+          if (getTypeAction(MVT::i64) == Legal) {
+            Tmp3 = DAG.getConstant(CFP->getValueAPF().convertToAPInt().
+                                     getZExtValue(), MVT::i64);
+            Result = DAG.getStore(Tmp1, Tmp3, Tmp2, ST->getSrcValue(),
+                                  SVOffset, isVolatile, Alignment);
+            break;
+          } else if (getTypeAction(MVT::i32) == Legal) {
+            // Otherwise, if the target supports 32-bit registers, use 2 32-bit
+            // stores.  If the target supports neither 32- nor 64-bits, this
+            // xform is certainly not worth it.
+            uint64_t IntVal =CFP->getValueAPF().convertToAPInt().getZExtValue();
+            SDOperand Lo = DAG.getConstant(uint32_t(IntVal), MVT::i32);
+            SDOperand Hi = DAG.getConstant(uint32_t(IntVal >>32), MVT::i32);
+            if (!TLI.isLittleEndian()) std::swap(Lo, Hi);
+
+            Lo = DAG.getStore(Tmp1, Lo, Tmp2, ST->getSrcValue(),
+                              SVOffset, isVolatile, Alignment);
+            Tmp2 = DAG.getNode(ISD::ADD, Tmp2.getValueType(), Tmp2,
+                               getIntPtrConstant(4));
+            Hi = DAG.getStore(Tmp1, Hi, Tmp2, ST->getSrcValue(), SVOffset+4,
+                              isVolatile, std::max(Alignment, 4U));
+
+            Result = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo, Hi);
+            break;
+          }
         }
       }
       





More information about the llvm-commits mailing list