[LLVMdev] (GEP) Index validity

Matthijs Kooijman matthijs at stdin.nl
Mon Jul 7 04:47:21 PDT 2008


Hi all,

I just found that TargetData also contains a similar assert, and that I forgot
a "return" in my previous patch.

Here's an updated patch, which allows to use any integer to index a
CompositeType. It seems this enables GEP to work with any integer value as
well, I tested indexing a struct with a i16 an i64 (also through llc). This
should still be adressed somewhere, unless we want to remove the i32 or i64
constraint from GEP.

Gr.

Matthijs

Index: lib/VMCore/Type.cpp
===================================================================
--- lib/VMCore/Type.cpp	(revision 53136)
+++ lib/VMCore/Type.cpp	(working copy)
@@ -394,9 +394,8 @@
 
 bool StructType::indexValid(const Value *V) const {
   // Structure indexes require 32-bit integer constants.
-  if (V->getType() == Type::Int32Ty)
-    if (const ConstantInt *CU = dyn_cast<ConstantInt>(V))
-      return indexValid(CU->getZExtValue());
+  if (const ConstantInt *CU = dyn_cast<ConstantInt>(V))
+    return indexValid(CU->getZExtValue());
   return false;
 }
 
@@ -1530,9 +1529,8 @@
 }
 
 bool SequentialType::indexValid(const Value *V) const {
-  if (const IntegerType *IT = dyn_cast<IntegerType>(V->getType())) 
-    return IT->getBitWidth() == 32 || IT->getBitWidth() == 64;
-  return false;
+  // Any integer value is allowed
+  return V->getType()->isInteger();
 }
 
 namespace llvm {
Index: lib/Target/TargetData.cpp
===================================================================
--- lib/Target/TargetData.cpp	(revision 53136)
+++ lib/Target/TargetData.cpp	(working copy)
@@ -553,8 +553,7 @@
     TI = gep_type_begin(ptrTy, Indices, Indices+NumIndices);
   for (unsigned CurIDX = 0; CurIDX != NumIndices; ++CurIDX, ++TI) {
     if (const StructType *STy = dyn_cast<StructType>(*TI)) {
-      assert(Indices[CurIDX]->getType() == Type::Int32Ty &&
-             "Illegal struct idx");
+      assert(isa<ConstantInt>(Indices[CurIDX]) && "Illegal struct idx");
       unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
 
       // Get structure layout information...
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20080707/e91dd8bc/attachment.sig>


More information about the llvm-dev mailing list