From e03f32bcc2cdb2b6140342539ec720464b01c21e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 2 Oct 2002 06:24:36 +0000 Subject: [PATCH] * Implement fully general merging of array subscripts on demand! This does not handle the initial pointer index case yet though. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4012 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/DataStructure/Local.cpp | 30 +++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/lib/Analysis/DataStructure/Local.cpp b/lib/Analysis/DataStructure/Local.cpp index 509825172ed..d1c24a699e2 100644 --- a/lib/Analysis/DataStructure/Local.cpp +++ b/lib/Analysis/DataStructure/Local.cpp @@ -283,10 +283,34 @@ void GraphBuilder::visitGetElementPtrInst(GetElementPtrInst &GEP) { for (unsigned i = 1, e = GEP.getNumOperands(); i != e; ++i) if (GEP.getOperand(i)->getType() == Type::LongTy) { - if (GEP.getOperand(i) != Constant::getNullValue(Type::LongTy)) { - std::cerr << "Array indexing not handled yet!\n"; + // Get the type indexing into... + const SequentialType *STy = cast(CurTy); + CurTy = STy->getElementType(); + if (ConstantSInt *CS = dyn_cast(GEP.getOperand(i))) { + if (isa(STy)) + std::cerr << "Pointer indexing not handled yet!\n"; + else + Offset += CS->getValue()*TD.getTypeSize(CurTy); + } else { + // Variable index into a node. We must merge all of the elements of the + // sequential type here. + if (isa(STy)) + std::cerr << "Pointer indexing not handled yet!\n"; + else { + const ArrayType *ATy = cast(STy); + unsigned ElSize = TD.getTypeSize(CurTy); + DSNode *N = Value.getNode(); + assert(N && "Value must have a node!"); + unsigned RawOffset = Offset+Value.getOffset(); + + // Loop over all of the elements of the array, merging them into the + // zero'th element. + for (unsigned i = 1, e = ATy->getNumElements(); i != e; ++i) + // Merge all of the byte components of this array element + for (unsigned j = 0; j != ElSize; ++j) + N->mergeIndexes(RawOffset+j, RawOffset+i*ElSize+j); + } } - CurTy = cast(CurTy)->getElementType(); } else if (GEP.getOperand(i)->getType() == Type::UByteTy) { unsigned FieldNo = cast(GEP.getOperand(i))->getValue(); const StructType *STy = cast(CurTy);