Implement support for long GEP indices on 32-bit archs and support for
authorChris Lattner <sabre@nondot.org>
Fri, 7 Jan 2005 21:56:57 +0000 (21:56 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 7 Jan 2005 21:56:57 +0000 (21:56 +0000)
int GEP indices on 64-bit archs.

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

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index cbc2aabc478419e673015e3a947740fecd95a8e0..42f217a6741d9e0390beb898f2997e0f7686f840 100644 (file)
@@ -529,6 +529,7 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
     break;
   case ISD::ZERO_EXTEND:
   case ISD::SIGN_EXTEND:
+  case ISD::TRUNCATE:
   case ISD::FP_EXTEND:
   case ISD::FP_ROUND:
     switch (getTypeAction(Node->getOperand(0).getValueType())) {
index 4ba16f6d9820636f7dbffd83b616ae65fac5c107..167d2f7e3594dca05ce285d8edcc3e8c2b0e704f 100644 (file)
@@ -477,9 +477,20 @@ void SelectionDAGLowering::visitGetElementPtr(User &I) {
       if (!isa<Constant>(Idx) || !cast<Constant>(Idx)->isNullValue()) {
         // N = N + Idx * ElementSize;
         uint64_t ElementSize = TD.getTypeSize(Ty);
-        SDOperand IdxN = getValue(Idx);
-        IdxN = DAG.getNode(ISD::MUL, N.getValueType(), IdxN,
-                          getIntPtrConstant(ElementSize));
+        SDOperand IdxN = getValue(Idx), Scale = getIntPtrConstant(ElementSize);
+
+        // If the index is smaller or larger than intptr_t, truncate or extend
+        // it.
+        if (IdxN.getValueType() < Scale.getValueType()) {
+          if (Idx->getType()->isSigned())
+            IdxN = DAG.getNode(ISD::SIGN_EXTEND, Scale.getValueType(), IdxN);
+          else
+            IdxN = DAG.getNode(ISD::ZERO_EXTEND, Scale.getValueType(), IdxN);
+        } else if (IdxN.getValueType() > Scale.getValueType())
+          IdxN = DAG.getNode(ISD::TRUNCATE, Scale.getValueType(), IdxN);
+
+        IdxN = DAG.getNode(ISD::MUL, N.getValueType(), IdxN, Scale);
+                          
         N = DAG.getNode(ISD::ADD, N.getValueType(), N, IdxN);
       }
     }