Support mutation of array indexing
authorChris Lattner <sabre@nondot.org>
Mon, 26 Nov 2001 16:58:33 +0000 (16:58 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 26 Nov 2001 16:58:33 +0000 (16:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1341 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/MutateStructTypes.cpp

index 1904842359f3193df2b86b6f58f1c23bd0a2d32a..3e6d53fb3afc18864b9aa1c5e1864d8899ff2234 100644 (file)
@@ -105,29 +105,30 @@ const Type *MutateStructTypes::ConvertType(const Type *Ty) {
 // AdjustIndices - Convert the indexes specifed by Idx to the new changed form
 // using the specified OldTy as the base type being indexed into.
 //
-void MutateStructTypes::AdjustIndices(const StructType *OldTy,
-                                      vector<ConstPoolVal*> &Idx,
+void MutateStructTypes::AdjustIndices(const CompositeType *OldTy,
+                                      vector<Value*> &Idx,
                                       unsigned i = 0) {
   assert(i < Idx.size() && "i out of range!");
-  const StructType *NewST = cast<StructType>(ConvertType(OldTy));
-  if (NewST == OldTy) return;  // No adjustment unless type changes
-
-  // Figure out what the current index is...
-  unsigned ElNum = cast<ConstPoolUInt>(Idx[i])->getValue();
-  assert(ElNum < OldTy->getElementTypes().size());
-
-  map<const StructType*, TransformType>::iterator I = Transforms.find(OldTy);
-  if (I != Transforms.end()) {
-    assert(ElNum < I->second.second.size());
-    // Apply the XForm specified by Transforms map...
-    unsigned NewElNum = I->second.second[ElNum];
-    Idx[i] = ConstPoolUInt::get(Type::UByteTy, NewElNum);
+  const CompositeType *NewCT = cast<CompositeType>(ConvertType(OldTy));
+  if (NewCT == OldTy) return;  // No adjustment unless type changes
+
+  if (const StructType *OldST = dyn_cast<StructType>(OldTy)) {
+    // Figure out what the current index is...
+    unsigned ElNum = cast<ConstPoolUInt>(Idx[i])->getValue();
+    assert(ElNum < OldST->getElementTypes().size());
+
+    map<const StructType*, TransformType>::iterator I = Transforms.find(OldST);
+    if (I != Transforms.end()) {
+      assert(ElNum < I->second.second.size());
+      // Apply the XForm specified by Transforms map...
+      unsigned NewElNum = I->second.second[ElNum];
+      Idx[i] = ConstPoolUInt::get(Type::UByteTy, NewElNum);
+    }
   }
 
   // Recursively process subtypes...
   if (i+1 < Idx.size())
-    AdjustIndices(cast<StructType>(OldTy->getElementTypes()[ElNum].get()),
-                  Idx, i+1);
+    AdjustIndices(cast<CompositeType>(OldTy->getTypeAtIndex(Idx[i])), Idx, i+1);
 }
 
 
@@ -290,7 +291,6 @@ bool MutateStructTypes::doPassFinalization(Module *M) {
   // The first half of the methods in the module have to go.
   unsigned NumMethods = M->size();
   unsigned NumGVars   = M->gsize();
-  assert((NumMethods & 1) == 0 && "Number of methods is odd!");
 
   // Prepare for deletion of globals by dropping their interdependencies...
   for(Module::iterator I = M->begin(); I != M->end(); ++I) {
@@ -426,12 +426,12 @@ bool MutateStructTypes::doPerMethodWork(Method *m) {
       case Instruction::Store:
       case Instruction::GetElementPtr: {
         const MemAccessInst *MAI = cast<MemAccessInst>(I);
-        vector<ConstPoolVal*> Indices = MAI->getIndices();
+        vector<Value*> Indices(MAI->idx_begin(), MAI->idx_end());
         const Value *Ptr = MAI->getPointerOperand();
         Value *NewPtr = ConvertValue(Ptr);
         if (!Indices.empty()) {
           const Type *PTy = cast<PointerType>(Ptr->getType())->getValueType();
-          AdjustIndices(cast<StructType>(PTy), Indices);
+          AdjustIndices(cast<CompositeType>(PTy), Indices);
         }
 
         if (const LoadInst *LI = dyn_cast<LoadInst>(I)) {