[llvm] r174279 - use GEP::accumulateConstantOffset() to replace custom written code to compute GEP offset

Nuno Lopes nunoplopes at sapo.pt
Sun Feb 3 05:17:11 PST 2013


Author: nlopes
Date: Sun Feb  3 07:17:11 2013
New Revision: 174279

URL: http://llvm.org/viewvc/llvm-project?rev=174279&view=rev
Log:
use GEP::accumulateConstantOffset() to replace custom written code to compute GEP offset

Modified:
    llvm/trunk/lib/Analysis/ConstantFolding.cpp

Modified: llvm/trunk/lib/Analysis/ConstantFolding.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ConstantFolding.cpp?rev=174279&r1=174278&r2=174279&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ConstantFolding.cpp (original)
+++ llvm/trunk/lib/Analysis/ConstantFolding.cpp Sun Feb  3 07:17:11 2013
@@ -235,38 +235,13 @@ static bool IsConstantOffsetFromGlobal(C
     return IsConstantOffsetFromGlobal(CE->getOperand(0), GV, Offset, TD);
 
   // i32* getelementptr ([5 x i32]* @a, i32 0, i32 5)
-  if (CE->getOpcode() == Instruction::GetElementPtr) {
-    // Cannot compute this if the element type of the pointer is missing size
-    // info.
-    if (!cast<PointerType>(CE->getOperand(0)->getType())
-                 ->getElementType()->isSized())
-      return false;
-
+  if (GEPOperator *GEP = dyn_cast<GEPOperator>(CE)) {
     // If the base isn't a global+constant, we aren't either.
     if (!IsConstantOffsetFromGlobal(CE->getOperand(0), GV, Offset, TD))
       return false;
 
     // Otherwise, add any offset that our operands provide.
-    gep_type_iterator GTI = gep_type_begin(CE);
-    for (User::const_op_iterator i = CE->op_begin() + 1, e = CE->op_end();
-         i != e; ++i, ++GTI) {
-      ConstantInt *CI = dyn_cast<ConstantInt>(*i);
-      if (!CI) return false;  // Index isn't a simple constant?
-      if (CI->isZero()) continue;  // Not adding anything.
-
-      if (StructType *ST = dyn_cast<StructType>(*GTI)) {
-        // N = N + Offset
-        Offset +=
-            APInt(Offset.getBitWidth(),
-                  TD.getStructLayout(ST)->getElementOffset(CI->getZExtValue()));
-      } else {
-        SequentialType *SQT = cast<SequentialType>(*GTI);
-        Offset += APInt(Offset.getBitWidth(),
-                        TD.getTypeAllocSize(SQT->getElementType()) *
-                        CI->getSExtValue());
-      }
-    }
-    return true;
+    return GEP->accumulateConstantOffset(TD, Offset);
   }
 
   return false;





More information about the llvm-commits mailing list