diff options
author | Chris Lattner <sabre@nondot.org> | 2004-04-05 01:30:19 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-04-05 01:30:19 +0000 |
commit | 28977af72a11fcad5d1b54d7a96b3df02828f6fc (patch) | |
tree | 671a8fa4df839cb653ebd22dda8fa39639b3afa7 /lib/Transforms/TransformInternals.cpp | |
parent | 830b6f98686f40f86811dceb5497433ebac385e1 (diff) |
Support getelementptr instructions which use uint's to index into structure
types and can have arbitrary 32- and 64-bit integer types indexing into
sequential types.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12653 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/TransformInternals.cpp')
-rw-r--r-- | lib/Transforms/TransformInternals.cpp | 110 |
1 files changed, 6 insertions, 104 deletions
diff --git a/lib/Transforms/TransformInternals.cpp b/lib/Transforms/TransformInternals.cpp index 9039f59095..971a58dfa0 100644 --- a/lib/Transforms/TransformInternals.cpp +++ b/lib/Transforms/TransformInternals.cpp @@ -35,8 +35,7 @@ static const Type *getStructOffsetStep(const StructType *STy, uint64_t &Offset, (i == SL->MemberOffsets.size()-1 || Offset < SL->MemberOffsets[i+1])); // Make sure to save the current index... - // FIXME for PR82 - Indices.push_back(ConstantUInt::get(Type::UByteTy, i)); + Indices.push_back(ConstantUInt::get(Type::UIntTy, i)); Offset = SL->MemberOffsets[i]; return STy->getContainedType(i); } @@ -75,8 +74,10 @@ const Type *llvm::getStructOffsetType(const Type *Ty, unsigned &Offset, NextType = ATy->getElementType(); unsigned ChildSize = TD.getTypeSize(NextType); - // FIXME for PR82 - Indices.push_back(ConstantSInt::get(Type::LongTy, Offset/ChildSize)); + if (ConstantSInt::isValueValidForType(Type::IntTy, Offset/ChildSize)) + Indices.push_back(ConstantSInt::get(Type::IntTy, Offset/ChildSize)); + else + Indices.push_back(ConstantSInt::get(Type::LongTy, Offset/ChildSize)); ThisOffset = (Offset/ChildSize)*ChildSize; } else { Offset = 0; // Return the offset that we were able to achieve @@ -99,105 +100,6 @@ const Type *llvm::ConvertibleToGEP(const Type *Ty, Value *OffsetVal, std::vector<Value*> &Indices, const TargetData &TD, BasicBlock::iterator *BI) { - const CompositeType *CompTy = dyn_cast<CompositeType>(Ty); - if (CompTy == 0) return 0; - - // See if the cast is of an integer expression that is either a constant, - // or a value scaled by some amount with a possible offset. - // - ExprType Expr = ClassifyExpr(OffsetVal); - - // Get the offset and scale values if they exists... - // A scale of zero with Expr.Var != 0 means a scale of 1. - // - int64_t Offset = Expr.Offset ? getConstantValue(Expr.Offset) : 0; - int64_t Scale = Expr.Scale ? getConstantValue(Expr.Scale) : 0; - - if (Expr.Var && Scale == 0) Scale = 1; // Scale != 0 if Expr.Var != 0 - - // Loop over the Scale and Offset values, filling in the Indices vector for - // our final getelementptr instruction. - // - const Type *NextTy = CompTy; - do { - if (!isa<CompositeType>(NextTy)) - return 0; // Type must not be ready for processing... - CompTy = cast<CompositeType>(NextTy); - - if (const StructType *StructTy = dyn_cast<StructType>(CompTy)) { - // Step into the appropriate element of the structure... - uint64_t ActualOffset = (Offset < 0) ? 0 : (uint64_t)Offset; - NextTy = getStructOffsetStep(StructTy, ActualOffset, Indices, TD); - Offset -= ActualOffset; - } else { - const Type *ElTy = cast<SequentialType>(CompTy)->getElementType(); - if (!ElTy->isSized() || (isa<PointerType>(CompTy) && !Indices.empty())) - return 0; // Type is unreasonable... escape! - unsigned ElSize = TD.getTypeSize(ElTy); - if (ElSize == 0) return 0; // Avoid division by zero... - int64_t ElSizeS = ElSize; - - // See if the user is indexing into a different cell of this array... - if (Scale && (Scale >= ElSizeS || -Scale >= ElSizeS)) { - // A scale n*ElSize might occur if we are not stepping through - // array by one. In this case, we will have to insert math to munge - // the index. - // - int64_t ScaleAmt = Scale/ElSizeS; - if (Scale-ScaleAmt*ElSizeS) - return 0; // Didn't scale by a multiple of element size, bail out - Scale = 0; // Scale is consumed - - int64_t Index = Offset/ElSize; // is zero unless Offset > ElSize - Offset -= Index*ElSize; // Consume part of the offset - - if (BI) { // Generate code? - BasicBlock *BB = (*BI)->getParent(); - if (Expr.Var->getType() != Type::LongTy) // FIXME for PR82 - Expr.Var = new CastInst(Expr.Var, Type::LongTy, // FIXME for PR82 - Expr.Var->getName()+"-idxcast", *BI); - - if (ScaleAmt && ScaleAmt != 1) { - // If we have to scale up our index, do so now - // FIXME for PR82 - Value *ScaleAmtVal = ConstantSInt::get(Type::LongTy, ScaleAmt); - Expr.Var = BinaryOperator::create(Instruction::Mul, Expr.Var, - ScaleAmtVal, - Expr.Var->getName()+"-scale",*BI); - } - - if (Index) { // Add an offset to the index - // FIXME for PR82 - Value *IndexAmt = ConstantSInt::get(Type::LongTy, Index); - Expr.Var = BinaryOperator::create(Instruction::Add, Expr.Var, - IndexAmt, - Expr.Var->getName()+"-offset", - *BI); - } - } - - Indices.push_back(Expr.Var); - Expr.Var = 0; - } else if (Offset >= (int64_t)ElSize || -Offset >= (int64_t)ElSize) { - // Calculate the index that we are entering into the array cell with - uint64_t Index = Offset/ElSize; - // FIXME for PR82 - Indices.push_back(ConstantSInt::get(Type::LongTy, Index)); - Offset -= (int64_t)(Index*ElSize); // Consume part of the offset - - } else if (isa<ArrayType>(CompTy) || Indices.empty()) { - // Must be indexing a small amount into the first cell of the array - // Just index into element zero of the array here. - // - // FIXME for PR82 - Indices.push_back(ConstantSInt::get(Type::LongTy, 0)); - } else { - return 0; // Hrm. wierd, can't handle this case. Bail - } - NextTy = ElTy; - } - } while (Offset || Scale); // Go until we're done! - - return NextTy; + return 0; } |