From 8090e8c18e7093fc3706a5a5d688143f3effe513 Mon Sep 17 00:00:00 2001
From: Chris Lattner <sabre@nondot.org>
Date: Mon, 26 Nov 2001 16:58:33 +0000
Subject: [PATCH] Support mutation of array indexing

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1341 91177308-0d34-0410-b5e6-96231b3b80d8
---
 lib/Transforms/IPO/MutateStructTypes.cpp | 36 ++++++++++++------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/lib/Transforms/IPO/MutateStructTypes.cpp b/lib/Transforms/IPO/MutateStructTypes.cpp
index 1904842359f..3e6d53fb3af 100644
--- a/lib/Transforms/IPO/MutateStructTypes.cpp
+++ b/lib/Transforms/IPO/MutateStructTypes.cpp
@@ -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
+  const CompositeType *NewCT = cast<CompositeType>(ConvertType(OldTy));
+  if (NewCT == 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());
+  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(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);
+    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)) {