[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

Evan Cheng evan.cheng at apple.com
Tue Feb 14 01:12:12 PST 2006



Changes in directory llvm/lib/CodeGen/SelectionDAG:

SelectionDAGISel.cpp updated: 1.155 -> 1.156
---
Log message:

Fixed a build breakage.


---
Diffs of the changes:  (+23 -14)

 SelectionDAGISel.cpp |   37 +++++++++++++++++++++++--------------
 1 files changed, 23 insertions(+), 14 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.155 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.156
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.155	Tue Feb 14 02:38:30 2006
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp	Tue Feb 14 03:11:59 2006
@@ -1538,7 +1538,6 @@
       Val = (Val << Shift) | Val;
       Shift <<= 1;
       CurVT = (MVT::ValueType)((unsigned)CurVT - 1);
-      assert(MVT::isInteger(CurVT));
     }
     return DAG.getConstant(Val, VT);
   } else {
@@ -1551,7 +1550,6 @@
                                 DAG.getConstant(Shift, MVT::i8)), Value);
       Shift <<= 1;
       CurVT = (MVT::ValueType)((unsigned)CurVT - 1);
-      assert(MVT::isInteger(CurVT));
     }
 
     return Value;
@@ -1565,10 +1563,12 @@
   return DAG.getNode(ISD::ADD, VT, Base, DAG.getConstant(Offset, VT));
 }
 
-/// getMemOpTypes - Determines the types of the sequence of 
-/// memory ops to perform memset / memcpy.
-static void getMemOpTypes(std::vector<MVT::ValueType> &MemOps,
-                          uint64_t Size, unsigned Align, TargetLowering &TLI) {
+/// MeetMaxMemopRequirement - Determines if the number of memory ops required
+/// to replace the memset / memcpy is below the threshold. It also returns the
+/// types of the sequence of  memory ops to perform memset / memcpy.
+static bool MeetMaxMemopRequirement(std::vector<MVT::ValueType> &MemOps,
+                                    unsigned Limit,
+                                    uint64_t Size, unsigned Align, TargetLowering &TLI) {
   MVT::ValueType VT;
 
   if (TLI.allowsUnalignedMemoryAccesses()) {
@@ -1590,21 +1590,30 @@
     }
   }
 
-  while (!TLI.isTypeLegal(VT)) {
-    VT = (MVT::ValueType)((unsigned)VT - 1);
-    assert(MVT::isInteger(VT));
-  }
+  MVT::ValueType LVT = MVT::i64;
+  while (!TLI.isTypeLegal(LVT))
+    LVT = (MVT::ValueType)((unsigned)LVT - 1);
+  assert(MVT::isInteger(LVT));
 
+  if (VT > LVT)
+    VT = LVT;
+
+  unsigned NumMemOps;
   while (Size != 0) {
     unsigned VTSize = getSizeInBits(VT) / 8;
     while (VTSize > Size) {
       VT = (MVT::ValueType)((unsigned)VT - 1);
-      assert(MVT::isInteger(VT));
       VTSize >>= 1;
     }
+    assert(MVT::isInteger(VT));
+
+    if (++NumMemOps > Limit)
+      return false;
     MemOps.push_back(VT);
     Size -= VTSize;
   }
+
+  return true;
 }
 
 void SelectionDAGLowering::visitMemIntrinsic(CallInst &I, unsigned Op) {
@@ -1617,8 +1626,6 @@
 
   if (ConstantSDNode *Size = dyn_cast<ConstantSDNode>(Op3)) {
     std::vector<MVT::ValueType> MemOps;
-    getMemOpTypes(MemOps, Size->getValue(), Align, TLI);
-    unsigned NumMemOps = MemOps.size();
 
     // Expand memset / memcpy to a series of load / store ops
     // if the size operand falls below a certain threshold.
@@ -1626,7 +1633,9 @@
     switch (Op) {
     default: ;  // Do nothing for now.
     case ISD::MEMSET: {
-      if (NumMemOps <= TLI.getMaxStoresPerMemset()) {
+      if (MeetMaxMemopRequirement(MemOps, TLI.getMaxStoresPerMemset(),
+                                  Size->getValue(), Align, TLI)) {
+        unsigned NumMemOps = MemOps.size();
         unsigned Offset = 0;
         for (unsigned i = 0; i < NumMemOps; i++) {
           MVT::ValueType VT = MemOps[i];






More information about the llvm-commits mailing list