[llvm-commits] [llvm] r48894 - in /llvm/trunk: include/llvm/CodeGen/SelectionDAG.h lib/CodeGen/SelectionDAG/LegalizeTypes.h lib/CodeGen/SelectionDAG/LegalizeTypesFloatToInt.cpp lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Duncan Sands baldrick at free.fr
Thu Mar 27 13:23:41 PDT 2008


Author: baldrick
Date: Thu Mar 27 15:23:40 2008
New Revision: 48894

URL: http://llvm.org/viewvc/llvm-project?rev=48894&view=rev
Log:
Implement LegalizeTypes support for softfloat LOAD.
In order to handle indexed nodes I had to introduce
a new constructor, and since I was there I factorized
the code in the various load constructors.

Modified:
    llvm/trunk/include/llvm/CodeGen/SelectionDAG.h
    llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h
    llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypesFloatToInt.cpp
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAG.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAG.h?rev=48894&r1=48893&r2=48894&view=diff

==============================================================================
--- llvm/trunk/include/llvm/CodeGen/SelectionDAG.h (original)
+++ llvm/trunk/include/llvm/CodeGen/SelectionDAG.h Thu Mar 27 15:23:40 2008
@@ -379,6 +379,11 @@
                        unsigned Alignment=0);
   SDOperand getIndexedLoad(SDOperand OrigLoad, SDOperand Base,
                            SDOperand Offset, ISD::MemIndexedMode AM);
+  SDOperand getAnyLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
+                       MVT::ValueType VT, SDOperand Chain,
+                       SDOperand Ptr, SDOperand Offset,
+                       const Value *SV, int SVOffset, MVT::ValueType EVT,
+                       bool isVolatile=false, unsigned Alignment=0);
 
   /// getStore - Helper function to build ISD::STORE nodes.
   ///

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h?rev=48894&r1=48893&r2=48894&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h Thu Mar 27 15:23:40 2008
@@ -310,6 +310,7 @@
   SDOperand FloatToIntRes_BIT_CONVERT(SDNode *N);
   SDOperand FloatToIntRes_BUILD_PAIR(SDNode *N);
   SDOperand FloatToIntRes_FCOPYSIGN(SDNode *N);
+  SDOperand FloatToIntRes_LOAD(SDNode *N);
 
   // Operand Float to Integer Conversion.
   bool FloatToIntOperand(SDNode *N, unsigned OpNo);

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

==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypesFloatToInt.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypesFloatToInt.cpp Thu Mar 27 15:23:40 2008
@@ -53,6 +53,7 @@
     case ISD::BIT_CONVERT: R = FloatToIntRes_BIT_CONVERT(N); break;
     case ISD::BUILD_PAIR:  R = FloatToIntRes_BUILD_PAIR(N); break;
     case ISD::FCOPYSIGN:   R = FloatToIntRes_FCOPYSIGN(N); break;
+    case ISD::LOAD:        R = FloatToIntRes_LOAD(N); break;
   }
 
   // If R is null, the sub-method took care of registering the result.
@@ -111,6 +112,16 @@
   return DAG.getNode(ISD::OR, LVT, LHS, SignBit);
 }
 
+SDOperand DAGTypeLegalizer::FloatToIntRes_LOAD(SDNode *N) {
+  MVT::ValueType NVT = TLI.getTypeToTransformTo(N->getValueType(0));
+  LoadSDNode *L = cast<LoadSDNode>(N);
+
+  return DAG.getAnyLoad(L->getAddressingMode(), L->getExtensionType(),
+                        NVT, L->getChain(), L->getBasePtr(), L->getOffset(),
+                        L->getSrcValue(), L->getSrcValueOffset(),
+                        L->getMemoryVT(), L->isVolatile(), L->getAlignment());
+}
+
 
 //===----------------------------------------------------------------------===//
 //  Operand Float to Integer Conversion..

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

==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Mar 27 15:23:40 2008
@@ -2447,10 +2447,12 @@
   return SDOperand(N, 0);
 }
 
-SDOperand SelectionDAG::getLoad(MVT::ValueType VT,
-                                SDOperand Chain, SDOperand Ptr,
-                                const Value *SV, int SVOffset,
-                                bool isVolatile, unsigned Alignment) {
+SDOperand
+SelectionDAG::getAnyLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
+                         MVT::ValueType VT, SDOperand Chain,
+                         SDOperand Ptr, SDOperand Offset,
+                         const Value *SV, int SVOffset, MVT::ValueType EVT,
+                         bool isVolatile, unsigned Alignment) {
   if (Alignment == 0) { // Ensure that codegen never sees alignment 0
     const Type *Ty = 0;
     if (VT != MVT::iPTR) {
@@ -2459,81 +2461,69 @@
       const PointerType *PT = dyn_cast<PointerType>(SV->getType());
       assert(PT && "Value for load must be a pointer");
       Ty = PT->getElementType();
-    }  
+    }
     assert(Ty && "Could not get type information for load");
     Alignment = TLI.getTargetData()->getABITypeAlignment(Ty);
   }
-  SDVTList VTs = getVTList(VT, MVT::Other);
-  SDOperand Undef = getNode(ISD::UNDEF, Ptr.getValueType());
-  SDOperand Ops[] = { Chain, Ptr, Undef };
+
+  if (VT == EVT) {
+    ExtType = ISD::NON_EXTLOAD;
+  } else if (ExtType == ISD::NON_EXTLOAD) {
+    assert(VT == EVT && "Non-extending load from different memory type!");
+  } else {
+    // Extending load.
+    if (MVT::isVector(VT))
+      assert(EVT == MVT::getVectorElementType(VT) && "Invalid vector extload!");
+    else
+      assert(MVT::getSizeInBits(EVT) < MVT::getSizeInBits(VT) &&
+             "Should only be an extending load, not truncating!");
+    assert((ExtType == ISD::EXTLOAD || MVT::isInteger(VT)) &&
+           "Cannot sign/zero extend a FP/Vector load!");
+    assert(MVT::isInteger(VT) == MVT::isInteger(EVT) &&
+           "Cannot convert from FP to Int or Int -> FP!");
+  }
+
+  bool Indexed = AM != ISD::UNINDEXED;
+  assert(Indexed || Offset.getOpcode() == ISD::UNDEF &&
+         "Unindexed load with an offset!");
+
+  SDVTList VTs = Indexed ?
+    getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
+  SDOperand Ops[] = { Chain, Ptr, Offset };
   FoldingSetNodeID ID;
   AddNodeIDNode(ID, ISD::LOAD, VTs, Ops, 3);
-  ID.AddInteger(ISD::UNINDEXED);
-  ID.AddInteger(ISD::NON_EXTLOAD);
-  ID.AddInteger((unsigned int)VT);
+  ID.AddInteger(AM);
+  ID.AddInteger(ExtType);
+  ID.AddInteger((unsigned int)EVT);
   ID.AddInteger(Alignment);
   ID.AddInteger(isVolatile);
   void *IP = 0;
   if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
     return SDOperand(E, 0);
-  SDNode *N = new LoadSDNode(Ops, VTs, ISD::UNINDEXED,
-                             ISD::NON_EXTLOAD, VT, SV, SVOffset, Alignment,
-                             isVolatile);
+  SDNode *N = new LoadSDNode(Ops, VTs, AM, ExtType, EVT, SV, SVOffset,
+                             Alignment, isVolatile);
   CSEMap.InsertNode(N, IP);
   AllNodes.push_back(N);
   return SDOperand(N, 0);
 }
 
+SDOperand SelectionDAG::getLoad(MVT::ValueType VT,
+                                SDOperand Chain, SDOperand Ptr,
+                                const Value *SV, int SVOffset,
+                                bool isVolatile, unsigned Alignment) {
+  SDOperand Undef = getNode(ISD::UNDEF, Ptr.getValueType());
+  return getAnyLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, Chain, Ptr, Undef,
+                    SV, SVOffset, VT, isVolatile, Alignment);
+}
+
 SDOperand SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, MVT::ValueType VT,
                                    SDOperand Chain, SDOperand Ptr,
                                    const Value *SV,
                                    int SVOffset, MVT::ValueType EVT,
                                    bool isVolatile, unsigned Alignment) {
-  // If they are asking for an extending load from/to the same thing, return a
-  // normal load.
-  if (VT == EVT)
-    return getLoad(VT, Chain, Ptr, SV, SVOffset, isVolatile, Alignment);
-
-  if (MVT::isVector(VT))
-    assert(EVT == MVT::getVectorElementType(VT) && "Invalid vector extload!");
-  else
-    assert(MVT::getSizeInBits(EVT) < MVT::getSizeInBits(VT) &&
-           "Should only be an extending load, not truncating!");
-  assert((ExtType == ISD::EXTLOAD || MVT::isInteger(VT)) &&
-         "Cannot sign/zero extend a FP/Vector load!");
-  assert(MVT::isInteger(VT) == MVT::isInteger(EVT) &&
-         "Cannot convert from FP to Int or Int -> FP!");
-
-  if (Alignment == 0) { // Ensure that codegen never sees alignment 0
-    const Type *Ty = 0;
-    if (VT != MVT::iPTR) {
-      Ty = MVT::getTypeForValueType(VT);
-    } else if (SV) {
-      const PointerType *PT = dyn_cast<PointerType>(SV->getType());
-      assert(PT && "Value for load must be a pointer");
-      Ty = PT->getElementType();
-    }  
-    assert(Ty && "Could not get type information for load");
-    Alignment = TLI.getTargetData()->getABITypeAlignment(Ty);
-  }
-  SDVTList VTs = getVTList(VT, MVT::Other);
   SDOperand Undef = getNode(ISD::UNDEF, Ptr.getValueType());
-  SDOperand Ops[] = { Chain, Ptr, Undef };
-  FoldingSetNodeID ID;
-  AddNodeIDNode(ID, ISD::LOAD, VTs, Ops, 3);
-  ID.AddInteger(ISD::UNINDEXED);
-  ID.AddInteger(ExtType);
-  ID.AddInteger((unsigned int)EVT);
-  ID.AddInteger(Alignment);
-  ID.AddInteger(isVolatile);
-  void *IP = 0;
-  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
-    return SDOperand(E, 0);
-  SDNode *N = new LoadSDNode(Ops, VTs, ISD::UNINDEXED, ExtType, EVT,
-                             SV, SVOffset, Alignment, isVolatile);
-  CSEMap.InsertNode(N, IP);
-  AllNodes.push_back(N);
-  return SDOperand(N, 0);
+  return getAnyLoad(ISD::UNINDEXED, ExtType, VT, Chain, Ptr, Undef,
+                    SV, SVOffset, EVT, isVolatile, Alignment);
 }
 
 SDOperand
@@ -2542,26 +2532,10 @@
   LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
   assert(LD->getOffset().getOpcode() == ISD::UNDEF &&
          "Load is already a indexed load!");
-  MVT::ValueType VT = OrigLoad.getValueType();
-  SDVTList VTs = getVTList(VT, Base.getValueType(), MVT::Other);
-  SDOperand Ops[] = { LD->getChain(), Base, Offset };
-  FoldingSetNodeID ID;
-  AddNodeIDNode(ID, ISD::LOAD, VTs, Ops, 3);
-  ID.AddInteger(AM);
-  ID.AddInteger(LD->getExtensionType());
-  ID.AddInteger((unsigned int)(LD->getMemoryVT()));
-  ID.AddInteger(LD->getAlignment());
-  ID.AddInteger(LD->isVolatile());
-  void *IP = 0;
-  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
-    return SDOperand(E, 0);
-  SDNode *N = new LoadSDNode(Ops, VTs, AM,
-                             LD->getExtensionType(), LD->getMemoryVT(),
-                             LD->getSrcValue(), LD->getSrcValueOffset(),
-                             LD->getAlignment(), LD->isVolatile());
-  CSEMap.InsertNode(N, IP);
-  AllNodes.push_back(N);
-  return SDOperand(N, 0);
+  return getAnyLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(),
+                    LD->getChain(), Base, Offset, LD->getSrcValue(),
+                    LD->getSrcValueOffset(), LD->getMemoryVT(),
+                    LD->isVolatile(), LD->getAlignment());
 }
 
 SDOperand SelectionDAG::getStore(SDOperand Chain, SDOperand Val,





More information about the llvm-commits mailing list